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: K.Heermann (flip-flop) (22.01.10)
CMS-Version: >= V1.4.1 r282
Version: V1.0 22.01.10

Bedingung:/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.

  1. BE: In den Vorlagen für To (Empfänger - Vorlage) und CC (Kopie an - Vorlage) wird ein Platzhalter [%TITLE%] für die Anrede eingesetzt.
  2. Script: Ersetzen des Platzhalters [%TITLE%] in beiden E-Mailtexten durch die entsprechende Anrede
  3. FE: Ausgabe des E-Mailtextes To (Empfänger - Vorlage) auf der Folgeseite nach dem Senden.


Frontend-Eingabe

Das einfache Formular


Frontend-Ausgabe

Die E-Mail wird korrigiert ausgegeben und ausgeliefert.

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.


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:

<div style="width:510px; padding:10px; margin:10px; border:1px dotted #666; background: #E2DFFF;">
 
<span style="color:red">[B]{ERROR:title}[/B]</span> [B]{LABEL:title}[/B][BR]{title}[BR][BR]
<span style="color:red">[B]{ERROR:name}[/B]</span> [B]{LABEL:name}[/B][BR]{name}[BR][BR]
<span style="color:red">[B]{ERROR:email}[/B]</span> [B]{LABEL:email}[/B][BR]{email}[BR][BR]
<span style="color:red">[B]{ERROR:notice}[/B]</span> [B]{LABEL:notice}[/B][BR]{notice}[BR][BR]
<span style="color:red">[B]{ERROR:nospam}[/B]</span> [B]{LABEL:nospam}[/B][BR]{nospam}[BR][BR]
 
{submitIt}
 
</div>

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.

<note> Die Datenbank wird schon vor dem Aufruf der Funktionen gefüllt, hier wird das manipulierte Ergebnis also nicht festgehalten. </note>

Test-Script:



Datei: template/inc_script/frontend_init/form_test.php

Bedingung: $phpwcms['allow_ext_init'] = 1; → /config/phpwcms/conf.inc.php

form_test.php

<?php
/********************************************************************************************/
/**
 * Script fur den Test der Formularfunktion
 *
 * 17.03.2010 (c) K.Heermann http://planmatrix.de
 */
/********************************************************************************************/
// -------------------------------------------------------------------------------------------
// obligate check for phpwcms constants
  if (!defined('PHPWCMS_ROOT')) {die("You Cannot Access This Script Directly, Have a Nice Day."); }
// -------------------------------------------------------------------------------------------
 
 
/** For testing form function
===============================================================================
===============================================================================
*/
function form_test( &$postvar, &$form, &$mail ) {
 
    echo '<br>===== postvar ===========================<br>';
    dumpVar($postvar);
 
    echo '<br>===== form ==============================<br>';
    dumpVar($form);
 
    echo '<br>===== mail ==============================<br>';
// Sicherheitsrisiko wenn vergessen wird das Script nach Beendigung der Arbeiten zu entfernen.
// Ist für die meisten Anwendungen auch uninteressant.
//    dumpVar($mail);
    echo '<br>===== mail ende =========================<br>';
 
}  // ==== 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.

<note> $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). </note>

Ausgabe $postvar

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);

Ausgabe $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]<div style="width:510px; padding:10px; margin:10px; border:1px dotted #666; background:#eee;">Name:   Herr Franz Mustermann  <br />
<br />
E-Mail: f-mustermann@example.com  <br />
<br />
Nachricht: <br />
------------------------------ <br />
Bitte geben Sie hier Ihre Nachricht ein <br />
------------------------------<br />
 <br />
 <br />
Sehr geehrter Herr Franz Mustermann, <br />
 <br />
wir bedanken uns für das Interesse und werden uns in Kürze bei Ihnen melden.   <br />
<br />
<br />
Mit freundlichem Gruß<br />
 <br />
Sir-Oblong-Fitz-Oblong</div><div style="padding:20px 0 0 20px; font-weight:bold;"><a href="category04_01_05.phtml"> >>Weiter >></a></div>
    [onerror] => <span style="color:red">[B]Bitte achten Sie auf den unten angezeigten Fehler![/B]</span>
    [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] => <div style="width:510px; padding:10px; margin:10px; border:1px dotted #666; background: #E2DFFF;">
 
<span style="color:red">[B]{ERROR:title}[/B]</span> [B]{LABEL:title}[/B][BR]{title}[BR][BR]
<span style="color:red">[B]{ERROR:name}[/B]</span> [B]{LABEL:name}[/B][BR]{name}[BR][BR]
<span style="color:red">[B]{ERROR:email}[/B]</span> [B]{LABEL:email}[/B][BR]{email}[BR][BR]
<span style="color:red">[B]{ERROR:notice}[/B]</span> [B]{LABEL:notice}[/B][BR]{notice}[BR][BR]
<span style="color:red">[B]{ERROR:nospam}[/B]</span> [B]{LABEL:nospam}[/B][BR]{nospam}[BR][BR]
 
{submitIt}
 
</div>
    [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.

my_form_title_de.php

<?php
// -------------------------------------------------------------------------------------------
// obligate check for phpwcms constants
  if (!defined('PHPWCMS_ROOT')) {die("You Cannot Access This Script Directly, Have a Nice Day."); }
// -------------------------------------------------------------------------------------------
 
/*********************************************************************************************
 Simple script for calling a PHP function from a form, after the submit
 The correct personal address is spent in the e-mails To and CC
 The e-mail text is displayed after a successful send
 
 Einfaches Script fur den Aufruf einer PHP-Funktion aus einem Formular heraus nach dem submit.
 Die richtige Anrede personenbezogen wird in den E-Mails To und CC ausgegeben
 Der E-Mailtext wird nach erfolgreichem senden ausgegeben
 
 20.01.2009 K.Heermann http://planmatrix.de
**********************************************************************************************/
 
/* -----------------------------------------------------
[Frau]       Sehr geehrte Frau XXX
[Herr]       Sehr geehrter Herr XXX
[Firma]      Sehr geehrte Damen und Herren der Firma XXX
---------------------------------------------------------*/
 
 
// Function using in recipient template   // Funktion fuer das "Empfaenger"-Template
 
function my_form_title_recipient_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']      = str_replace('[%TITLE%]',$result, $form['template']);      // recipient: / Empfaenger:
 
 
 
    // Output e-Mail text "on success"   // Ausgabe E-Mailtext in "bei Erfolg:"
    // ---------------------------------------------------------------
        $email_text = '<div style="width:510px; padding:10px; margin:10px; border:1px dotted #666; background:#eee;">';
        $email_text .= $form['template'];
        $email_text .= '</div>';
 
        // More link    // Weiter link
        $email_text .= '<div style="padding:20px 0 0 20px; font-weight:bold;">';
        $email_text .= '<a href="'.$GLOBALS['content']["struct"][$GLOBALS['content']["cat_id"]]["acat_alias"].'.phtml">';
        $email_text .=' >>Weiter >></a>';
        $email_text .= '</div>';
 
        // Insert e-mail text and if non HTML: convert LF to <br>
        // Einsetzen des E-Mailtextes und wenn kein HTML LF nach <br>
        $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 Internationalisierung (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.

deutsch/phpwcms-system/artikel/contentparts/formular/spezielle-anwendungen/php-funktion-einbinden.txt · Last modified: 2018/06/03 18:08 (external edit)
www.planmatrix.de www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0