w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP 5.4

Gesperrt
Freddy
Beiträge: 252
Registriert: Fr 6. Mai 2005, 21:01
Wohnort: Gummersbach
Kontaktdaten:

w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP 5.4

Beitrag von Freddy » Mi 8. Mai 2013, 19:30

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

xmurrix
Beiträge: 3154
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP

Beitrag von xmurrix » Do 9. Mai 2013, 14:01

Du darfst beim Aufruf der Funktionen die Parameter nicht als Referenz übergeben.

Falsch:

Code: Alles auswählen

      $felder = $this->formularInterpretation(&$formular);
Richtig:

Code: Alles auswählen

      $felder = $this->formularInterpretation($formular);
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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

so2
Beiträge: 34
Registriert: Sa 7. Jan 2006, 07:16
Wohnort: Kloten
Kontaktdaten:

Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP

Beitrag von so2 » Fr 23. Aug 2013, 20:06

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!

xmurrix
Beiträge: 3154
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP

Beitrag von xmurrix » Sa 24. Aug 2013, 09:38

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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

so2
Beiträge: 34
Registriert: Sa 7. Jan 2006, 07:16
Wohnort: Kloten
Kontaktdaten:

Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP

Beitrag von so2 » Sa 24. Aug 2013, 11:15

Vielen Dank xmurrix!

Jetzt funktioniert alles wieder. Cool.

Christina5
Beiträge: 22
Registriert: Fr 18. Okt 2013, 12:28
Kontaktdaten:

Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP

Beitrag von Christina5 » Fr 18. Okt 2013, 13:25

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

Christina5
Beiträge: 22
Registriert: Fr 18. Okt 2013, 12:28
Kontaktdaten:

Re: w3concepts.form.v1 funktioniert nicht-Umstellung auf PHP

Beitrag von Christina5 » Mo 21. Okt 2013, 14:11

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:

Code: Alles auswählen

 '<form action="" method="POST">'

Wenn man hier entweder die URL der Zielseite rein setzt, oder - wenn man es dynamisch halten will - via php auf dieselbe Seite wieder verweist,

Code: Alles auswählen

form action="'.$_SERVER['PHP_SELF'].'"
dann funktioniert tatsächlich alles wie gewünscht: Die Mail wird versendet und die Antwort des Formulars wird aufgerufen.

Viele Grüße

Gesperrt