TYPO3: formhandler Daten aus der Datenbank übernehmen

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

 

 

 


Beitrag veröffentlicht

in

von

Schlagwörter: