Formhandler mit Newsletter-Anmeldung und Opt-In (formhandler, direct_mail, direct_mail_subscription)

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:

<input type="checkbox" name="formhandler[newsletter]" value="1" id="newsletter" ###checked_newsletter_1###/> 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

<?php
 
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['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;  
}
}