Direct Mail Newsletter Anmeldung über Mailformplus oder ein anderes Kontaktformular

Die Anmeldung zum Erhalt eines Newsletters per DirectMail läuft bekannterweise über die Extension Direct Mail Subscription.

Doch leider fehlt es ihr an Flexibilität, da die Funktionalität des Anmeldens (inkl. Versand einer Bestätigungsmail) nicht in einer Methode gekapselt ist, sondern über Typoscript realisiert wird (userFunc). Somit ist es nicht ohne Weiteres möglich, eine Newsletteranmeldung per Checkbox in einem beliebigen (Kontakt-)Formular zu integrieren. Im Folgenden wird eine Lösung gezeigt, welche die beschriebene Funktionalität ermöglicht.

Das TS-Setup findet sich in der ext_typoscript_setup.txt von Direct Mail Subscription (ein Auszug):

plugin.feadmin.dmailsubscription >

plugin.feadmin.dmailsubscription = USER_INT

plugin.feadmin.dmailsubscription {

   userFunc = user_feAdmin->init

   includeLibs = media/scripts/fe_adminLib.inc

   templateFile = {$plugin.feadmin.dmailsubscription.file.templateFile}

[...]

Nach dem Einschreiben über das Frontendplugin von Direct Mail Subscription werden die Daten an die init-Methode der Klasse user_feAdminübergeben, welche sich um das Speichern der Daten in der richtigen Tabelle und den Versand einer Bestätigungsmail (Double Opt-In) kümmert.

Um diese Funktionalität in der eigenen Extension oder einer userFunktion (z.B. bei Mailformplus die saveUserFunc) nutzen zu können muss man wie im TS die richtigen Bibliotheken einbinden und noch ein paar Parameter setzen. Es folgt eine Schritt für Schritt-Anleitung. Es wird vorausgesetzt, dass bereits eine PHP-Datei exisitiert, welche nach dem Abschicken des Mailformulars ausgeführt wird (ähnlich der saveUserFunc von Mailformplus ) und die Extension Direct Mail Subscription passend konfiguriert ist.

die benötigten Klassen und Bibliotheken einbinden

// fe_admin Bibliothek; speichert Daten in DB und verschickt die Bestätigungsmail
require_once("typo3/sysext/cms/tslib/media/scripts/fe_adminLib.inc");

// Extension Direct Mail Subscription; enthält Konfiguration; wird eventuell nicht gebraucht(?)
require_once(t3lib_extMgm::extPath('direct_mail_subscription').'pi/class.dmailsubscribe.php');

Die Konfiguration von Direct Mail Subscription holen

$conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['feadmin.']['dmailsubscription.'];

In dieser Konfiguration ist unter Anderem der Pfad zum Template der Anmeldung kodiert, welche von feAdmin benötigt wird. Falls das Template nicht gefunden wird, so kann man den Pfad auch korrigieren:

$conf['templateFile'] = "../../../".$conf['templateFile'];

Die richtigen Post-Variablen nutzen

Die init Methode der fe_admin wird sich $_POST[‘FE’] Daten holen, um mit diesen zu arbeiten. Dabei ist in zweiter Ebene des Arrays die Tabelle codiert, in der die Daten gespeichert werden. Der Schlüssel dritter Ebene repräsentiert nunmehr das DB Feld. Folgende Post-Variablen sollten beim Abschicken des Formulars mitgeschickt werden, ansonsten können sie auch in PHP mit eigenen Werten belegt werden.

// Name des Newsletterempfängers
$_POST['FE']['tt_address']['name'];

// Emailadresse
$_POST['FE']['tt_address']['email'];

// Sollen HTML Mails empfangen werden?
$_POST['FE']['tt_address']['module_sys_dmail_html'];

Objekt von user_feAdmin erzeugen und Konfiguration übergeben

$ua = new user_feAdmin();

$ua->cObj = t3lib_div::makeInstance('tslib_cObj');

$ua->init($content,$conf);

Die Variable $content kann laut Class Reference von feAdmin weggelassen werden (leerer String).

Mit dem Ausführen der init-Methode werden alle nötigen Prozesse angestoßen, welche zur Newsletteranmeldung benötigt werden.

Beispiel

Hier nochmal ein Codeblock mit allen benötigten Schritten: Beispiel

Kommentare?

Falls jemand eine einfachere Implementation kennt oder sonstige Hinweise zu meinem Vorschlag hat, der poste doch bitte einen Kommentar :)

Hinweise

Noch zwei letzte Hinweise, falls keine Bestätigungsmail verschickt wird:

Es kann u.A. daran liegen, dass das Template für Direct Mail Subscription nicht gefunden wird. Der Rückgabewert der init-Methode gibt meistens einen guten Aufschluss über den Status und eventuelle Fehler. Einfach mal in ner Variable ablegen und ausgeben (per echo, var_dump etc).

Per getcwd() kann man außerdem per PHP prüfen, in welchen Verzeichnis das aktuelle Script ausgeführt wird. Hilft beim Testen ob der Pfad zum Template File stimmt.

