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:

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