2. Rund um Hooks
» Begriffsdefinition
» Hooks erkennen
» Hooks nutzen
» XClasses
3. www.cps-it.de
BEGRIFFSDEFINITION
• Hook sind dazu da, dass TYPO3-System zu erweitern und flexibel auf Ein- und Ausgabe reagieren
zu können
• Es können Funktionen und / oder Variablen abgeändert werden
• Hooks für Inhaltsveränderungen, Verhalten im Backend und Frontend
• Bekannte Beispiele: RealURL / CoolURI, DAM, News
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 3
4. www.cps-it.de
HOOKS ERKENNEN
• In den meisten Extensions sind Hooks im Manual definiert
• Für das Frontend online (http://buzz.typo3.org/people/stucki/article/typo3-frontend-rendering-
explained/)
• Für das Backend im TYPO3 Core nur über eine Suche im PHP-Code zu finden, aber dort sehr gut
kommentiert
• Extension „Useful informations in reports module” (additional_reports) listet vorhandene Hooks im
TYPO3-Backend auf
• Drei Arten von Hooks-Definitionen: „method_exists“-Variante, „Hook-Object“-Variante (empfohlen,
wenn in einer Funktion mehrere Hooks integriert werden sollen), „callUserFunction“-Variante
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 4
5. www.cps-it.de
HOOKS ERKENNEN
1. „method_exists“-Variante
if (is_array
($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauthgroup.php']['fetchGro
upQuery'])) {
foreach
($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauthgroup.php']['fetchGro
upQuery'] as $classRef) {
$hookObj = t3lib_div::getUserObj($classRef);
if(method_exists($hookObj,'fetchGroupQuery_processQuery')){
$whereSQL = $hookObj->fetchGroupQuery_processQuery($this, $grList, $idList, $whereSQL);
}
}
}
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 5
6. www.cps-it.de
HOOKS ERKENNEN
2. „Hook-Object“-Variante
$hookObjectsArr = array();
if (is_array
($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'])) {
foreach
($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'] as
$classRef) {
$hookObjectsArr[] = t3lib_div::getUserObj($classRef);
}
}
foreach($hookObjectsArr as $hookObj) {
if (method_exists($hookObj, 'processDatamap_preProcessFieldArray')) {
$hookObj->processDatamap_preProcessFieldArray($incomingFieldArray, $table, $id, $this);
}
}
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 6
7. www.cps-it.de
HOOKS ERKENNEN
3. „callUserFunction“-Variante
if (is_array($this-
>TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-
PostProc'])) {
$_params = array('pObj' => &$this);
foreach($this-
>TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-
PostProc'] as $_funcRef) {
t3lib_div::callUserFunction($_funcRef,$_params,$this);
}
}
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 7
8. www.cps-it.de
HOOKS NUTZEN
• Grundlegend wird die „Aktivierung“ in der ext_localconf.php vorgenommen
• Immer abhängig vom verwendeten Hook
• Für Core-Hooks wird $GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']
[[dir]/class.[classname].php][hookname] verwendet
• Bei Extensions über $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][extkey][hookname]
• Immer ein Array, dass im besten Fall assoziativ (mit Extension-Key) verwendet wird
Varianten 1 und 2 erwartet eine Datei- / Klassenkombination (Funktion durch Hook vorgegeben)
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']
['processDatamapClass'] ['tt_news'] =
'EXT:tt_news/lib/class.tx_ttnews_tcemain.php:tx_ttnews_tcemain';
Variante 3 erwartet eine Datei- / Klassen- / Funktionskombination
$TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-
PostProc'] ['tx_realurl'] = 'EXT:realurl/class.tx_realurl.php:&tx_realurl->decodeSpURL';
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 8
9. www.cps-it.de
HOOKS NUTZEN
Aufgerufene Hook-Funktion:
foreach($hookObjectsArr as $hookObj) {
if (method_exists($hookObj, 'processDatamap_preProcessFieldArray')) {
$hookObj->processDatamap_preProcessFieldArray($incomingFieldArray, $table, $id, $this);
}
}
Klassendefinition (nach „method_exists“ und „hook-objects“ Varianten)
<?php
class tx_ttnews_tcemain {
function processDatamap_preProcessFieldArray(&$fieldArray, $table, $id, &$pObj) {
[…]
}
}
?>
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 9
10. www.cps-it.de
HOOKS NUTZEN
Aufgerufene Hook-Funktion:
if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-
PostProc'])) {
$_params = array('pObj' => &$this);
foreach($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-PostProc'] as
$_funcRef) {
t3lib_div::callUserFunction($_funcRef,$_params,$this);
}
}
Klassendefinition (nach „callUserFunction“-Variante)
<?php
class tx_realurl_tcemain {
public function decodeSpURL($params) {
[…]
}
}
?>
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 10
11. www.cps-it.de
XCLASSES
• Am Ende (fast) jeder Klassen-Datei
• Hiermit werden Klassen überschrieben (überlagert)
• Funktionen können somit hinzugefügt / erweitert werden
Nachteile:
• Es kann jeweils nur eine Erweiterung pro Klasse eingesetzt werden
• Zwingender Einsatz von t3lib_div::makeInstance bei Aufruf der Klasse
• Sehr wartungsanfällig, da XCLASS meist an die jeweilige TYPO3-Version angepasst werden muss
CPS-IT mehr wert im netz TYPO3 // Rund um Hooks Seite 11