Seite 1 von 2

piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 21. Aug 2014, 09:26
von rethus
Ich habe ein Formular erstellt.
Nachdem ich es ausgefüllt habe, erhalte ich jedoch folgende Meldung im Fenster:
Screenshot_001_20140821.jpg
Screenshot_001_20140821.jpg (8.73 KiB) 9010 mal betrachtet
Zwei Dinge:
1) Die Fehlermeldung hat fehlende Platzhalter, obwohl diese in in der .po Datei (form_assistent.po) vorhanden ist:
Ab Zeile 404

Code: Alles auswählen

#: classes/class.pifa.form.php:545
msgid "MISSING_RECIPIENT_ADDRESS"
msgstr "Empfänger-Adresse fehlt"
Auch wenn ich es als m18n(); in das Modul mit reinsetze, und dann übersetze wird es nicht übersetzt.

2) Das weitaus wichtigere Problem:
Die Config des Formulars sieht so aus:
Screenshot_002_20140821.jpg
Screenshot_002_20140821.jpg (58.23 KiB) 9010 mal betrachtet
Die obige Fehlermeldung soll (soweit ich es verstanden habe) angeben, dass die Empfängeradresse fehlt.
So hab ich denn im Code mal nach der Stelle geschaut, welche die Exception wirft (class.pifa_form.php):

Code: Alles auswählen

    public function toMailRecipient(array $opt) {
print_r($opt);
        if (0 == strlen(trim($opt['from']))) {
            $msg = Pifa::i18n('MISSING_SENDER_ADDRESS');
            throw new PifaMailException($msg);
        }
        if (0 == strlen(trim($opt['fromName']))) {
            $msg = Pifa::i18n('MISSING_SENDER_NAME');
            throw new PifaMailException($msg);
        }
        if (0 == strlen(trim($opt['to']))) {
            $msg = Pifa::i18n('MISSING_RECIPIENT_ADDRESS');
            throw new PifaMailException($msg);
        }
        if (0 == strlen(trim($opt['subject']))) {
            $msg = Pifa::i18n('MISSING_SUBJECT');
            throw new PifaMailException($msg);
        }
        if (0 == strlen(trim($opt['body']))) {
            $msg = Pifa::i18n('MISSING_EMAIL_BODY');
            throw new PifaMailException($msg);
        }
und dort via print_r die Übergebenen Daten ausgegeben:
Screenshot_003_20140821.jpg
(39.36 KiB) Noch nie heruntergeladen
Auffällig ist, dass beim ersten Durchlauf das Feld "to" leer ist. Der Erste Durchlauf des Arrays bezieht sich übrigens auf den Bereich "Benutzer-Mail", obwohl diese ja mit der Einstellung für Vorlage "keine" deaktiviert sein sollte?!
Ist das nicht so gedacht würde ich in jedem Fall eine checkbox hinzufügen, wo man die beiden Mail-Varianten optional deaktivieren kann.
Der Code um die Benutzermail nicht zu versenden, wenn bei Vorlage "keine" gewählt wurde würde so aussehen :
Datei: class.pifa.mailed_form_processor.php ab Zeile 60 (hinzugefügt wurde die IF-Schachtelung des toMailRecipient-Aufrufs.

Code: Alles auswählen

if(!empty($this->getModule()->getSetting('pifaform_mail_client_template'))){
	            // send mail
	            $this->getForm()->toMailRecipient(array(
	                'from' => $this->getModule()->getSetting('pifaform_mail_client_from_email'),
	                'fromName' => $this->getModule()->getSetting('pifaform_mail_client_from_name'),
	                'to' => $values['email'],
	                'subject' => $subject,
	                'body' => $body,
	                'charSet' => 'UTF-8'
	            ));
			}

Hier fehlt also schon einmal die Abfrage, dass die Exception nur geworfen wird, wenn tatsächlich auch eine Benutzermail gesendet werden soll... womit wir direkt zur nächsten Frage kommen...
Wo wird die Reciepient-Mailadresse hergeholt?
Schaut man in die Datei class.pifa.mailed_form_processor.php in Zeile 61, wird deutlich, dass er $values['email'] abruft, also ein Textfeld mit dem Spaltennamen "email" erwartet.
Meiner Meinung nach sollte sowas "sauber" in der Fehlermeldung dokumentiert werden... und nicht lediglich Missing Reciepient ausgegeben werden - da suchen sich sonst selbst erfahrene Contenido-Programmierer nen Wolf :motz: .

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 21. Aug 2014, 09:32
von Faar
wegen all dem nehme ich auch für 4.9 noch das alte Formular, wo man mit PHP und HTML noch arbeiten kann.

Apropos: .po ist ein absolutes no-go bei Dingen, die man vor Ort übersetzen können muss.

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 21. Aug 2014, 09:38
von rethus
TIPP:
Damit der Mailversand von PIFA überhaupt funktioniert, muss zwingend ein SMTP-server unter Administration > System > System-Konfiguration eingetragen werden.
Grund: PiFa-Formular nutzt den Swift-Mailer, der die lokale und php eigene mail();-Funktion nicht unterstützt.

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 21. Aug 2014, 09:56
von Faar
Ja eben, darum braucht es beim alten Formular auch noch die alte phpmailer-Klasse dazu: http://www.dfabig.de/de/download/conten ... enido.html

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 21. Aug 2014, 19:58
von Oldperl
rethus hat geschrieben:Grund: PiFa-Formular nutzt den Swift-Mailer, der die lokale und php eigene mail();-Funktion nicht unterstützt.
Was so nicht ganz korrekt ist, der Swift-Mailer kann alle Transportformen, nur im PIFA hat man sich rein auf SMTP mit dem in Contenido vermerkten Adressdaten festgelegt.
Würde man im Core des PIFA dahingehend eine Konfiguration ermöglichen könnte man auch mit allen Transportformen arbeiten.

Gruß aus Franken

Ortwin

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Fr 22. Aug 2014, 09:36
von Faar
Moin Ortwin,

könnte es dann sein, dass man das alte Formular mit etwas Anpassung auch auf den Swift-Mailer aufsetzt? :)

Unausgeschlafene Grüße,
Frank

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Mo 25. Aug 2014, 10:51
von Oldperl
Moin Frank,

aber sicherlich kann man das problemlos machen. Ist halt nur "a weng" Arbeit. :)

