Formhandler Empfänger gemäß Betreff ermitteln.

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

Formhandler Setup

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

Formhandler Master Template

  

    

Formhandler Setup

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
}

Formhandler Setup

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.