11 Kommentare

  1. Uwe Februar 19, 2009 1:54   Antworten

    Hallo,

    das ist fast was ich brauche doch leider will ich es mit sr_feuser_register machen. Da ich bei Typo3 ein Neuling bin schaffe ich es nicht deine Anleitung so abzuwandeln, dass das sr_feuser_register dass macht was ich will. Also dmail_register anstoßen und die mails verschicken.
    Das ganze entwickelt sich leider zu einem aus dem Ruder gelaufenen Kundenprojekt (“nur” schnell einen Newsletter hinzufügen ;-) Und der bisherige Zeitaufwand sprengt alles geplante). Vielleicht kannst Du mir einen Tipp geben, falls Du dich mit sr_feuser_register auch auskennst?
    Denn ich weiß nicht wo ich den Code einhängen kann.

    Grüße
    Uwe

  2. mediavrog
    mediavrog Dezember 3, 2008 10:23   Antworten

    Hast du meine Tipps 1) und 2) berücksichtigt.
    Wenn var_dump nichts ausgibt, dann wird wohl die methode nicht ausgeführt :)
    Und Direct Mail hat mit Direct Mail Subscription nichts weiter zu tun – habe nachgeschaut und Direct Mail Subscription ist immer noch in der 1.1.0 im Repos

  3. Neo Dezember 3, 2008 7:54   Antworten

    Tja sehr mysteriös, es kommt mit var_dump gar nix, egal welche Variable ich einfüge. ich hab typo 4.2.1 und dm 2.6.0.

    Wahrscheinlich gehts damit gar nicht mehr. Mir würde genügen auch nur einen Eintrag in die tt_address zu tätigen, in einer Bedingung gekapselt. Halt ohne subscripe, hauptsache ich muss die Daten nicht selbst eintragen.

  4. mediavrog
    mediavrog Dezember 3, 2008 6:05   Antworten

    Hey,

    also ich habe einige Punkte feststellen können, welche Probleme bereiten könnten:

    1) plugin.tx_thmailformplus_pi1.saveUserFunc = fileadmin/metsoft/php/class.into_directmail.php:tx_into->rein_da
    verweist auf die Klasse “tx_into” aber deine Klasse ist “into_directmail” benannt

    2) in der Benennung kann auch ein Problem liegen: wenn Typo3 nicht explizit konfiguriert ist, müssen eigene Klassennamen mit dem Präfix user_ benannt werden (Beispiel: user_into_directmail)

    3) $_POST[‘FE’][‘tt_address’][‘name’] = $name; > wird nicht funktionieren, da $name nicht definiert ist (aber ist jetzt wahrscheinlich nur zum Beispiel noch da)

    Also ich denke dass die Methode wegen 1) und 2) noch nicht einmal aufgeführt wird. Schonmal var_dumps versucht um zu testen?

    Grüße

  5. Neo Dezember 3, 2008 4:58   Antworten

    Wahrscheinlich sind meine php-Kenntnisse einfach nicht ausreichend. Also ganz vereinfacht müsste es doch so laufen:
    Einmal in Typo

    //aufruf im root_template
    plugin.tx_thmailformplus_pi1.saveUserFunc = fileadmin/metsoft/php/class.into_directmail.php:tx_into->rein_da
    

    dann schlicht in der *.php

    class into_directmail{	
    	function rein_da(&$params, &$ref) {
    	
    	// Benötigte Klassen einbinden
    	require_once("typo3/sysext/cms/tslib/media/scripts/fe_adminLib.inc");
    	require_once(t3lib_extMgm::extPath('direct_mail_subscription').'pi/class.dmailsubscribe.php');
    	
    	// Konfiguration laden        
    	$conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['feadmin.']['dmailsubscription.'];
    	
    	// Template relativ zur aufrufenden Extension setzen wenn nötig
    	//$conf['templateFile'] = "../../../".$conf['templateFile'];
    	
    	// Post vars für die Anmeldung setzen
    	// etwas unschön, aber in meinem speziellen Fall angebracht
    	// (Alternative -> Formularfelder direkt Attribut name mit [FE][tt_address][name] usw. zuweisen
    	$_POST['FE']['tt_address']['name'] = $name;
    	$_POST['FE']['tt_address']['email'] = $params['data']['kemail'];
    	$_POST['FE']['tt_address']['module_sys_dmail_html'] = 1;
    	
    	// Initialisierung feAdmin Objekt               
    	$ua = new user_feAdmin();
    	$ua->cObj = t3lib_div::makeInstance('tslib_cObj');
    	$ua->init($content,$conf);
    	
    	}
    }
    

    $_POST kann ich ja nach belieben erweitern.

  6. mediavrog
    mediavrog Dezember 3, 2008 3:40   Antworten

    Hi,

    in meinem Post findest du einen Link zu einem PHP-Codeblock mit Beispielimplementation. Diesen verwende ich auch in einer Lösung welche online läuft und funktioniert. Jegliche Funktionalität wird eigentlich ohne Anpassung am Typoscript realisiert..

    Es kann höchstens sein, dass sich die Extensions geändert haben. Bei mir funktionierts mit direct_mail_subscription 1.1.0 und Typo3 4.0.5

  7. Neo Dezember 3, 2008 3:17   Antworten

    Das beschriebene würde genau mein Problem lösen, leider tut sich nach dem einbinden der userfunc (bei mir über Mailformplus in der saveUserFunc) gar nix. Außer als ich einmal die Pfadangabe zur *.php falsch gesetzt hatte. Es wird weder ein Eintrag getätitgt noch kommt ne Bestätigungsmail seitens directmail.
    Hat jemand ein konkretes Beispiel wo es funktioniert, samt seiner *.php und TS-Vorgabe.

    Wie ich festellen musste gibt es genau ein Suchergebnis, die genau mein Problem beschreibt und das ist diese Seite hier.

    Grüße Neo

Einen Kommentar hinterlassen