{{indexmenu_n>150}} ====== PHP-Funktion einbinden ====== Seit der Release r282 ist es möglich eine eigene PHP-Funktion zwischen der Aktion "submit" und "dem Versenden der eMail" abzuarbeiten . Diese Funktion kann alle Formulareingaben lesen, ändern und zurückgeben. //(Auch das Sendeziel (eMailadresse) kann verändert werden)//. **Diese Veränderungen werden nicht in der Datenbank festgehalten, da die Werte vor dem Funktionsaufruf hineingeschrieben wurden.** \\ Der Funktionsaufruf muss im Formular je nach Template in den Feldern **“PHP-Funktion:”** unterhalb **“Empfänger - Vorlage:“** bzw. **"Kopie an - Vorlage"** eingetragen werden. //(Siehe Bild unten)//. Die Funktion selbst wird in einer Datei im Ordner "template/inc_script/frontend_init/" abgelegt. function my_form_title_recipient_de( &$postvar, &$form, &$mail ) { .... } function my_form_title_copy_to_de( &$postvar, &$form, &$mail ) { .... } \\ ---- ---- Docu: -- \\ Forum: -- **Autor:** [[http://planmatrix.de|K.Heermann]] //(flip-flop) (22.01.10)// \\ **CMS-Version:** >= V1.4.1 r282 \\ **Version:** V1.0 //22.01.10// \\ **Bedingung:** -> [[http://www.phpwcms-docu.de/confincphp_de.phtml|/config/phpwcms/conf.inc.php]] \\ * $phpwcms['allow_ext_init'] = 1; ---- ---- \\ ===== Beispielaufgabe: ===== Den E-Mails an den User (To) und an den Seitenbetreiber (CC) soll eine korrekte Anrede mitgegeben werden, die durch die Anredeauswahl [Frau] - [Herr] - [Firma] gesteuert wird: [Frau] "Sehr geehrte Frau ...." [Herr] "Sehr geehrter Herr ...." [Firma] "Sehr geehrte Damen und Herren" Darüber hinaus soll die abgesendete E-Mail nach dem "Absenden" //(submit)// noch einmal angezeigt werden. - BE: In den Vorlagen für To //(Empfänger - Vorlage)// und CC //(Kopie an - Vorlage)// wird ein Platzhalter [%TITLE%] für die Anrede eingesetzt. - Script: Ersetzen des Platzhalters [%TITLE%] in beiden E-Mailtexten durch die entsprechende Anrede - FE: Ausgabe des E-Mailtextes To //(Empfänger - Vorlage)// auf der Folgeseite nach dem Senden. \\ ===== Frontend-Eingabe ===== Das einfache Formular {{:deutsch:phpwcms-system:artikel:contentparts:formular:spezielle-anwendungen:php_function_include_fe01_de_1.gif|}} \\ ===== Frontend-Ausgabe ===== Die E-Mail wird korrigiert ausgegeben und ausgeliefert. {{:deutsch:phpwcms-system:artikel:contentparts:formular:spezielle-anwendungen:php_function_include_fe02_de_1.gif|}} ~~UP~~ ===== Backend ===== Das einfache Formular im Backend. **Besonderheiten:** Das Feld **"bei Erfolg:"** muss als **HTML** gekennzeichnet werden, da dieses Feld später für die Anzeige der versendeten E-Mail verwendet wird. //(Wird durch das Script befüllt)//. Bitte auf den Platzhalter ##[%TITLE%]## in den Vorlagen und den Einträgen \\ - **my_form_title_recipient_de** unter **"Vorlage"** und \\ - **my_form_title_copy_to_de** unter **"Kopie an - Vorlage"** \\ in **"PHP-Funktion"** achten. \\ {{:deutsch:phpwcms-system:artikel:contentparts:formular:spezielle-anwendungen:php_function_include_be01_de_1.gif|}} ~~UP~~ ===== Backend-Code ===== ==== Empfänger-Vorlage: / Kopie an - Vorlage: ==== ... sind hier zufällig identisch. Name: {title} {name} E-Mail: {email} Nachricht: ------------------------------ {notice} ------------------------------ [%TITLE%], wir bedanken uns für das Interesse und werden uns in Kürze bei Ihnen melden. Mit freundlichem Gruß Sir-Oblong-Fitz-Oblong \\ Die Vorlagen können auch als HTML generiert werden. Die Ausgabe nach dem Senden wird durch das Script entsprechend angepasst und dargestellt. \\ ==== Vorlage: ====
[B]{ERROR:title}[/B] [B]{LABEL:title}[/B][BR]{title}[BR][BR] [B]{ERROR:name}[/B] [B]{LABEL:name}[/B][BR]{name}[BR][BR] [B]{ERROR:email}[/B] [B]{LABEL:email}[/B][BR]{email}[BR][BR] [B]{ERROR:notice}[/B] [B]{LABEL:notice}[/B][BR]{notice}[BR][BR] [B]{ERROR:nospam}[/B] [B]{LABEL:nospam}[/B][BR]{nospam}[BR][BR] {submitIt}
~~UP~~ ===== Exkurs: Funktionen/Variablen ===== Es wird zuerst die Funktion für die **"Empfänger - Vorlage"** //("my_form_title_recipient_de")// und in einem zweiten Aufruf die Funktion für **"Kopie an - Vorlage"** //("my_form_title_copy_to_de")// abgearbeitet. Auf die Reihenfolge haben wir keinen Einfluss. Mit einem Funktionsaufruf werden autom. die drei Arrays **$postvar, $form** und **$mail** übergeben //(Siehe unten)//. **Beispiel:** \\ Der Funktionsaufruf aus dem Formular mit **"my_incredible_function"** erwartet die Funktion function my_incredible_function( &$postvar, &$form, &$mail ) { .... } in einer Datei im Verzeichnis **template/inc_script/frontend_init/ ** Alle Parameter können ausgelesen und verarbeitet werden. Interessant sind i.d.R. die beiden Werte aus **$form['template']** und **$form['template_copy']**. \\ In diesen beiden Variablen finden wir den generierten E-Mailtext aus **"Empfänger - Vorlage"** //("my_form_title_recipient_de")// und **"Kopie an - Vorlage"** //("my_form_title_copy_to_de")//. \\ Diese Texte können nun mit Hilfe von PHP ausgelesen, manipuliert und zurückgeschrieben werden. \\ Nachdem die Funktionen verlassen wurden werden die E-Mails an die eingetragenen Adressen abgesetzt. Die Datenbank wird schon vor dem Aufruf der Funktionen gefüllt, hier wird das manipulierte Ergebnis also nicht festgehalten. ==== Test-Script: ==== ---- \\ **Datei:** template/inc_script/frontend_init/form_test.php **Bedingung:** $phpwcms['allow_ext_init'] = 1; -> [[http://www.phpwcms-docu.de/confincphp_de.phtml|/config/phpwcms/conf.inc.php]] \\ ===== postvar ===========================
'; dumpVar($postvar); echo '
===== form ==============================
'; dumpVar($form); echo '
===== mail ==============================
'; // Sicherheitsrisiko wenn vergessen wird das Script nach Beendigung der Arbeiten zu entfernen. // Ist für die meisten Anwendungen auch uninteressant. // dumpVar($mail); echo '
===== mail ende =========================
'; } // ==== End function /* =============================================================================== =============================================================================== */ ?>
\\ ---- \\ ==== Inhalt: $postvar ==== Inhalt des Arrays $postvar mit dumpVar($postvar); In $postvar sind alle angelegten Felder des Formulars mit dem aktuellen Inhalt hinterlegt. Hierzu zählen auch die Felder, die in den Vorlagen nicht eingesetzt werden. Z.B. ein verstecktes //(hidden)// Feld um einen Wert/Status vom ersten Aufruf des Scriptes "my_form_title_recipient_de" zum zweiten Aufruf "my_form_title_copy_to_de" zu übergeben. **$postvar** wird nur ausgegeben, wenn ##[X] Formularergebnis speichern## eingeschaltet ist, da hier die schon abgespeicherten Daten aus der DB angezeigt werden. \\ Eine Änderung diese Daten ist nicht möglich //(hat keinerlei Auswirkung auf die DB oder dem Versandergebnis)//. Array ( [title] => Herr [name] => Franz Mustermann [email] => f-mustermann@example.com [notice] => Bitte geben Sie hier Ihre Nachricht ein [nospam] => 12 ) \\ ==== Inhalt: $form ==== Inhalt des Arrays $form mit dumpVar($form); Array ( [subject] => Vom Kontaktformular example.com [startup] => [B]E-Mail versenden![/B][BR] [startup_html] => 0 [class] => [error_class] => error [label_wrap] => Array ( [0] => [1] => ) [cform_reqmark] => * [cc] => Array ( [0] => formular@example.com ) [targettype] => emailfield_email [target] => Array ( [0] => f-mustermann@example.com ) [subjectselect] => [sendertype] => system [sender] => kontakt@example.com [sendernametype] => custom [sendername] => [verifyemail] => [labelpos] => 2 [sendcopy] => 1 [copyto] => Franz Mustermann [formtracking_off] => 1 [checktofrom] => 0 [onsuccess_redirect] => 2 [onerror_redirect] => 2 [onsuccess] => [B]Die E-Mail wurde erfolgreich gesendet![/B][BR]
Name: Herr Franz Mustermann

