Hooks
Hooks stellen pre- und post-processing Userfunktionen zur Verfügung. Der Vorteil ggü. XCLass ist die möglichkeit eine Klasse mehrfach erweitern zu können, durch mehrere Extensions.
Klasse: t3lib/class.t3lib_tcemain.php.
Methode: process_datamap
Methode getUserObj
Bevorzugte Methode
Klasse die erweitert werden soll
Hook Klasse finden
// First prepare user defined objects (if any) for hooks which extend this function:
$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);
}
}
Hook Methode suchen und aufrufen
// Hook: processDatamap_postProcessFieldArray
foreach($hookObjectsArr as $hookObj) {
if (method_exists($hookObj,'processDatamap_postProcessFieldArray'))
{
$hookObj->processDatamap_postProcessFieldArray($status, $table, $id, $fieldArray, $this);
}
}
Erweiterungsklasse
Anlegen der Klasse
Klasse: class.tx_rsyshook_tcemainprocdm.php
Methode: function processDatamap_postProcessFieldArray ($status, $table, $id, &$fieldArray, &$reference) {}
Klasse inkludieren (in ext_localconf.php)
// Erweiterungsklasse Hook inkludieren
require_once(t3lib_extMgm::extPath('rsys_hook').'class.tx_rsyshook_tcemainprocdm.php');
Achtung: keine Leerzeichen vor dem ersten <?php ... sonst gibt's Fehler (header output already started etc.)
Klasse registrieren (in ext_localconf.php)
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:rsyshook/class.rsyshook_tcemainprocdm.php:tx_rsyshook_tcemainprocdm';
Methode
Der Name der Methode muss genau der sein der aufgerufen wird von der zu erweiternden Klasse (im Sourcecode nachsehen)
function processDatamap_postProcessFieldArray ($status, $table, $id, &$fieldArray, &$reference) {
$row = t3lib_BEfunc::getRecord ($table, $id);
if ($status == 'update' && $table == 'tt_content') {
if (is_array ($row)) {
$dataArr = array ();
$dataArr['pages'][$row['pid']]['lastUpdated'] = time();
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start($dataArr, array());
$tce->process_datamap();
}
}
}
Variation
Klasse die erweitert werden soll
Die Extension seminars hat den Hook anders definiert. Hier das Beispiel dazu:
var $hookObjects = array();
...
$this->getHookObjects();
Methodenaufruf:
// call single view hook
foreach ($this->hookObjects as $hookObject) {
if (method_exists($hookObject, 'modifySingleView')) {
$hookObject->modifySingleView($this);
}
}
Hooks einlesen (nicht wie üblich in ['TYPO3_CONF_VARS']['SC_OPTIONS']):
function getHookObjects() {
$extensionConfiguration =& $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'];
$hooks =& $extensionConfiguration['seminars/pi1/class.tx_seminars_pi1.php']['hooks'];
if (is_array($hooks)) {
foreach ($hooks as $classReference) {
$this->hookObjects[] = t3lib_div::getUserObj($classReference);
}
}
return;
}
Erweiterungsklasse
Anlegen der Klasse
Klasse: class.tx_rsysseminarsext_modsingleview.php
Methode: function modifySingleView($reference) {}
Klasse inkludieren (in ext_localconf.php)
// include hook class
require_once(t3lib_extMgm::extPath('rsys_seminars_ext').
'class.tx_rsysseminarsext_modsingleview.php');
Klasse registrieren (in ext_localconf.php)
// Register my hook objects
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']
['seminars/pi1/class.tx_seminars_pi1.php']['hooks'][]=
'EXT:rsyshook/class.tx_rsysseminarsext_modsingleview.php
:tx_rsysseminarsext_modsingleview';
Methode
Der Name der Methode muss genau der sein der aufgerufen wird von der zu erweiternden Klasse (im Sourcecode nachsehen)
function modifySingleView($parent) {
$parent->setMarkerContent('title', "All Seminars have the same name");
}
Methode callUserFunc
############################
# New Version:
############################
if ($this->conf['saveUserFunc']) {
$params['config'] = $this->conf['saveUserFunc.'];
$params['data'] = $this->get_post;
t3lib_div::callUserFunction($this->conf['saveUserFunc'],$params,$this,"");
}