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