E-Mail: f-mustermann@example.com

Nachricht:
------------------------------
Bitte geben Sie hier Ihre Nachricht ein
------------------------------


Sehr geehrter Herr Franz Mustermann,

wir bedanken uns für das Interesse und werden uns in Kürze bei Ihnen melden.


Mit freundlichem Gruß

Sir-Oblong-Fitz-Oblong
>>Weiter >>
[onerror] => [B]Bitte achten Sie auf den unten angezeigten Fehler![/B] [template_format] => 0 [template] => Name: Herr Franz Mustermann E-Mail: f-mustermann@example.com Nachricht: ------------------------------ Bitte geben Sie hier Ihre Nachricht ein ------------------------------ Sehr geehrter Herr Franz Mustermann, wir bedanken uns für das Interesse und werden uns in Kürze bei Ihnen melden. Mit freundlichem Gruß Sir-Oblong-Fitz-Oblong [template_format_copy] => 0 [template_copy] => Name: Herr Franz Mustermann E-Mail: f-mustermann@example.com Nachricht: ------------------------------ Bitte geben Sie hier Ihre Nachricht ein ------------------------------ Sehr geehrter Herr Franz Mustermann, wir bedanken uns für das Interesse und werden uns in Kürze bei Ihnen melden. Mit freundlichem Gruß Sir-Oblong-Fitz-Oblong [function_to] => my_form_title_recipient_de [function_cc] => my_form_title_copy_to_de [template_equal] => 0 [customform] =>
[B]{ERROR:title}[/B] [B]{LABEL:title}[/B][BR]{title}[BR][BR] [B]{ERROR:name}[/B] [B]{LABEL:name}[/B][BR]{name}[BR][BR] [B]{ERROR:email}[/B] [B]{LABEL:email}[/B][BR]{email}[BR][BR] [B]{ERROR:notice}[/B] [B]{LABEL:notice}[/B][BR]{notice}[BR][BR] [B]{ERROR:nospam}[/B] [B]{LABEL:nospam}[/B][BR]{nospam}[BR][BR] {submitIt}
[savedb] => 1 [saveprofile] => 0 [fields] => Array ( [1] => Array ( [type] => select [name] => title [label] => Anrede [required] => 0 [value] => Frau Herr Firma [error] => Fehler:- [style] => [class] => [profile] => [size] => [max] => ) [2] => Array ( [type] => text [name] => name [label] => Name [required] => 1 [value] => Franz Mustermann [error] => Fehler:- [style] => [class] => [profile] => [size] => 48 [max] => ) [3] => Array ( [type] => email [name] => email [label] => eMail [required] => 1 [value] => f-mustermann@example.com [error] => Fehler:- [style] => [class] => [profile] => [size] => 48 [max] => ) [4] => Array ( [type] => textarea [name] => notice [label] => Nachricht [required] => 0 [value] => Bitte geben Sie hier Ihre Nachricht ein [error] => Fehler:- [style] => [class] => [profile] => [size] => 37 [max] => 3 ) [5] => Array ( [type] => mathspam [name] => nospam [label] => Spamschutz [required] => 1 [value] => Array ( [+] => Summieren [-] => Subtrahieren [*] => Multiplizieren [:] => Dividieren [calc] => Berechnung: ) [error] => Fehler:- [style] => [class] => [profile] => [size] => 10 [max] => ) [6] => Array ( [type] => submit [name] => submitIt [label] => Senden [required] => 0 [value] => Senden [error] => Fehler:- [style] => [class] => [profile] => [size] => [max] => ) ) [is_enctype] => [regx_pattern] => Array ( [A-Z] => /^[A-Z]+$/ [a-Z] => /^[a-zA-Z]+$/ [a-z] => /^[a-z]+$/ [0-9] => /^[0-9]+$/ [PHONE] => /^[+]?([0-9]*[\.\s\-\(\)\/]|[0-9]+){3,24}$/ [INT] => /^[0-9\-\+]+$/ [WORD] => /^[\w]+$/ [LETTER+SPACE] => /^[a-z _\-\:]+$/i ) [is_html_entity] => [fe_current_url] => http://example.com/index.php?category04_01_05 )
\\ === $form['template'] und $form['template_copy'] === Interessant sind hier die beiden Bereiche **$form['template']** und **$form['template_copy']** die den jeweils fertigen E-Mailtext beinhalten. Beider Texte sind hier der Einfachheit halber identisch, könnten allerdings auch unterschiedlich sein. * **$form['template']** => Text "To" also aus **"Empfänger - Vorlage"** * **$form['template_copy']** => Text "CC" also aus **"Kopie an - Vorlage"** \\ Name: Herr Franz Mustermann E-Mail: f-mustermann@example.com Nachricht: ------------------------------ Bitte geben Sie hier Ihre Nachricht ein ------------------------------ Sehr geehrter Herr Franz Mustermann, wir bedanken uns für das Interesse und werden uns in Kürze bei Ihnen melden. Mit freundlichem Gruß Sir-Oblong-Fitz-Oblong Die richtige personenbezogene Anrede wurde mit Hilfe des Scripts am Platzhalter ##[%TITLE%]## in den E-Mails To und CC eingesetzt. Dieser Text wird nun korrekt als E-Mail versendet. \\ ===== PHP-Funktion ===== **Datei:** template/inc_script/frontend_init/my_form_title_de.php Die richtige personenbezogene Anrede wird in den E-Mails To und CC eingesetzt. '; $email_text .= $form['template']; $email_text .= ''; // More link // Weiter link $email_text .= '
'; $email_text .= ''; $email_text .=' >>Weiter >>'; $email_text .= '
'; // Insert e-mail text and if non HTML: convert LF to
// Einsetzen des E-Mailtextes und wenn kein HTML LF nach
$form['onsuccess'] .= ($form['template_format'] == 1) ? $email_text : nl2br($email_text); } // ==== End function // Function using in copy to template // Funktion fuer das "Kopie an" Template function my_form_title_copy_to_de( &$postvar, &$form, &$mail ) { // Die richtige Anrede suchen // Set up the right title // --------------------------------------------------------------- $result = ''; switch (trim($postvar['title'])) { case 'Frau': $result = 'Sehr geehrte Frau '.trim($postvar['name']); break; case 'Herr': $result = 'Sehr geehrter Herr '.trim($postvar['name']); break; case 'Firma': $result = 'Sehr geehrte Damen und Herren'; break; default: $result = 'Sehr geehrte Damen und Herren'; } // Replace the form placeholder [%TITLE%] in both e-mail texts by the right title // Ersetzen des Formularplatzhalters [%TITLE%] in beiden E-Mailtexten durch die richtige Anrede // --------------------------------------------------------------- $form['template_copy'] = str_replace('[%TITLE%]',$result, $form['template_copy']); // copy to: / Kopie an: } // ==== End function ?>
\\ ===== Ausgabe des E-Mailtextes (To) auf der Folgeseite ===== Das BE Eingabefeld "**Bei Erfolg:**" wird im Script mit dem E-Mailtext aus To //(Empfänger - Vorlage)// der **Variablen $form['template']** gefüllt. Dazu schreiben wir einfach den Text, eingebettet in ein wenig Formatierung, aus **$form['template']** in die **Variable $form['onsuccess']**. \\ Darüberhinaus wird noch ein Link //(weiter)// zur aktuelle Seite //(Formular)// generiert. \\ \\ ====== Nutzen der i18n @@Replacementsags@@ in Emails, für mehrsprachige Seiten ====== Das oben beschriebene Verfahren kann sehr einfach dazu eingesetzt werden, um E-Mail Text mit Hilfe der i18n Funktion [[deutsch/ersetzer_rts/integrierte-tags/sprach-tags/i18n]] von phpwcms zu übersetzten. Angenommen wir schreiben folgende E-Mail Vorlage: @@Firma@@: {firma} \\ @@Betreff@@: {subject} und möchten @@Firma@@ für englischsprachige E-Mail Empfänger //(z.B. für die E-Mail Kopie)// als "Company" bzw. @@Betreff@@ als "Subject" in der E-Mail stehen haben. Dann hilft folgende simple Funktion: function email_i18n_substitute_text(&$postvar, &$form, &$mail){ $form['template'] = i18n_substitute_text($form['template']); $form['template_copy'] = i18n_substitute_text($form['template_copy']); } \\ **email_i18n_substitute_text** muss dann als Funktion im Backend/Formular CP, wie oben beschrieben registriert werden. \\ Natürlich muss auch die entsprechende Sprachdatei dazu übersetzt werden. \\