TYPO3 und der cHash

TYPO3 LogoVielleicht hatten ja schon einige von euch das Phänomen: Man hat eine TYPO3-Extension mit einer filterbaren Liste von Datensätzen gebaut. Sagen wir mal, die Datensätze sind filterbar nach Typ (groß, mittel, klein). Der Filter funktioniert, und die Seite geht live. Alles gut. Denkste! Bis irgendwann auf der Listenansicht immer der Filter „groß“ aktiviert ist. Nach dem Löschen des Caches verschwindet dieses Problem (tritt aber nach ein paar Tagen wieder auf). Ähnliches passiert, wenn die Listen- und die Einzelansicht auf der selben PID sind: Dann kommt beim Aufrufen der Liste eine Einzelansicht von irgendeinem(!) Datensatz. Das Problem hat etwas mit einem fehlenden cHashes zu tun. Normalerweise sehen TYPO3-Links für eine Filter in etwa so aus:
domain.com/index.phpid=37&tx_eventmgmt_list[action]=filter&tx_eventmgmt_list[controller]=Event&x_eventmgmt_list[type]=groß&cHash=15287741c8e2739a53f74b098b940e22
Damit weiß TYPO3, dass die aktuellen Parameter dieser Seite zu dem cHash gehören und die Seite abhängig von diesem gecacht wird. Fehlt der cHash, werden die Parameter zwar ausgewertet, aber das Caching System weiß von diesen nichts. Wenn der Cache gelöscht wird, und der erste Aufruf der Seite mit Parametern, aber ohne cHash geschieht, dann wird diese Seite im Cache abgelegt. Sprich, entweder ist ein Filter aktiv, oder eine Einzelansicht ist aktiv im Cache.
domain.com/index.phpid=37&tx_eventmgmt_list[action]=filter&tx_eventmgmt_list[controller]=Event&x_eventmgmt_list[type]=groß
Es verschieden Möglichkeiten, dieses Problem zu steuern: 1. Möglichkeit Seit TYPO3 6.x gibt es die Einstellung: [FE][cHashRequiredParameters] = Trägt man dort die Parameter ein, werden diese bei URLs ohne cHash ignoriert. Zum Beispiel: tx_bestpractice_list[bestPractice],tx_bestpractice_list[action],tx_bestpractice_list[controller] 2. Möglichkeit
$GLOBALS['TSFE']→reqCHash();
Zu allen betroffenen Actions hinzufügen. Wenn im Install Tool [pageNotFoundOnCHashError] = 1 eingestellt ist, führt reqCHash() zu einer "Page Not Found"-Fehlermeldung im Frontend, sonst wird der Aufruf einfach nicht gecacht. Allerdings möchte man ja vielleicht auch wissen, woher diese Links ohne cHash eigentlich stammen. Dazu habe ich einen BaseController geschrieben, von dem ein Controller erben kann. Dieser beinhaltet die Funktion requireCacheHash.
class BaseController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

  /**
  * @var \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
  */

  protected $typoScriptFrontendController;
  
  /**
  * Requires CHash for the current action
  * log to devLog if no CHash was given
  * 
  * @return void
  */
  protected function requireCacheHash() {
    if (is_null($this->typoScriptFrontendController)) {
      $this->typoScriptFrontendController = $GLOBALS['TSFE'];
    }
    $this->typoScriptFrontendController->reqCHash();
    if(!$this->typoScriptFrontendController->cHash) {
      GeneralUtility::devLog(
        "There was no cHash given to this action, 1410970141",
        $this->extensionName,
	GeneralUtility::SYSLOG_SEVERITY_NOTICE,
	array(
	  'referrer' => GeneralUtility::getIndpEnv('HTTP_REFERER'),
	  'requestUri' => GeneralUtility::getIndpEnv('REQUEST_URI'),
	  'controller' => $this->controllerContext->getRequest()->getControllerName(),
	  'action' => $this->controllerContext->getRequest()->getControllerActionName(),
	)
      );
    }
  }
}
Die Funktion erzwingt einen cHash beim Aufruf der Action und schreibt bei fehlendem cHash den Referer und die request Uri in das devLog. Weiterführende Links:http://forum.typo3.org/index.php/t/200447/

Kommentare

Vielen Dank für die ausführliche Erklärung. Hat mir gerade weitergeholfen.

Gruss René


Kommentar schreiben

* Diese Felder sind erforderlich