TYPO3: Extbase-Extensions erweitern mit Signal/Slots

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. [caption id="attachment_1125" align="alignnone" width="374"]Oberserver Observer Entwurfsmuster[/caption] 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.

Kommentare

Danke. Mit etwas Verspätung habe ich den Artikel mal aktualisiert.

Mal ein Update für Typo3 6.1 und 6.2 mit Extbase

// Name des Signals als Klassenkonstante des emittierenden Controllers setzen

const SIGNAL_BEFORE_REDIRECT = 'beforeRedirect';

// dann, in der controller action. signalSlotDisptacher steht aus den Elternklassen bereits zur verfügung, sonst selbst injecten

$this->signalSlotDispatcher->dispatch(__CLASS__, $hookName, $params);

// aus der ext_localconf.php der implementierenden Extension

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher')->connect(

'Vendor\\Class\\Of\\The\\Emitting\\Controller',

\Vendor\Class\Of\The\Emitting\Controller::SIGNAL_BEFORE_REDIRECT,

'Vendor\\The\\Implementing\\Class',

'methodToBeCalled'

);

--

ich würde mich freuen, wenn du deinen Beitrag darum ergänzt, da dieses Ergebnis in Google (zu recht) auf platz 1 zu für typo3 signal slot steht.

Deprecated wegen Umstellung auf Namespaces. Konzept bleibt erhalten, aber der Klassenname aendert sich. ;-)

[...] im Artikel TYPO3: Extbase-Extensions erweitern mit Signal/Slots angedeutet sollte noch ein Artikel über die Extension erscheinen die Powermail 2 erweitert: Und [...]

Hmm, da hast Du recht, in der <a href="http://api.typo3.org/extbase/current/" title="Extbase API">Extbase API</a> steht dazu aber nichts. Es sieht so aus als ob das Konzept Signal/Slots weiterhin vorhanden bleib, aber der SignalSlot_Dispatcher raus fliegt. Werde da aber nochmal nachforschen.

in der von euch verlinkten Api-Dokumentation

http://typo3.org/api/typo3cms/class_tx___extbase___signal_slot___dispatcher.html

Danke. Das Signal/Slots als depricated ausgewiesen sind ist mir neu und würde mich auch wundern, da es bei flow intensiv eingesetzt wird. Wo hast du das denn her? In der API Dokumentation von extbase/flow finde ich dazu nichts.

nettest Tutorial! In der Api Dokumentation wird dieses Feature bereits als deprecated ausgewiesen, gibts da schon eine Alternative?


Kommentar schreiben

* Diese Felder sind erforderlich