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

Freitag, 20. April 2012

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