hellwache Grüße aus Franken

Ortwin

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Fr 24. Apr 2015, 13:10
von rethus
Sitze gerade an einem neuen Kontaktformular für eine neue Webseite....
... ein echt nerviges Unterfangen. Hoffe dass der PiFa bald angepasst wird um auch die lokale Mailfunktion zu unterstützen. :roll:

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Mi 6. Jan 2016, 18:53
von rethus
Hier mal ein Lösungsansatz von mir:

In der Datei classes/class.Mailer.php die Funktion (constructTransport):

Code: Alles auswählen

public static function constructTransport($mailHost, $mailPort, $mailEncryption = NULL, $mailUser = NULL, $mailPass = NULL) {
        // try to use SMTP
        $transport = Swift_SmtpTransport::newInstance($mailHost, $mailPort, $mailEncryption);

        if (!empty($mailUser)) {
            $authHandler = new Swift_Transport_Esmtp_AuthHandler(array(
                new Swift_Transport_Esmtp_Auth_PlainAuthenticator(),
                new Swift_Transport_Esmtp_Auth_LoginAuthenticator(),
                new Swift_Transport_Esmtp_Auth_CramMd5Authenticator()
            ));
            $authHandler->setUsername($mailUser);
            if (!empty($mailPass)) {
                $authHandler->setPassword($mailPass);
            }
            $transport->setExtensionHandlers(array(
                $authHandler
            ));
        }

        // check if SMTP usage is possible
        try {
            $transport->start();
        } catch (Swift_TransportException $e) {
            // if SMTP is not possible, simply use PHP's mail() functionality
            $transport = Swift_MailTransport::newInstance();
        }

        return $transport;
    }
ersetzen gegen:

Code: Alles auswählen

public static function constructTransport($mailHost, $mailPort, $mailEncryption = NULL, $mailUser = NULL, $mailPass = NULL) {
        $mail_transport = getSystemProperty('system', 'mail_transport');
        switch(strtolower($mail_transport)){
            case "smtp":
                $transport = Swift_SmtpTransport::newInstance($mailHost, $mailPort, $mailEncryption);
            break;
            case "sendmail":
            case "php":
            case "mail":
            default:
                $transport = Swift_MailTransport::newInstance();
                break;
        }

        if (!empty($mailUser) && strtolower($mail_transport)=="smtp") {
            $authHandler = new Swift_Transport_Esmtp_AuthHandler(array(
                new Swift_Transport_Esmtp_Auth_PlainAuthenticator(),
                new Swift_Transport_Esmtp_Auth_LoginAuthenticator(),
                new Swift_Transport_Esmtp_Auth_CramMd5Authenticator()
            ));
            $authHandler->setUsername($mailUser);
            if (!empty($mailPass)) {
                $authHandler->setPassword($mailPass);
            }
            $transport->setExtensionHandlers(array(
                $authHandler
            ));
        }

        // check if choosen transport Type is possible
        try {
            $transport->start();
        } catch (Swift_TransportException $e) {
            cWarning("Error by initiate transport type of Swift-Mailer in class.mailer.php Line: 195");
        }

        return $transport;
    }
Erklärung
Im Backend von Contenido (Administration ⇒ System ⇒ Experteneinstellnugen) kann nun die folgende System-Variable erstellt werden:

Code: Alles auswählen

Typ: system
Name: mail_transport
Wert:
Der Wert ist ein einfacher String der eines der folgenden Werte haben kann:
  1. (leeres Feld..., also existierender Schlüssel ohne Eingabe)
  2. php
  3. mail
  4. sendmail
  5. smtp
