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;
}
}
Vielen Dank für die tolle Anleitung!
Habe Alles entsprechend eingerichtet – nur wird leider die Opt-In-Mail von Direct Mail Subscription nicht versendet. Die Finisher-Funktion der externen PHP-Datei wird ohne Probleme aufgerufen – aber irgendwie wird der Opt-In-Mechanismus von Direct Mail Subscription nicht ausgelöst. Es werden noch nicht mal die Daten in tt_address hinterlegt. Hat vielleicht noch jemand einen Tipp..?
LG und danke!
Hallo Tricksi! Funktioniert denn Formhandler und Direct Mail Subscription sonst bei Dir? Teste die beiden Extensions mal unabhängig voneinander. Sonst könnte es evtl. ein Problem mit der PHP-Konfiguration sein…
Danke für die schnelle Antwort!
Die beiden Extensions funktionieren jede für sich ohne Probleme.
Der Double-Opt-In funktioniert beim normalen Newsletter-Formular auch ohne Probleme. Nur eben nicht bei Einbindung der Checkbox in ein formhandler-Formular…
Sämtliche Variablen werden an die Funktion übergeben – ich kann alles per print_r ohne Probleme ausgeben.
Hallo Tricksi! Ich habe das PHP-Script noch mal aktualisiert – bisher wurde nur eine einzige Double-Opt-In-Mail pro User gesendet. Wenn in der Datenbank also bereits ein Eintrag mit Deiner E-Mail stand, ging keine erneute Mail an Dich – unabhängig davon, ob Du Dich bereits validiert hattest oder nicht. Das müsste mit der neuen Version behoben sein – teste mal, ob das vielleicht Dein Problem war…
Hallo,
super Anleitung. Hast Du vielleicht noch eine Idee, wie man die Checkbox standarmäßig auf checked setzen kann?
Grüße!
Hallo Aco!
Auch wenn es nicht unbedingt mit der deutschen Gesetzgebung harmoniert, müsste das doch eigentlich so gehen:
plugin.Tx_Formhandler.settings.predef.formular {
….
preProcessors {
1.class = Tx_Formhandler_PreProcessor_LoadDefaultValues
1.config {
1.newsletter.defaultValue = 1
}
}
}
Hallo,
Anleitung hat mir sehr geholfen. Vielen Dank dafür.
Ging aber zuerst nicht, weil in Direct Mail Subscription standardmässig „gender“ Pflichtfeld ist, in meinen formhandler-Formular aber nicht.
Also noch ins TS:
plugin.feadmin.dmailsubscription.create.required = name, email
Dann ging es.
Gruß.
Hab es ergänzt! Vielen Dank für den Hinweis… wird sicher dem ein oder anderen ein paar Kopfschmerzen sparen…
Vielen Dank david!
Funktioniert einwandfrei.
Gesetzlich ist nicht definitiv verboten. Evtl. grenzwertig. Jedoch wird nur der Opt-In Prozess angestoßen, d.h. der Benutzer muss nochmal tätig werden um den Newsletter zu erhalten.
Nochmal Danke!
Der Gedanke ist richtig – da man mit dem automatisch gesetzten Häkchen nur das Opt-In auslöst bewegt man sich zumindest in einer Grauzone. Für Häkchen ohne Bestätigungsmails gibt es eine klare Rechtssprechung: Sie sind nicht zulässig. Seit das Gesetz vor einigen Jahren heraus kam, haben auch große Firmen wie Apple, Amazon oder Ebay das Häkchen nicht mehr automatisch gesetzt. Man müsste mal klären lassen, wie es in diesem speziellen Fall ist…
http://www.haufe.de/recht/weitere-rechtsgebiete/wirtschaftsrecht/olg-voreingestellte-haekchen-als-newsletter-einwilligung-unwirk_210_77640.html
http://www.gutefrage.net/frage/newsletter-versand-automatisch-gesetzter-haken-aber-mit-double-opt-in-rechtens
http://www.newsletter-blog.de/recht/haken-oder-kein-haken
Vielen Dank für die Anleitung.
Hallo David,
wollte das hier mal ausprobieren, doch leider bekomme ich nur einen Feher.
Die Daten werden in die Tabelle tt_adress reingeschrieben, aber eine Mail wird nicht verschickt.
Funktioniert das noch, oder hat sich an den Extensions etwas grundlegende geändert?
Hallo zusammen,
funktioniert bestens!
Eine kleine Frage nur, und zwar geht es um die Links, zu denen die Bestätigungsmail verschicht werden soll.
Dann muss ich dort ja das plugin „Mailsubcription“ anlegen – oder?
Das könnte dann ja eine belibeige Seite sein.
cu
Volker
Danke für die Anleitung, funkt leider nicht mit TYPO3 7.6.x
Hier die Anpassung für TYPO3 7.6.x
## Formailer TypoScript
## PS: plugin.Tx_Formhandler.settings.additionalIncludePaths.1 wird nicht mehr benötigt! Namespace macht es möglich
finishers {
2.class = \Myvendorname\Myextension\Formhandler\Finisher\DirectMailSubscription
2.config {
optInPID = {$formhandler.newsletterOptInPID}
}
}
## FInisher PHP
## EXT:myextension/Classes/Formhandler/Finisher/DirectMailSubscription.php
gp;
$settings = $this->settings;
if (!$gp[’newsletter‘])
return $gp;
$gp[’name‘] = mysqli_real_escape_string($GLOBALS[‚TYPO3_DB‘]->getDatabaseHandle(), $gp[’name‘]);
$gp[‚email‘] = mysqli_real_escape_string($GLOBALS[‚TYPO3_DB‘]->getDatabaseHandle(), $gp[‚email‘]);
$gp[‚anrede‘] = mysqli_real_escape_string($GLOBALS[‚TYPO3_DB‘]->getDatabaseHandle(), $gp[‚anrede‘]);
$anrede = „f“; // make’s facebook also :()
if ($gp[‚anrede‘] === ‚Frau‘ || $gp[‚Mrs.‘]) {
$anrede = „f“;
}
if ($gp[‚anrede‘] === ‚Herr‘ || $gp[‚Mr.‘]) {
$anrede = „m“;
}
require_once(PATH_typo3conf . ‚ext/direct_mail_subscription/fe_adminLib.inc‘);
require_once(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::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‘][‚gender‘] = $anrede;
$_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 = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(‚TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer‘);
$status = $feadmin->init(“, $conf);
return $gp;
}
}