19. November 2012

Pimp up Powermail Emails

Die TYPO3-Extension powermail ist sehr mächtig und wir nutzen diese bei fast jedem Projekt, damit unsere Kunden aufwändige Email-Formulare selbständig bearbeiten und aufbauen können. Es gibt diese Erweiterung bereits in der Version 2.x - bei den meisten TYPO3-Installationen nutzen wir aber oft noch die Vorgänger-Version, da diese derzeit vom Funktionsumfang noch deutlich mehr bietet.

Immer wieder gibt es besondere Anforderungen auf Seiten des Kunden, die mit der standardmäßigen Konfiguration nicht einfach umzusetzen sind. In diesem Blogeintrag zeige ich ein paar sinnvolle Snippets, die uns das Leben einfacher gemacht haben.

Absolute Links aus dem RTE-Text in Emails generieren

Standardmäßig werden interne Links in TYPO3 relativ gesetzt und dabei die aktuelle Domain weggelassen. Da beim Versenden von Emails die gleiche Logik verwendet wird, lassen sich diese relativen Links nicht im Email-Client aufrufen, da in diesem Kontext die jeweilige Domain fehlt. Über eine TypoScript-Einstellung lässt sich dieses aber beheben. Es wird per Condition abgefangen, ob auf der aktuellen Seite das Powermail Plugin eingebunden ist, was über die mitgelieferte User-Funktion einfach erkannt werden kann. Dann werden automatisch alle Links in dem RTE mit der Domain vervollständigt, so dass diese in den Emails problemlos angeklickt werden können, auch wenn es sich dabei um interne Verlinkungen handelt:

[userFunc = user_powermailOnCurrentPage(0)]
lib.parseFunc_RTE.tags.link.typolink.forceAbsoluteUrl = 1
[end]

Styling der Emails

Möchte man komplett auf das Styling der Email verzichten und diese nicht als HTML-Version sondern als reinen Plaintext versenden, kann man dies über die Konstante

plugin.powermail.emailformat.recipient_mail = plain

erreichen, um diese z.B. durch ein Ticketsystem automatisch importieren zu können. Meistens möchte man jedoch das Aussehen der Email an das Corporate Design der Firma anpassen. Dies kann man über eigene Templates erreichen. Die beiden Dateien die dafür anzupassen sind lauten:

plugin.tx_powermail_pi1 {
  template.emails = fileadmin/templates/powermail/tmpl_emails.html?
  template.all = fileadmin/templates/powermail/tmpl_all.html
}

Da in einer HTML-Email keine externen CSS-Dateien geladen werden können, müssen die Styling-Angaben, wie in einem Newsletter, inline über das style-Attribut erfolgen. Um dies zu vereinfachen und zentral zu definieren, können in den Templates am besten Platzhalter verwendet werden, die beliebig benannt sein können. Zum Beispiel:

<!-- ###POWERMAIL_ALL### begin -->
  <table class="powermail_all" style="###POWERMAIL_TYPOSCRIPT_STYLE_TABLE###">
    <!-- ###CONTENT### --><!-- ###ITEM### -->
      <tr class="powermail_all_tr powermail_all_tr_###POWERMAIL_UID###">
        <td style="###POWERMAIL_TYPOSCRIPT_STYLE_TABLE_TH###" class="powermail_all_td powermail_all_label powermail_all_td_###POWERMAIL_UID###" valign="top">###POWERMAIL_LABEL###</td>
        <td style="###POWERMAIL_TYPOSCRIPT_STYLE_TABLE_TD###" class="powermail_all_td powermail_all_value powermail_all_td_###POWERMAIL_UID###" valign="top">###POWERMAIL_VALUE###</td>
      </tr>
    <!-- ###ITEM### --><!-- ###CONTENT### -->
  </table>
<!-- ###POWERMAIL_ALL### end -->

Die Werte der Styling-Attribute definiert man dann einfach in einem TypoScript-Template über das dynamicTyposcript von Powermail:

plugin.tx_powermail_pi1 {
  dynamicTyposcript {
    STYLE_TABLE = TEXT
    STYLE_TABLE.value = font-family:Verdana,sans-serif;border-collapse:collapse;border:1px solid #5EC5D6;width:100%
    STYLE_TABLE_TD = TEXT
    STYLE_TABLE_TD.value = border-bottom:1px solid #5EC5D6;padding:5px 10px 5px 10px
    STYLE_TABLE_TH < .STYLE_TABLE_TD
    STYLE_TABLE_TH.wrap = |;font-weight:bold;color:#0085BC?
    STYLE_TEXT = TEXT
    STYLE_TEXT.value = font-size:10.0pt;font-family:Verdana,sans-serif;color:black
  }
}

So kann man den Marker ###POWERMAIL_ALL### in den RTE-Texten weiterhin verwenden. Die dadurch generierte Tabelle wird dann in den gewünschten Farben / Aussehen in der Email platziert. Leider werden dabei alle Formularwerte in einer Tabelle generiert und können nicht getrennt oder unterschiedlich von einander dargestellt werden.

Aber auch dies ist mit den oben definierten Style-Markern möglich, in dem man sich im RTE das Formular individuell zusammenstellt und dabei auf die gleichen Werte zugreift:

