In einigen Extensions wird der FE Output von TYPO3 über den Hook „contentPostProc-output“ geändert (z.B. Hinzufügen von Tooltips, Verbessern des HTML Quellcodes, Spam-Verhütung durch Form Manipulation, etc…). Bei Verwendung dieses Hooks (Was ist eigentlich ein Hook und was kann man damit in TYPO3 machen?) wird man schnell feststellen, dass es Probleme gibt, sobald die Seite aus dem Cache kommt. Ronald Steiner hat eine elegante Lösung für dieses Problem gefunden…
Ich habe mich auch länger mit dem Problem auseinandergesetzt und nach intensiver Suche festgestellt, dass Typoscript über $GLOBALS[‚TSFE‘]->tmpl->setup nicht mehr zur Verfügung steht, sobald die Seite aus dem Cache kommt. Danach habe ich sämtliche Hooks durchprobiert und auch versucht die GLOBALS manuell zu initialisieren, was mir teilweise auch geglückt ist (jedoch mit sehr viel überflüssigem Code).
Zeitgleich kam Ronald auf eine genial einfache Lösung, die er in seiner spamshield einsetzt. Warum nicht zwei Hooks nutzen. Ein Hook für die USER_INT und COA_INT Objekte und einen anderen Hook für die gecachten Seiten: Somit werden zwei verschiedene Methoden aufgerufen, die unsere Hauptmethode nutzen. In der Funktion main() steht somit $GLOBALS[‚TSFE‘]->tmpl->setup immer zur Verfügung (siehe nachfolgendes Code Beispiel).
Beispiel Code:
ext_localconf.php:
// hook is called after Caching / pages with COA_/USER_INT objects. $TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-output'][] = 'EXT:ext/class.file.php:&tx_ext->noCache'; // hook is called before Caching / pages on their way in the cache. $TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all'][] = 'EXT:ext/class.file.php:&tx_ext->cache'; |
class.file.php:
class tx_ext { public function main(&$params, &$obj) { $this->conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_ext.']; // get conf t3lib_div::debug($this->conf); // see configuration array # manipulate output example if ($this->conf['bla'] == 1) { // if something is set in typoscript $params['pObj']->content = str_replace('x', 'y', $params['pObj']->content); // replace x with y in FE } } public function noCache(&$params, &$obj) { if (!$GLOBALS['TSFE']->isINTincScript()) { // If there are no INTincScripts to include return; // stop } $this->replaceTooltips($params, $obj); // call main replace function } public function cache(&$params, &$obj) { if ($GLOBALS['TSFE']->isINTincScript()) { // If there are any INTincScripts to include return; // stop } $this->replaceTooltips($params, $obj); // call main replace function } } |
Links zum Thema:
Extensions von/mit Ronald Steiner:
Cheers, Alex