Seite 1 von 1
w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP 5.4
Verfasst: Mi 8. Mai 2013, 19:30
von Freddy
Hallo Zusammen,
habe das Modul w3concepts.form.v1 im Einsatz und jetzt wurde auf die PHP Version 5.4.11 umgestellt und das Modul funktioniert nicht mehr. Beim Anklicken des Moduls kommt die Fehlermeldung
Code: Alles auswählen
Fatal error: Call-time pass-by-reference has been removed in /.../contenido/includes/functions.mod.php(164) : eval()'d code on line 128
Benutze: Contenido 4.8.18
Kann mir jemand da weiter helfen?
Das Modul ist hier im Forum zu finden:
http://forum.contenido.org/viewtopic.ph ... ts.form.v1
Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP
Verfasst: Do 9. Mai 2013, 14:01
von xmurrix
Du darfst beim Aufruf der Funktionen die Parameter nicht als Referenz übergeben.
Falsch:
Richtig:
Falsch:
Code: Alles auswählen
if (!$this->formularFeldKorrekt(&$feld)) return false;
Richtig:
Code: Alles auswählen
if (!$this->formularFeldKorrekt($feld)) return false;
Falsch:
Code: Alles auswählen
$formulardaten = $this->formularInterpretation(&$formular);
Richtig:
Code: Alles auswählen
$formulardaten = $this->formularInterpretation($formular);
Falsch:
Code: Alles auswählen
if ($sent && !$this->formularFeldKorrekt(&$attribute)) $style ="style=\"background-color:{$this->form['colorError']};\"";
Richtig:
Code: Alles auswählen
if ($sent && !$this->formularFeldKorrekt($attribute)) $style ="style=\"background-color:{$this->form['colorError']};\"";
Gruß
xmurrix
Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP
Verfasst: Fr 23. Aug 2013, 20:06
von so2
Hallo Murrix
Ich hatte das Formular jahrelang problemlos im Einsatz, aber jetzt habe ich dasselbe Problem. Ich habe das Modul gemäss deiner Anleitung angepasst aber kriege es trotzdem nicht zum Laufen.
Wäre es dir möglich, den kompletten Eingabe und Ausgabe Code des Moduls hier zu veröffentlichen?
Danke vielmal!
Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP
Verfasst: Sa 24. Aug 2013, 09:38
von xmurrix
Hallo so2,
hier die angepasste Version des Moduls. Als Vorlage habe ich den Code aus
http://forum.contenido.org/viewtopic.php?t=5066 übernommen.
Diese Version Funktioniert unter CONTENIDO 4.8 und unter PHP 5.3/5.4.
Moduleingabe
Code: Alles auswählen
?><?php
/**************************************************
* CONTENIDO MODULE - INPUT
*
* Modulname : w3concepts.form.v1
* Author : Andreas Kummer
* Copyright : mumprecht & kummer w3concepts
* Created : 20-08-2004
* Modified : 20-08-2004
* Modified : 24-08-2013, Murat Purc, adapted to newer CONTENIDO (4.8) version
*************************************************/
echo "
<table cellspacing='0' cellpadding='10' border='0'>
<tr>
<td>" . mi18n("Zieladresse (alias@mydomain.com):") . "</td>
<td><input type='text' name=\"CMS_VAR[0]\" value=\"CMS_VALUE[0]\" size='30' /></td>
</tr>
<tr>
<td>" . mi18n("Betreff:") . "</td>
<td><input type='text' name=\"CMS_VAR[1]\" value=\"CMS_VALUE[1]\" size='30' /></td>
</tr>
<tr>
<td>" . mi18n("Antwortadresse (alias@mydomain.com):") . "</td>
<td><input type='text' name=\"CMS_VAR[2]\" value=\"CMS_VALUE[2]\" size='30' /></td>
</tr>
<tr>
<td>" . mi18n("Emailname (z.B. Vorname Name):") . "</td>
<td><input type='text' name=\"CMS_VAR[3]\" value=\"CMS_VALUE[3]\" size='30' /></td>
</tr>
<tr>
<td>" . mi18n("Hintergrundfarbe bei Fehlern (z.B. red):") . "</td>
<td><input type='text' name=\"CMS_VAR[4]\" value=\"CMS_VALUE[4]\" size='30' /></td>
</tr>
</table>
";
Modulausgabe
Code: Alles auswählen
<?php
/**************************************************
* CONTENIDO MODULE - OUTPUT
*
* Modulname : w3concepts.form.v1
* Author : Andreas Kummer
* Copyright : mumprecht & kummer w3concepts
* Created : 20-08-2004
* Modified : 20-08-2004
* Modified : 24-08-2013, Murat Purc, adapted to newer CONTENIDO (4.8) and PHP (5.3/5.4) versions
*************************************************/
class w3form {
private $email;
private $unraveled = array();
private $form;
private $formField = array();
public function __construct() {
$this->email = array(
'adresses' => '',
'from' => array(
'name' => '',
'email' => ''
),
'message' => '',
'subject' => ''
);
$this->form = array(
'form' => '',
'answer' => '',
'colorError' => ''
);
}
private function sendEmail() {
$this->unravel($this->suppress('sent'));
$this->generateEmailMessage();
mail(
$this->email['adresses'],
$this->email['subject'],
$this->email['message'],
sprintf(
"From: %s <%s>\nReply-To: %s\nX-Mailer: PHP/%s",
$this->email['from']['name'],
$this->email['from']['email'],
$this->email['from']['email'],
phpversion()
)
);
}
private function unravel($toUnravel, $prefix = '') {
foreach ($toUnravel as $key => $value) {
if (is_array($value)) {
$this->unravel($value, $key . ' ');
} else {
$this->unraveled["{$prefix}{$key}"] = $value;
}
}
}
private function add2Message($key, $value) {
if (strlen($key) > 25 OR strlen($value) > 54) {
$this->email['message'] .= "$key\n$value\n";
} else {
$this->email['message'] .= $key;
$this->email['message'] .= str_repeat(' ', 25 - strlen($key));
$this->email['message'] .= "$value\n";
}
}
private function generateEmailMessage() {
if ($this->unraveled)
foreach ($this->unraveled as $key => $value) {
$this->add2Message($key, $value);
}
}
private function suppress() {
$suppress = func_get_args();
foreach ($_POST as $key => $value) {
if (array_search($key, $suppress) === false)
$fields[$key] = $value;
}
return $fields;
}
public function addEmailAdress($email) {
if (empty($this->emailAdresses)) {
$this->email['adresses'] .= "$email";
} else {
$this->email['adresses'] .= ", $email";
}
}
public function setEmailSubject($subject) {
$this->email['subject'] = $subject;
}
public function setEmailFrom($email, $name) {
$this->email['from']['email'] = $email;
$this->email['from']['name'] = $name;
}
public function setForm($form) {
$this->form['form'] = $form;
}
public function setAnswer($answer) {
$this->form['answer'] = $answer;
}
public function setBackgroundError($color) {
$this->form['colorError'] = $color;
}
public function formInterpretation(&$form) {
$fields = explode('###', $form);
$field = array();
for ($i = 1; $i < count($fields); $i = $i + 2) {
$attributte = explode(';', trim($fields[$i]));
foreach ($attributte as $attribute) {
$nameValue = explode(':', trim($attribute));
if ($nameValue[0] != 'option' && $nameValue[0] != 'optionvalue') {
$field["{$fields[$i]}"]["{$nameValue[0]}"] = $nameValue[1];
} else {
$field["{$fields[$i]}"]["{$nameValue[0]}"][] = $nameValue[1];
}
}
}
return $field;
}
public function formOutput($sent = false) {
echo '<form action="" method="POST">';
echo '<input type="hidden" name="sent" value="true" />';
$form = $this->form['form'];
$formData = $this->formInterpretation($form);
$form = explode('###', $form);
foreach ($form as $item) {
if (!empty($formData["{$item}"])) {
$this->formField($formData["{$item}"], $sent);
} else {
echo $item;
}
}
echo '</form>';
}
public function formField($attribute, $sent) {
$parameter = "name=\"{$attribute['name']}\"";
if ($sent && !$this->formFieldCorrect($attribute))
$style = "style=\"background-color:{$this->form['colorError']};\"";
switch ($attribute['type']) {
case 'select':
case 'password':
case 'text':
if (!empty($attribute['size']))
$parameter .= " size=\"{$attribute['size']}\"";
break;
}
switch ($attribute['type']) {
case 'textarea':
case 'text':
if (!empty($attribute['size']))
$parameter .= " size=\"{$attribute['size']}\"";
if (!empty($attribute['value']))
$value = $attribute['value'];
if (!empty($_POST["{$attribute['name']}"]))
$value = $_POST["{$attribute['name']}"];
break;
}
switch ($attribute['type']) {
case 'text':
echo "<input type=\"text\" $parameter value=\"$value\" $style />";
break;
case 'password':
echo "<input type=\"password\" $parameter value=\"$value\" $style />";
break;
case 'textarea':
echo "<textarea name=\"{$attribute['name']}\" cols=\"";
echo (empty($attribute['cols'])) ? ('20') : ($attribute['cols']);
echo "\" rows=\"";
echo (empty($attribute['rows'])) ? ('2') : ($attribute['rows']);
echo "\" wrap=\"virtual\" $style>$value</textarea>";
break;
case 'select':
echo "<select $parameter $style>";
for ($i = 0; $i < count($attribute['option']); $i++) {
if (!empty($attribute['optionvalue'][$i])) {
if (!empty($_POST["{$attribute['name']}"]) && $_POST["{$attribute['name']}"] == $attribute['optionvalue'][$i]) {
echo "<option value=\"{$attribute['optionvalue'][$i]}\" selected=\"selected\">{$attribute['option'][$i]}</option>\n";
} else {
if (empty($_POST["{$attribute['name']}"]) && !empty($attribute['optionvalue'][$i]) && $attribute['optionvalue'][$i] == $attribute['value']) {
echo "<option value=\"{$attribute['optionvalue'][$i]}\" selected=\"selected\">{$attribute['option'][$i]}</option>\n";
} else {
echo "<option value=\"{$attribute['optionvalue'][$i]}\">{$attribute['option'][$i]}</option>\n";
}
}
} else {
if (!empty($_POST["{$attribute['name']}"]) && $_POST["{$attribute['name']}"] == $attribute['option'][$i]) {
echo "<option selected=\"selected\">{$attribute['option'][$i]}</option>\n";
} else {
if (empty($_POST["{$attribute['name']}"]) && $attribute['option'][$i] == $attribute['value']) {
echo "<option selected=\"selected\">{$attribute['option'][$i]}</option>\n";
} else {
echo "<option>{$attribute['option'][$i]}</option>\n";
}
}
}
}
echo "</select>";
break;
case 'checkbox':
$formId = preg_split('[\[|\]]', $attribute['name']);
if ($sent) {
if ($_POST["{$formId[0]}"]["{$formId[1]}"] == $attribute['value']) {
echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
} else {
echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>";
}
} else {
if (!empty($attribute['selected']) && $attribute['selected'] == 'true') {
echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
} else {
echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>";
}
}
break;
case 'radio':
if (!empty($_POST["{$attribute['name']}"])) {
if ($_POST["{$attribute['name']}"] == $attribute['value']) {
echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
} else {
echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" />";
}
} else {
if (!empty($attribute['selected']) && $attribute['selected'] == 'true') {
echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
} else {
echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\"/>";
}
}
break;
}
}
private function formComplete() {
$form = $this->form['form'];
$fields = $this->formInterpretation($form);
foreach ($fields as $field) {
if (!$this->formFieldCorrect($field)) {
return false;
}
}
return true;
}
private function success() {
$this->sendEmail();
echo $this->form['answer'];
}
private function formFieldCorrect(&$field) {
// prüfung, ob pflichtfeld vorhanden
if (!empty($field['mandatory']) && $field['mandatory'] == 'true' && empty($_POST["{$field['name']}"]))
return false;
// wenn das formularfeld kein pflichtfeld und nicht vorhanden ist, true zurück geben
if (empty($_POST["{$field['name']}"]))
return true;
// regular expression prüfungen
if (!empty($field['valid']) && $field['valid'] == 'simpletext' && !preg_match("/^[öäüéàèâêîça-z-]*$/i", $_POST["{$field['name']}"]))
return false;
if (!empty($field['valid']) && $field['valid'] == 'text' && !preg_match("/^[ .,;!?()öäüéàèâêîça-z-]*$/i", $_POST["{$field['name']}"]))
return false;
if (!empty($field['valid']) && $field['valid'] == 'integer' && !preg_match("/^[0-9]*$/", $_POST["{$field['name']}"]))
return false;
if (!empty($field['valid']) && $field['valid'] == 'float' && !preg_match("/^[0-9]*[.]{0,1}[0-9]*$/", $_POST["{$field['name']}"]))
return false;
if (!empty($field['valid']) && $field['valid'] == 'date' && !preg_match("/^[0-9]{1,2}.[0-9]{1,2}.[0-9]{2}$/", $_POST["{$field['name']}"]))
return false;
if (!empty($field['valid']) && $field['valid'] == 'email' && !preg_match("/^[öäüéàèâêîç_a-z0-9-]+(\.[öäüéàèâêîç_a-z0-9-]+)*@[öäüéàèâêîça-z0-9-]+(\.[öäüéàèâêîça-z0-9-]+)*$/i", $_POST["{$field['name']}"]))
return false;
// grössenbereich bei integer und float prüfen
if (!empty($field['minvalue']) && $_POST["{$field['name']}"] < $field['minvalue'])
return false;
if (!empty($field['maxvalue']) && $_POST["{$field['name']}"] > $field['maxvalue'])
return false;
// längenbereich bei allen typen prüfen
if (!empty($field['minlength']) && strlen($_POST["{$field['name']}"]) < $field['minlength'])
return false;
if (!empty($field['maxlength']) && strlen($_POST["{$field['name']}"]) > $field['maxlength'])
return false;
return true;
}
public function process() {
if (!isset($_POST['sent'])) {
$this->formOutput();
} elseif ($this->formComplete()) {
$this->success();
} else {
$this->formOutput(true);
}
}
}
if (isset($edit) && $edit) {
echo "<h1>" . mi18n("Formularkonfiguration") . "</h1>";
echo "<p>" . mi18n("Hier ist das Formular sowie der Text einzugeben, der zusammen mit dem Formular ausgegeben werden soll:") . "</p>";
echo "CMS_HTML[0]";
echo "<p>" . mi18n("Hier ist die Ausgabe einzugeben, die erscheint, wenn das Formular erfolgreich prozessiert worden ist:") . "</p>";
echo "CMS_HTML[1]";
} else {
$form = new w3form();
$form->addEmailAdress("CMS_VALUE[0]");
$form->setEmailSubject("CMS_VALUE[1]");
$form->setEmailFrom("CMS_VALUE[2]", "CMS_VALUE[3]");
$form->setBackgroundError("CMS_VALUE[4]");
$form->setForm("CMS_HTML[0]");
$form->setAnswer("CMS_HTML[1]");
$form->process();
}
?>
Gruß
xmurrix
Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP
Verfasst: Sa 24. Aug 2013, 11:15
von so2
Vielen Dank xmurrix!
Jetzt funktioniert alles wieder. Cool.
Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP
Verfasst: Fr 18. Okt 2013, 13:25
von Christina5
Hallo liebe Community,
ich habe für meinen Arbeitgeber eine Landingpage für ein Produkt auf Contenido 4.8.18 (ohne AMR) erstellt, auf der man sich via Kontaktformular (w3concepts.form) ein Angebot einholen kann.
Leider funktioniert das Kontaktformular nicht wie gewünscht. Ich habe genau das genommen, welches hier im Thread gepostet wurde, da der Web Server mit PHP 5.3 läuft.
Bei Bedienung des Formulars bekomme ich zwar keine Fehlermeldung, allerdings wird der Antwort-Text nicht ausgegeben, sondern auf die Startseite umgeleitet und eine Mail wird auch nicht verschickt.
Die Umleitung auf die Startseite passiert übrigens unabhängig davon, welcher Artikel als Fehlerseite ausgezeichnet ist.
Die Referenzierung via "&" habe ich bei den Funktionen schon rausgenommen. (habe ich das richtig beschrieben?)
Im Netz bzw. hier finde ich leider keine Lösung. Selbst das Standard Modul Contact_Form zeigt die gleichen Symptome. Und das kuriose ist, dass das w3concepts.form-Modul auf einer anderen Contenido Umgebung 4.8.12 (gleicher Web-Server, aber anderer Ordner und andere DB) problemlos läuft. Die Konfiguration des Moduls im Artikel auf meiner Landingpage ist die gleiche, wie die auf der funktionierenden 4.8.12-Umgebung.
Weiß jemand Rat?
VieleGrüße
Christina
Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP
Verfasst: Mo 21. Okt 2013, 14:11
von Christina5
Hallo,
ich habe mir nun von einem Kollegen HIlfe geholt. Ob diese Hilfe nun der Weisheit letzter Schluss ist, weiß ich nicht, aber wenigstens funktioniert das Formularmodul nun.
Also wenn jemand das gleiche Problem hat, hier meine Lösung:
Der Autput Bereich des oben geposteten Moduls enthält folgende Funktion:
Code: Alles auswählen
public function formOutput($sent = false) {
echo '<form action="" method="POST">';
echo '<input type="hidden" name="sent" value="true" />';
$form = $this->form['form'];
$formData = $this->formInterpretation($form);
$form = explode('###', $form);
Das Problem besthet wohl darin, dass die
form action leer ist:
Wenn man hier entweder die URL der Zielseite rein setzt, oder - wenn man es dynamisch halten will - via php auf dieselbe Seite wieder verweist,
dann funktioniert tatsächlich alles wie gewünscht: Die Mail wird versendet und die Antwort des Formulars wird aufgerufen.
Viele Grüße