<table style="###POWERMAIL_TYPOSCRIPT_STYLE_TABLE###">
 <tbody>
  <tr>
   <td style="###POWERMAIL_TYPOSCRIPT_STYLE_TABLE_TH###">Firma</td>
   <td style="###POWERMAIL_TYPOSCRIPT_STYLE_TABLE_TD###">###UID4###</td>
  </tr>
 </tbody>
</table>

Damit kann die Email individuell im RTE zusammen gestellt werden. Als Platzhalter wird dann direkt auf das jeweilige Feld z.B. ###UID4### zugegriffen.

Kopf- und Fußzeile in der Email

Möchte man die Werte aus dem Formular immer mit einer festen Kopf- und/oder Kopfzeile versehen, empfiehlt es sich diese Inhalte nicht in jedem Formular einzeln zu pflegen, sondern global in dem Email-Template von Powermail zu hinterlegen. So wird sicher gestellt, dass dieser Inhalt in allen verschickten Emails - egal aus welchem Formular dieser generiert wurde - identisch aussieht.

<!--###POWERMAIL_SENDER_MAIL### start-->
...
<p style="###POWERMAIL_TYPOSCRIPT_STYLE_TEXT###;color:blue">
  <a href="http://www.networkteam.com" style="color:blue">www.networkteam.com</a></p>
  <p style="###POWERMAIL_TYPOSCRIPT_STYLE_TEXT###;font-size:8.0pt">
    24103 Kiel | Kleiner Kuhberg 42<br />
    Fon +49 431 / 5 300 60-0 | Fax -99
  </p>?
<!--###POWERMAIL_SENDER_MAIL### stop-->

Bestimmte Felder in dem Email-Marker „###POWERMAIL_ALL###“ entfernen

Es ist bereits über die Konstante „plugin.powermail.markerALL.notIn“ möglich einzelne Felder aus dem Marker zu entfernen, so dass diese nicht in Emails übertragen werden. Der große Nachteil ist dann aber, dass dieser immer komplett entfernt wird - unabhängig davon ob es sich um die Bestätigungsseite oder die Email an den Sender / Empfänger handelt.

Möchte man jedoch nur bestimmte Werte z.B. aus der Bestätigungs-Email an den Absender entfernen, hilft der folgende TypoScript Code:

plugin.tx_powermail_pi1 {
  mode.sender_mail {
    {$powermail.markerALL.notInSenderEmail.field01} = TEXT
    {$powermail.markerALL.notInSenderEmail.field01}.value = 
    
    {$powermail.markerALL.notInSenderEmail.field02} = TEXT
    {$powermail.markerALL.notInSenderEmail.field02}.value = 
    ...
  }
}

Die Werte der entsprechenden Felder werden einfach mit leerem Inhalt überschrieben, so dass diese beim Versand der Email komplett ignoriert werden und daher nicht einmal das Label des Feldes in der Email erscheint. Die jeweiligen Felder lassen sich gut über Konstanten definieren, damit man pro Email-Formular in der TYPO3-Installation verschiedene Felder definieren kann.

# cat=networkteam powermail//0010; type=text; label= Powermail field name 01: which does not apear in sender email (e.g. uid23)
powermail.markerALL.notInSenderEmail.field01 =
# cat=networkteam powermail//0020; type=text; label= Powermail field name 02: which does not apear in sender email (e.g. uid23)
powermail.markerALL.notInSenderEmail.field02 =
...

Zwei Powermailfelder in einer Zeile zusammenführen

Über CSS-Styling ist es möglich zwei Felder wie z.B. Vor- und Nachname in einer Zeile zusammen anzuzeigen und dann auch nur ein gemeinsames Label dafür zu verwenden. Dabei entsteht aber das Problem, dass auf der Bestätigungsseite, den Emails oder auch der Danke-Seite wo der ###POWERMAIL_ALL### Marker verwendet wird, fälschlicherweise das gemeinsam genutzte Label z.b. "Vor- und Nachname" mit dem Wert des Vornamens und darunter noch einmal das Label "Nachname" mit dem Wert des Nachnamens ausgegeben wird. Um diese Unschönheit zu beheben dient dieses dynamisch nutzbare Snipped:

plugin.tx_powermail_pi1 {
  markerALL.notIn = ###UID{$powermail.merge.field02}###
  mode {
    confirmation {
      uid{$powermail.merge.field01} = TEXT
      uid{$powermail.merge.field01}.value = {field:uid{$powermail.merge.field01}} {field:uid{$powermail.merge.field02}}
      uid{$powermail.merge.field01}.insertData = 1
    }
    recipient_mail.uid{$powermail.merge.field01} < .confirmation.uid{$powermail.merge.field01}
    sender_mail.uid{$powermail.merge.field01} < .confirmation.uid{$powermail.merge.field01}
    thx.uid{$powermail.merge.field01} < .confirmation.uid{$powermail.merge.field01}
  }
}

Hierbei wird das zweite Feld komplett aus dem markerALL entfernt und anstelle dessen der übermittelte Wert mit an das erste Feld gehängt. Über die beiden Konstanten können dann pro Formular die IDs der beiden Felder gesetzt werden:

powermail.merge.field01 =
powermail.merge.field02 =
19. November 2012
Christian Lange

Christian Lange