philx17
Würde nur gerne noch verstehen worin der gravierende Unterschied besteht.
Noch zur Erklärung weshalb deine erste Schreibweise nicht funktioniert hatte:
Wenn man sich den Core-Code, der einen Hook implementiert, ansieht, wird deutlich, dass es zwei verschiedene Hook-Varianten gibt. Es gibt sowohl Hooks, die die Angabe eines Funktionsnamens erwarten als auch Hooks, die von bestimmten Funktionen ausgehen und keine zusätzliche Angabe erfordern.
Beispiel eines Hooks mit frei wählbarem Funktionsnamen:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearCachePostProc'][] =
DataHandlerHook::class . '->postProcessClearCache';
wird im Core-Code des DataHandlers wie folgt eingebunden:
foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearCachePostProc'] ?? [] as $_funcRef) {
GeneralUtility::callUserFunction($_funcRef, $_params, $this);
}
(in vendor/typo3/cms-core/Classes/DataHandling/DataHandler.php
)
Hier wird GeneralUtility::callUserFunction
genutzt, um zu prüfen, ob der von dir definierte Funktions-String auch tatsächlich als Funktion existiert. Falls die Funktion existiert, wird sie mit den definierten Parametern aufgerufen.
Beispiel eines Hooks ohne Angabe eines Funktionsnamens:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] =
DataHandlerHook::class;
Die Einbindung erfolgt in diesem Fall im Code des DataHandlers folgendermaßen:
foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'] ?? [] as $className) {
$hookObject = GeneralUtility::makeInstance($className);
if (method_exists($hookObject, 'processDatamap_beforeStart')) {
$hookObject->processDatamap_beforeStart($this);
}
$hookObjectsArr[] = $hookObject;
}
Es wird also ein Array von Hook-Objekten befüllt, welches an verschiedenen Stellen im DataHandler Code zur Ausführung definierter Methoden (→ Funktionen einer Klasse nennt man "Methoden") verwendet wird.
Zudem wird sogar schon vor der Befüllung des Arrays die erste definierte Methode processDatamap_beforeStart
ausgeführt.
Im Grunde sieht der Code, der das Hook-Array später nutzt immer gleich aus:
foreach ($hookObjectsArr as $hookObj) {
if (method_exists($hookObj, 'DER_METHODENNAME')) {
$hookObj->DER_METHODENNAME($irgend, $welche, $parameter, $des, $aktuellen, $kontextes);
}
}
Für alle Hooks, die unter
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']
definiert wurden, werden die folgenden definierten Methodennamen geprüft und, falls vorhanden, mit den Parametern des jeweiligen Kontextes aufgerufen:
processDatamap_afterDatabaseOperations
processDatamap_beforeStart
processDatamap_preProcessFieldArray
processDatamap_postProcessFieldArray
processDatamap_afterAllOperations