Typo3 PowerMail Finisher Beispiel

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

}