Hier eine Schritt-für-Schritt Anleitung, wie man ein Typo3-Kontaktformular mit Formhandler um eine Checkbox „Newsletter bestellen“ erweitern kann, die über die direct_mail-Extension und direct_mail_subscription-Extension das Double-Opt-In übernimmt.
1. Extensions installieren und konfigurieren
Es werden folgende Extensions benötigt: direct_mail, direct_mail_subscription und formhandler und tt_address. Die folgende Beschreibung setzt voraus, dass diese Extensions installiert und korrekt konfiguriert wurden.
Nicht vergessen, im Root-Template alle statischen Templates aus den Extensions einzubinden!!
Das Mindest-TS-Setup für direct_mail_subscription sollte sein:
plugin.feadmin.dmailsubscription {
# SysFolder, in dem die tt_address-Einträge gespeichert werden
pid = 144
email {
from = deine@email.de
fromName = Direct Mail Subscription
admin = deine@email.de
}
# Danke, Thorsten!
create.required = name, email
}
2. Formhandler-Template anpassen
Eine Checkbox mit der Variable „newsletter“ ins E-Mail-Formular einbauen:
Ich möchte den Newsletter erhalten
3. Finisher für Formhandler erstellen
Eine PHP-Datei mit dem Namen „Tx_Formhandler_direct_mail_subscription.php“ im Filesystem anlegen, hier z.B. unter „fileadmin/scripts/Tx_Formhandler_direct_mail_subscription.php“
gp;
$settings = $this->settings;
if (!$gp['newsletter']) return $gp;
$gp['name'] = mysql_real_escape_string($gp['name']);
$gp['email'] = mysql_real_escape_string($gp['email']);
require_once("typo3/sysext/cms/tslib/media/scripts/fe_adminLib.inc");
require_once(t3lib_extMgm::extPath('direct_mail_subscription').'pi/class.dmailsubscribe.php');
$conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['feadmin.']['dmailsubscription.'];
// Benutzer löschen, falls er sich noch nicht per Double Opt-In aktiviert hat -> sonst keine erneute Opt-In Mail
$pid = (int) $conf['pid'];
if ($pid) {
$res = $GLOBALS['TYPO3_DB']->exec_DELETEquery('tt_address', 'deleted=0 AND hidden=1 AND email="'.$gp['email'].'" AND pid='.$pid );
}
if ($settings['optInPID']) {
$conf['formurl.'] = array('parameter'=>$settings['optInPID']);
}
$_POST['FE']['tt_address']['name'] = $gp['name'];
$_POST['FE']['tt_address']['email'] = $gp['email'];
$_POST['FE']['tt_address']['module_sys_dmail_html'] = 1;
$feadmin = new user_feAdmin();
$feadmin->cObj = t3lib_div::makeInstance('tslib_cObj');
$status = $feadmin->init('',$conf);
return $gp;
}
}
?>
4. TS-Setup für Formhandler anpassen
Folgende Anpassung für das TypoScript-Setup von Formhandler machen, damit der Finisher eingebunden wird. Als optInPID sollte die Seite angegeben werden, auf die der Opt-In-Link in der E-Mail führen soll. Hier macht es Sinn, das direct_mail_subscription-PlugIn als Inhaltselement zu platzieren, damit die Nachricht „Vielen Dank, Sie wurden erfolgreich registriert“ etc. erscheinen.
# Pfad zu dem ORDNER, in dem sich die Klassen befinden!
plugin.Tx_Formhandler.settings.additionalIncludePaths.1 = fileadmin/extensions/formhandler_eswe/
plugin.Tx_Formhandler.settings.predef.formular {
# ... hier stehen die üblichen Konfigurationen ...
# Entscheidend ist dann das hier:
finishers {
1.class = Tx_Formhandler_direct_mail_subscription
1.config {
# Hier die PID angeben, die nach dem Klick auf den Opt-In-Link geöffnet werden soll
optInPID = 100
}
}
}
Links und Dankeschöns
Eigener Finischer Beispiel von Dirk
Formhandler Dokumentation
Formhandler Offizielle Webseite
Mediavrog Beispiel
Nachtrag:
Vor- und Nachname, Gender trennen
Sollen die Felder Nachname, Vorname, Geschlecht getrennt erfasst werden, müssen folgende Anpassungen gemacht werden:
Im Template für Formhandler neue Input-Felder „newsletter[gender]“, „newsletter[first_name]“ und „newsletter[last_name]“ einfügen. Das Feld „gender“ bekommt für „Herr“ den Wert „m“ – für „Frau“ ein „f“ (male / female).
TypoScript-Setup anpassen. Entscheidend ist die Zeile „create.fields“.
plugin.feadmin.dmailsubscription {
# SysFolder, in dem die tt_address-Einträge gespeichert werden
pid = 100
// Pfad zu den Template-Dateien
templateFile = {$forms.basepath_templates}/newsletter/emails.html
cObjects.CATLIST.templateFile = {$forms.basepath_templates}/newsletter/emails.html
// Pflichtfelder für die Anmeldung
create.required = email
create.fields = email,first_name,last_name,name,gender
email {
from = deine@email.de
fromName = Dein Name
admin = der@admin.de
field = email
}
// Immer HTML-Mails einschalten
table = tt_address
create.overrideValues.disable = 1
create.overrideValues.module_sys_dmail_html = 1
}
PHP-Script:
class Tx_Formhandler_direct_mail_subscription extends Tx_Formhandler_AbstractFinisher {
public function process () {
$gp = $this->gp;
$settings = $this->settings;
if (!$gp['newsletter']) return $gp;
$gp['gender'] = mysql_real_escape_string($gp['gender']);
$gp['first_name'] = mysql_real_escape_string($gp['first_name']);
$gp['last_name'] = mysql_real_escape_string($gp['last_name']);
$gp['name'] = mysql_real_escape_string($gp['name']);
$gp['email'] = mysql_real_escape_string($gp['email']);
if (!$gp['name']) $gp['name'] = "{$gp['first_name']} {$gp['last_name']}";
require_once("typo3/sysext/cms/tslib/media/scripts/fe_adminLib.inc");
require_once(t3lib_extMgm::extPath('direct_mail_subscription').'pi/class.dmailsubscribe.php');
$conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['feadmin.']['dmailsubscription.'];
// Benutzer löschen, falls er sich noch nicht per Double Opt-In aktiviert hat -> sonst keine erneute Opt-In Mail
$pid = (int) $conf['pid'];
if ($pid) {
$res = $GLOBALS['TYPO3_DB']->exec_DELETEquery('tt_address', 'deleted=0 AND email="'.$gp['email'].'" AND pid='.$pid );
}
if ($settings['optInPID']) {
$conf['formurl.'] = array('parameter'=>$settings['optInPID']);
}
$_POST['FE']['tt_address']['gender'] = $gp['gender'];
$_POST['FE']['tt_address']['first_name'] = $gp['first_name'];
$_POST['FE']['tt_address']['last_name'] = $gp['last_name'];
$_POST['FE']['tt_address']['name'] = $gp['name'];
$_POST['FE']['tt_address']['email'] = $gp['email'];
$_POST['FE']['tt_address']['module_sys_dmail_html'] = 1;
$feadmin = new user_feAdmin();
$feadmin->cObj = t3lib_div::makeInstance('tslib_cObj');
$status = $feadmin->init('',$conf);
return $gp;
}
}