TYPO3: Extbase-Extensions erweitern mit Signal/Slots

18. Februar 2013 | 8 Kommentare

TYPO3 LogoFrüher (vor Extbase) ließen sich TYPO3-Extension entweder per XCLASS oder Hooks erweitern. Beides ist mit Extbase nicht mehr möglich.  Extbase-Extensions erweitert man über Signal/Slots oder Dependency Injections.

Ich will Euch in den nachfolgenden Tutorial an einem Beispiel erklären, wie man Powermail 2 via Signal/Slots erweitert.

Signal/Slots entsprechen dem Beobachter Entwurfsmuster (Obersver Pattern), bei dem es ein „beobachtbares“ Objekt gibt, das bestimmte Zustände hat und weitere Objekte die diese Zustände „beobachten“ und z. B. ausgeben können. Zum Beispiel kopiere erstelle ich per Konsole/Command eine Datei. Andere Programme (wie z.B. der Explorer, Finder etc) werden über diese Veränderung benachrichtigt und zeigen die neue Datei an.

Oberserver

Observer Entwurfsmuster

Signal und Slots verhalten sich ähnlich: Slots warten auf ein Signal und führen dann eine Funktion aus. Das Objekt „Beobachtbar“ würde in diesem Fall ein Signal abgeben. Damit Signals und Slots jedoch miteinander agieren können müssen sie verbunden werden. Hier lassen sich einige parallelen zu Hooks erkennen.

Beispiel: Powermail erweitern

Schauen wir uns ein konkretes Beispiel an: die Extension powermail, welche in der aktuellen Version (2.x) extbase verwendet (und somit keine Hooks zulässt).

Zunächst erstellen wir eine neue Extension (powermailpdf). In dieser erstellen wir eine Klasse die die Klasse von powermail erweitert, die das zu behandelte Signal beinhaltet und eine Funktion die ausgeführt werden soll, sobald powermail dieses Signal sendet. In unserm Beispiel ist das die Klasse Tx_Powermail_Controller_FormsController und das Signal createActionBeforeRenderView, dieses wird gesendet sobald ein Benutzer ein Formular endgültig abgeschickt hat und eine Bestätigungsseite erscheint.

class Tx_Powermailpdf_Pdf extends Tx_Powermail_Controller_FormsController {
  function callMe() {
    echo „Läuft“
  }
}

Jetzt wissen wir, wann und was wir machen wollen, nämlich „Läuft“ ausgeben wenn die Bestätigungsseite von powermail generiert wird.

Jetzt müssen wir nur noch das Signal und den Slot verbinden. Dies wird mit dem SignalSlot Dispatcher (dazu TYPO3-Api Dokumentation) gemacht.

In der ext_localconf.php unserer Extension fügen wir dazu Folgendes hinzu:

$signalSlotDispatcher = t3lib_div::makeInstance('Tx_Extbase_SignalSlot_Dispatcher');
$signalSlotDispatcher->connect('Tx_Powermail_Controller_FormsController', 'createActionBeforeRenderView', 'Tx_Powermailpdf_Pdf', 'callMe'

Update
Seit TYPO3 6.2 hat sich ein bisschen was geändert (Danke Lukas):

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher')->connect(
		'In2code\\Powermail\\Controller\\FormController',
		'createActionBeforeRenderView',
		'Tx_Powermailpdf_Pdf',
		'callMe'
);

Zum Verständnis des zweiten Zeile: $signalSlotDispatcher->connect ...
connect (
 $sinal,
 $signalName,
 $slotClassNameOrObject,
 $slotMethodName = '',
 $passSignalInformation = TRUE
)

Jetzt können wir die neue Extension installieren und sobald ein powermail Formular abschickt würde, müsste „Läuft“ ausgebenden werden.

All dies kann in der Extension powermailpdf im TER nachvollzogen werden. Die Extension schreibt alle ausgefüllten Felder von powermail in ein PDF und bietet es zum Download an. Dazu wird demnächst noch ein kleiner Artikel erscheinen.

Ähnliche Artikel:

Meta-Daten



8 Kommentare

Auch mal Kommentieren:

Kommentar