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

14 thoughts to “Formhandler mit Newsletter-Anmeldung und Opt-In (formhandler, direct_mail, direct_mail_subscription)”

  1. 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!

  2. 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…

  3. 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.

  4. 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…

  5. Hallo,

    super Anleitung. Hast Du vielleicht noch eine Idee, wie man die Checkbox standarmäßig auf checked setzen kann?

    Grüße!

  6. 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
        }
      }
    }

  7. 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ß.

  8. Hab es ergänzt! Vielen Dank für den Hinweis… wird sicher dem ein oder anderen ein paar Kopfschmerzen sparen…

  9. 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!

  10. 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

  11. 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?

  12. 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

  13. 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;
    }

    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.