Typo3 PowerMail Finisher Beispiel

Donnerstag, 16. Februar 2017

Viele Jahre lang war Typo3 Formhandler das “Schweizer Messer” für uns in Sachen Formulare. Gerade die Möglichkeit, verschieden Hooks / Finisher und Preprocessoren zu implementieren machte Formhandler zu einer perfekten Basis aller komplizieren Wünsche und Anforderungen.

Eines Tages überraschte uns ein rotes Warnschild auf der Formhandler-Webseite, dass Formhandler nicht weiter entwickelt wird. Zeit sich nach Alternativen umzuschauen.

PowerMail hatten wir ehrlich gesagt über Jahre vernachlässigt: Es wirkte eher wie ein “Formularwerkzeug für Redakteure” und schien eher unflexibel und ungestaltbar. Aber weit gefehlt: Seit langer Zeit bietet auch PowerMail verschiedene Finisher – und spätestens seit der Umstellung auf Fluid und Bootstrap gibt es eigentlich keine Ausreden mehr.

Hier ein kurzes Beispiel für einen möglichen Ansatz, mit vielen verschiedenen PowerMail-Formularen umzugehen, die unterschiedliche Konfigurationen und Finisher aufrufen sollen.

Für Suchmaschinen: PowerMail Finisher nur für bestimmte Formulare. Eigene Mail-Funktion PowerMail. PowerMail Finisher Beispiel mit mehreren Formularen.

PowerMail Finisher: Aufruf des eigenen Finishers

Zunächst muss der Finisher “scharf” geschaltet werden. Das geht mit wenigen Zeilen TypoScript Setup:

plugin.tx_powermail.settings.setup {
   finishers {
      1 {
         class = Meine\Extension\Finisher\PowerMailFinisher
      }
   }
}

Danach werden ALLE Anfragen NACH dem Versand der E-Mail zusätzlich noch an unseren Finisher geschickt. Für den Fall, dass die Daten VOR dem Versand verändert werden sollen, gibt es übrigens auch einen PowerMail DataProcessor

Problem: Leider lässt sich so aber nicht steuern, wann und wo der Finisher nicht aufgerufen werden soll. Klar: Page-Conditions wären eine Möglichkeit:

[PIDinRootline = 123]
   plugin.tx_powermail.settings.setup.finishers.1 >
[global]

Nur leider: Spätestens, wenn das Formular auf eine anderer Seite kopiert wird gibt es ein Problem.

PowerMail Finisher: Konfiguration für einzelne Formulare

Hier gehen wir einen anderen Weg: Per TypoScript Setup definieren wir für jedes PowerMail-Formular beliebige Variablen und Einstellungen, die wir später verwenden wollen. KEY ist dabei die UID des PowerMail-Formulars (NICHT die tt_content.uid !). Lassen wir eine Key aus, wird später auch der Finisher abgebrochen.

plugin.tx_powermail.settings.setup.finishers.1.config {
 
   # KEY ist die uid des PowerMail-Formulars (NICHT tt_content.uid)
 
   # Konfiguration für das PowerMail-Formular mit der uid=1
   1 {
      beispiel = wert
      noch_ein_beispiel {
         was = immer
         ...
      }
   }
 
   # Konfiguration für das PowerMail-Formular mit der uid=2
   2 {
      ...
   }
 
   # Formular Nr. 3 ist ein normales Kontakt-Formular. 
   # Wir lassen hier einfach die Konfiguration aus.
 
   # Konfiguration für das PowerMail-Formular mit der uid=4
   4 {
      ...
   }
}

PowerMail Finisher

Der PowerMail Finisher selbst übernimmt dann die Auswertung und ggf. den Abbruch des Finishings, falls es keine Konfiguration für das PowerMail-Formular mit der aktuellen uid gibt:

namespace Meine\Extension\Finisher;
 
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
 
class PowerMailFinisher extends \In2code\Powermail\Finisher\AbstractFinisher {
 
   /**
    * @var \In2code\Powermail\Domain\Repository\MailRepository
    * @inject
    */
   protected $mailRepository;
 
   /**
    * @var \TYPO3\CMS\Extbase\Object\ObjectManager
    * @inject
    */
   protected $objectManager;
 
   public function myFinisher() {
 
      // Settings und Konfigurationen 
      $settings = $this->getSettings();
      $configuration = $this->getConfiguration();  
 
      // Ein cObject gibt es auch    
      $cObjData = $this->contentObject->data;
 
      // Beispiel: Gerenderte Mail holen
      $mail = $this->getMail();
 
      // Beispiel für den Zugriff auf FlexForm-Werte
      $ffService = GeneralUtility::makeInstance( \TYPO3\CMS\Extbase\Service\FlexFormService::class );
      $ffData = $ffService->convertFlexFormContentToArray( $cObjData['pi_flexform'] );
 
      // Die eigentliche uid des PowerMail-Formulars
      $powerMailFormUid = $settings['main']['form'];
 
      // Die spezielle Konfiguration für dieses Formular, falls vorhanden 
      $mailformConfig = $configuration[$powerMailFormUid];
 
      // Wenn keine Konfiguration vorhanden, dann Abbruch!
      if (!$mailformConfig) return;
 
      // Zugriff auf Formular-Daten
      $formData = $this->mailRepository->getVariablesWithMarkersFromMail($mail);
 
	  //
	  // und jetzt: Austoben!!
	  // 
 
      return true;
   }
 
}