In den ersten 4 Eingabefällen wird der mail()-Befehl von php genutzt, im letzen Fall die Daten, die unter Administration ⇒ System ⇒ Systemkonfiguration ⇒ Mailserver hinterlegt wurden.

@4fb: Bitte in den Core aufnehmen.

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 7. Jan 2016, 10:32
von frederic.schneider_4fb
Lieber rethus,

vielen Dank für Dein Engagement und Deine Arbeit. Wir finden die Anregung gut und werden das in den Core von CONTENIDO übernehmen. In der nächsten Version noch nicht, da wir dort inzwischen ein Feature Freeze haben und nur noch Fehler beheben

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Sa 9. Jan 2016, 21:00
von gorgo
Hey rethus,

10000 Dank, ich hatte es verzweifelt mit folgendem in der PifaFormCollection-Klasse versucht

Code: Alles auswählen

$mailer = new cMailer(Swift_MailTransport::newInstance());
Deine Lösung funktioniert super.

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Mi 13. Jan 2016, 20:29
von rethus
Freut mich, dass ich helfen konnte. Danke für das Feedback.

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Mo 23. Mai 2016, 12:45
von urshappy
Hallo zusammen

Ich bin ziemlich neu hier... mehr muss ich dazu wohl nicht sagen...

Ich arbeite zum ersten Mal mit dem Kontaktformular in Contenido und komme damit nicht zurecht :? .

@rethus: Du hat in deinem ersten Post hier ein Screenshot eingestellt, welcher die Configuration deines Formulares zeigt. Punkt 2.
Wie kann ich dieses Konfigurationsfenster öffnen?

Version: 4.9.8

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Di 24. Mai 2016, 13:10
von rethus
urshappy hat geschrieben: Ich bin ziemlich neu hier... mehr muss ich dazu wohl nicht sagen...
Hi, und ein Herzliches Willkommen im Forum.
Ich muss zugeben, das PIFA in der Konfiguration auch nicht ganz so intuitiv ist.
Ich versuche es mal aufzuschlüsseln:
  • Zuerst gehst du ja in den Formular-Assistenten und legst ein Formular mit den gewünschten Feldern an. (Ich denke das hast du bereits getan)
  • Dann gehst du in die Module, und legst z.B. ein Modul an, das ein ensprechendes PIFA-Modul ausgibt. Hier kannst du direkt Platzhalter für deine Texte die übersetzt werden sollen einfügen.

    Beispiel:

    Code: Alles auswählen

    <?php
    if (cRegistry::isBackendEditMode()) {
        echo '<label class="content_type_label">' . mi18n("LABEL_FORM_LIEFERANTENPROFIL") . '</label>';
    }
    echo "<!-- profil_idcatart_langid -->
            <div id='Lieferantenprofil' class='profil_".$idcatart."_".$lang."'>CMS_PIFAFORM[200]</div>";
    mi18n("PIFA_MAIL_ERROR_SUFFIX");
    mi18n("PIFA_SYSTEM_MAIL");
    mi18n("PIFA_CLIENT_MAIL");
    mi18n("MISSING_RECIPIENT_ADDRESS");
    mi18n("REPLY_HEADLINE");
    mi18n("REPLY_TEXT");
    ?>
    
  • Unter Stlye ⇒ HTML im Backend sind dann die Templates (ich weiß gerade aus dem Stehgreif nicht warum dort und nicht im Modul, aber das hat glaub ich mit der späteren Templateauswahl im Artikel zu tun).
    So könnte ein Template aussehen:

    Code: Alles auswählen

    <div class="clear hr">
        <hr />
    </div>
    {$form}
    
  • Dann erstellst du eine Vorlage, die dein errstelltes Modul einbindet.
  • Gehe danach auf einen Artikel und weise Ihm die Vorlage zu.
  • In dem Artikel findest du nun einen blauen Button, über den du das Forumlar in dem Artikel konfigurieren kannst... es ist das Fenster, das ich oben als Screenshot hinzugefügt habe, wo du dann z.B. das erstellte Template wählen kannst, aber auch Mailadressen, Betreffzeilen etc. eingeben kannst.
Ich hoffe das gibt dir einen guten Start mit PIFA.

Re: piFa Formular - Fehlermeldung und Mailversand

Verfasst: Do 23. Jun 2016, 11:19
von frederic.schneider_4fb
Guten Tag,

wir haben uns dem jetzt noch einmal angenommen:
Wir werden die Lösung doch nicht übernehmen. Das würde nämlich bedeuten, dass man zukünftig SMTP definieren und eine Systemeinstellung vornehmen müsste. Unabhängig davon war es problemlos möglich, ohne angegebenen SMTP-Server über mail() das PIFA-Formular auszufüllen, eine E-Mail zu versenden und zu empfangen.