Eigenes cObject richtig erstellen

An vielen Stellen ist es hilfreich, ein cObject zur Hand zu haben. So können etliche Aufgaben der Inhaltsverarbeitung einfach TYPO3 überlassen werden, und man muss als Extension-Entwickler nicht das Rad neu erfinden.

Ein neues cObject ist auch schnell instanziiert:

$localCObj = t3lib_div::makeInstance('tslib_cObj');

Damit steht einem eigentlich alles zur Verfügung. Eigentlich…

Ausgangslage

In einer TYPO3 4.5-Installation hatte ich den stdWrap via Hook um die replacement-Eigenschaft erweitert (Backport aus 4.6). Wie das geht, ist im Azubi-Blog von e-net schön beschrieben, und es funktioniert auch problemlos. Was leider nicht funktionierte, ist die Anwendung innerhalb des eigenen cObject.

Ursache

Nach stundenlangem Debugging (und zwischenzeitlichen verdacht eines Zusammenhangs zu Bug #17507) war schließlich die Ursache gefunden: die Klassenvariable tslib_cObj::stdWrapHookObjects ist bei Aufruf des stdWrap via TypoScript korrekt mit den Hooks gefüllt, beim Aufruf über das eigene cObject inner einer Extension nicht.

Wo wird also stdWrapHookObjects normalerweise gefüllt bzw. warum ist es aus der eigenen Extension heraus leer? Wenn man sich die tslib_cObj-Klasse genauer anschaut, erhält man schnell die Antwort: die Variable wird in der start()-Methode gefüllt. Und im Kommentar zur Methode steht wohl auch gleich die Begründung, warum im lokalen cObject bislang die Hooks fehlen:

/**
 * Class constructor.
 * Well, it has to be called manually since it is not a real constructor function.
 * So after making an instance of the class, call this function and pass to it a database record and the tablename from where the record is from. That will then become the "current" record loaded into memory and accessed by the .fields property found in eg. stdWrap.
 *
 * @param	array		$data	the record data that is rendered.
 * @param	string		$table	the table that the data record is from.
 * @return	void
 */

Lösung – Wenn schon, dann bitte richtig

Um also auch bei selbst instanziierten cObject die registrierten Hooks nutzen zu können, muss dieses zusätzlich gestartet werden:

$localCObj = t3lib_div::makeInstance('tslib_cObj');
$localCObj->start(array());

Quellen

Hinterlasse einen Kommentar.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.