Eine häufige Anforderung bei Formularen besteht darin, die Empfänger über den Betreff zu ermitteln und die verschiedenen Betreff Möglichkeiten aus einer Auswahlliste zu beziehen.
Zu diesem Zweck verwende ich die Funktion der dynamischen Marker von Formhandler in Kombination mit tt_address Einträgen.
Das Formular biete im Frontend eine Auswahlliste mit Themen. Die Einträge stellen dabei den Betreff der Mail dar. Um je nach Betreff einen anderen Empfänger, z.B. eine Abteilung zuzuordnen, bietet es sich an, dies über tt_address Datensätze zu steuern. Die tt_address Datensätze stellen dabei die Auswahlliste als auch den Empfänger pro Eintrag.
Die Einträge werden aus tt_address Datensätze ermittelt. Als "value" wird nicht die E-Mail Adresse, sondern die uid des tt_address Datensatzes verwendet (Spam Schutz).
Nachfolgend das Setup zu dieser Anforderung. Getestet in TYPO3 Version 6.2
Der dynamische Marker "options_recipient" wird im HTML Template verwendet. Der Name kann frei gewählt werden.
# Dynamic recipients from database table markers.options_recipient = CONTENT markers.options_recipient { table = tt_address select { #pid where addresses are stored. Get from constants entry pidInList = {$themes.customer.storage.form.address.id} orderBy = sorting selectFields = uid, email, name max = 10 } renderObj = COA renderObj { #value 10.wrap = 13.insertData = 1 } }
Da in der Auswahlliste im Frontend nicht die E-Mail Adresse als value, sondern die uid des tt_address Datensatzes verwendet wird (Spam Schutz), muss die E-Mail Adresse beim Absenden des Formulars ermittelt werden.
Dazu wird der "admin" Eintrag im finisher wie folgt konfiguriert.
("contact-basic" aus der Abfrage entspricht dem Eintrag "formValuesPrefix" aus der Basiskonfiguration.)
admin { templateFile = TEXT templateFile.value = {$themes.configuration.forms.contact.basic.templatePath}ContactBasic/email-admin.html sender_email = {$themes.configuration.forms.contact.basic.email.admin.sender.email} sender_name = {$themes.configuration.forms.contact.basic.email.admin.sender.name} # Get recipient from database table to_email = CONTENT to_email { table = tt_address select { selectFields = email pidInList = {$themes.customer.storage.form.address.id} #uid from contact form andWhere { data = GP:contact-basic|subject wrap = uid=| } max = 1 } renderObj = COA renderObj { 10 = TEXT 10.field = email } } to_name < to_email replyto_email = {$themes.configuration.forms.contact.basic.email.replyto.email} replyto_name = {$themes.configuration.forms.contact.basic.email.replyto.name} subject = TEXT subject.data = LLL:{$themes.configuration.forms.contact.basic.languagePath}:email_admin_subject }
Damit in der E-Mail nicht die uid sondern der Name im Betreff erscheint, muss der Name über die uid ermittelt werden. Dazu konfiguriere ich einen saveInterceptors Eintrag.
# Rewrite the subject from uid to name saveInterceptors { 1.class = Tx_Formhandler_Interceptor_StdWrap 1.config.fieldConf { subject = CONTENT subject { table = tt_address select { selectFields = name pidInList = {$themes.customer.storage.form.address.id} #uid from contact form andWhere { data = GP:contact-basic|subject sanitize = 1 wrap = uid=| } max = 1 } renderObj = COA renderObj { 10 = TEXT 10.field = name } } } }
Die Adressen werden über eine Orderstruktur verwaltet. Für unterschiedliche Themen in anderen Formularen, wird entsprechend die pid angepasst. Das Setup kann aber auch für die Verwendung von Kategorien angepasst werden.
In den tt_address Datensätzen müssen das Feld "Name" und "Email" gefüllt sein. Bei Verwendung anderer Felder muss das Setup entsprechend angepasst werden.
Um die Sortierung der tt_address Datensätze manuell über das Feld "sorting" einzustellen, bedarf es einer entsprechenden Erweiterung der tt_address Extension.