Offenbar mutiert formhandler gerade zu einem meiner Lieblingsthemen in Typo3. Auch an dieser Stelle wieder der Hinweis: formhandler wird nicht mehr aktiv weiterentwickelt!
Der Kundenwunsch ist eine Double-Opt-In Anmeldung für einen Newsletter mit tt_address und formhandler. Als kleines Schmankerl soll jedoch nach erfolgreicher Freischaltung bzw. Aktivierung der Newsletteranmeldung durch den Abonnenten der Administraotr der Seite noch zusätzlich per Email darüber informiert werden. Hintergrund für das Email an den Administrator ist die Verwendung einer eigenen Adressverwaltung, welche jedoch nicht extern erreichbar ist.
Als Grundlage dient mir hierbei die Konfiguration von Browserwerk, welche bereits eine recht gute Anleitung zum Thema geschrieben haben.
Konfiguration AuthCode-Validierung
Die Konfiguration für das Email ist recht einfach. Hier gilt es nur zu beachten, dass der „AuthCodeValidator“ keine redirectPage hat – sonst leitet er bei erfolgreicher Validierung weiter an die „Erfolg“-Seite, noch bevor das Email verschickt werden kann. Hier ist es also wichtig, nur die errorRedirectPage zu setzen.
preProcessors { 1.class = PreProcessor_LoadGetPost 10.class = PreProcessor_ValidateAuthCode 10.config { errorRedirectPage = 123 hiddenField = hidden uidField = uid table = tt_address } }
Konfiguration Email-Finisher
Das ist soweit kein Problem, man kann ja einen entsprechenden Finisher setzen, der dies übernimmt. Dort werden auch die Settings für das Versenden des Bestätigungsmails an den Admin eingestellt.
finishers { 3.class = Finisher_Mail 3.config { checkBinaryCrLf = message admin { templateFile = TEXT templateFile.value = Pfad-zu/html/email-admin.html sender_email = newsletteranmeldung@example.com to_email = admin@example.com subject = TEXT subject.data = LLL:Pfad-zu/lang/lang.xml:email_admin_subject } user > } 4.class = Finisher_Redirect 4.config { redirectPage = 134 } }
Nun funktioniert das Formular soweit wie vom Kunden gewünscht. Der Abonennt meldet sich an, bekommt ein Email mit einem Link zur Bestätigung, und erst nach Klick auf den Link ist er freigeschaltet. Aber wie bekommt man aber nun die Information der Anmeldung (z.B. Email oder Name) in das Bestätigungsemail an den Admin? Man könnte es sich ja einfach machen und die Email mit als URL Parameter mitgeben. Das ist aber weder schön, noch gut, noch sinnvoll. Aber man bekommt ja die uid mitgeliefert.
Markers
In meiner Lösung verwende ich die Markers von formhandler, um zum einen die uid aus der URL auszulesen und dann den Datensatz aus tt_address auszulesen. Das Ganze findet noch vor dem PreProcessor statt. Bei pidInList sollte der Speicherort der tt_address-Datensätze angegeben werden.
markers { registermail = CONTENT registermail { table = tt_address select { pidInList = 154 selectFields = email where.dataWrap = uid={GP:subscription|uid} } renderObj = COA renderObj { 10.wrap = "|" 10 = TEXT 10.field = email } } }
Jetzt kann man ohne weiteres im mastertemplate an beliebiger Stelle, zum Beispiel im Admin-Mail, mit ###registermail### auf die aus der Datenbank ausgelesenen Emailadresse zugreifen und diese so an den Admin übermitteln.
<!-- ###master_email-admin-start-plain### --> ###LLL:email_admin_text### ###registermail### <!-- ###master_email-admin-start-plain### --> <!-- ###master_email-admin-start-html### --> <p><strong>###LLL:email_admin_text###</strong></p> <p>###registermail###</p> <br /> <table> <!-- ###master_email-admin-start-html### -->
Die fertige Typoscript-Konfiguration
Die komplette Typoscript-Konfiguration kann dann so aussehen:
plugin.Tx_Formhandler.settings.predef.double-opt-in-confirm { name = Newsletter Registrierung - Validierung skipView = 1 formValuesPrefix = subscription langFile.1 = TEXT langFile.1.value = {$formhandler.double-opt-in-confirm.rootPath}/lang/lang.xml templateFile = TEXT templateFile.value = {$formhandler.double-opt-in-confirm.rootPath}/html/step-1.html # The master template is a file containing the markup for specific field types or other sub templates (e.g. for emails). You can use these predefined markups in your HTML template for a specific form. masterTemplateFile = TEXT masterTemplateFile.value = {$formhandler.double-opt-in-confirm.rootPath}/html/mastertemplate.html # CSS files cssFile { 10 = TEXT 10.value = {$formhandler.double-opt-in-confirm.rootPath}/skin/css/none.css 10.if.isTrue = {$formhandler.double-opt-in-confirm.includeFoundationCSS} 20 = TEXT 20.value = {$formhandler.double-opt-in-confirm.rootPath}/skin/css/none.css } # In case an error occurred, all markers ###is_error_[fieldname]### are filled with the configured value of the setting "default". isErrorMarker { default = error } markers { registermail = CONTENT registermail { table = tt_address select { pidInList = {$formhandler.double-opt-in-confirm.recordStorage} selectFields = email where.dataWrap = uid={GP:subscription|uid} } renderObj = COA renderObj { 10.wrap = "|" 10 = TEXT 10.field = email } } } preProcessors { 1.class = PreProcessor_LoadGetPost 10.class = PreProcessor_ValidateAuthCode 10.config { errorRedirectPage = {$formhandler.double-opt-in-confirm.redirectErrorPage} hiddenField = hidden uidField = uid table = tt_address } } finishers { 3.class = Finisher_Mail 3.config { checkBinaryCrLf = message admin { templateFile = TEXT templateFile.value = {$formhandler.double-opt-in-confirm.rootPath}/html/email-admin.html sender_email = {$formhandler.double-opt-in-confirm.email.admin.sender_email} to_email = {$formhandler.double-opt-in-confirm.email.admin.to_email} subject = TEXT subject.data = LLL:{$formhandler.double-opt-in-confirm.rootPath}/lang/lang.xml:email_admin_subject } user > } 4.class = Finisher_Redirect 4.config { redirectPage = {$formhandler.double-opt-in-confirm.redirectSuccessPage} } } # These wraps define how an error message looks like. The message itself is set in the lang file. singleErrorTemplate { totalWrap = <small class="error">|</small> } }