VHS:Render.Uncache Viewhelper TYPO3 Fatal Error

Ich habe vor einigen Tagen mit dem Render.Uncache Viewhelper gearbeitet, da ich für ein Projekt einen Teilbereich meines Templates nicht gecacht haben wollte, wohingegen der Rest des Templates gerne gecacht werden durfte. Nach kurzer Recherche habe ich den ViewHelper Render.Uncache von https://fluidtypo3.org/viewhelpers/vhs/2.4.0/Render/UncacheViewHelper.html gefunden. Dieser scheint genau das zu bieten was ich gesucht habe.

Nach der Installation und Nutzung des ViewHelper war ich jedoch erst einmal ernüchtert.
TYPO3 Fatal Error: Extension key "" is NOT loaded!
TYPO3-Fehler

Die obige Fehlermeldung hat mich anschließend eine gewisse Zeit und ein paar Nerven gekostet. Nach einer etwas längeren Debug Zeit bin ich zu dem Ergebnis gekommen, dass die Extension mit dem Extensionkey „“ wirklich nicht geladen war.

Der Uncache ViewHelper nutzt ein eigenes UncacheTemplateView, welches die Klasse \TYPO3\CMS\Fluid\View\TemplateView erweitert. In dieser Klasse werden die folgenden Methoden aufgerufen:

TemplateView::getPartialRootPaths()
TemplateView::getLayoutRootPaths()
TemplateView::getTemplateRootPaths()

Die obigen Methoden führen alle folgenden Code aus:

$actionRequest = $this->controllerContext->getRequest();
return array(str_replace('@packageResourcesPath', ExtensionManagementUtility::extPath($actionRequest->getControllerExtensionKey()) [...]

Genau da lag oder liegt der Fehler. Der Aufruf von $actionRequest->getControllerExtensionKey() lieferte bei mir nichts zurück. Der Grund war, dass ich den ViewHelper im Seiten Template genutzt habe. In diesem Context scheint $actionRequest->getControllerExtensionKey() nichts zurück zu liefern. Ich habe mich dann dazu entschieden den Uncache ViewHelper analog zu dem ViewHelper von VHS selber zu implementieren und die TemplateView Klasse zu überschreiben. Ich habe meine Extension fest in die TemplateView Klasse geschrieben. Das ist zwar nicht sonderlich elegant, war aber die pragmatische Lösung die ich gewählt habe nachdem ich mehrere Stunden Fehlersuche hinter mir hatte. Nachfolgend noch meine TemplateView Klasse.

<?php
namespace VendorName\ExtensionKey\View;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
class TemplateView extends \TYPO3\CMS\Fluid\View\TemplateView {
  protected function getPartialRootPaths() {
    if ($this->partialRootPaths !== null) {
      return $this->partialRootPaths;
    }
    $actionRequest = $this->controllerContext->getRequest();
    return array(str_replace('@packageResourcesPath', ExtensionManagementUtility::extPath("extension_key") . 'Resources/', $this->partialRootPathPattern));
  }
  protected function getLayoutRootPaths() {
    if ($this->layoutRootPaths !== null) {
      return $this->layoutRootPaths;
    }
    $actionRequest = $this->controllerContext->getRequest();
    return array(str_replace('@packageResourcesPath', ExtensionManagementUtility::extPath("extension_key") . 'Resources/', $this->layoutRootPathPattern));
  }
  public function getTemplateRootPaths() {
    if ($this->templateRootPaths !== null) {
      return $this->templateRootPaths;
    }
    $actionRequest = $this->controllerContext->getRequest();
    return array(str_replace('@packageResourcesPath', ExtensionManagementUtility::extPath("extension_key") . 'Resources/', $this->templateRootPathPattern));
  }
}

Solltet ihr den komplette ViewHelper inkl. der Template Klassen als Download benötigen stelle ich euch diesen gerne zur Verfügung. Hinterlasst einfach einen Kommentar oder nutzt das Kontaktformular.


Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

Eine Antwort zu „VHS:Render.Uncache Viewhelper TYPO3 Fatal Error“

  1. Avatar von Eric Depta
    Eric Depta

    Thanks to your article,
    I don’t had to dig into the problem and ended up with this solution.

    Put this line of code somewhere into the render function from your UncacheViewHelper :
    $this->renderingContext->getControllerContext()->getRequest()->setControllerExtensionName(„extension_key“‚);

    And with that you don’t have to override the TemplateView too.
    Your ViewHelper may look like this:

    namespace EricDepta\Ext\ViewHelpers;

    class UncacheViewHelper extends \FluidTYPO3\Vhs\ViewHelpers\Render\UncacheViewHelper {
    /**
    * @return string
    */
    public function render() {
    $this->renderingContext->getControllerContext()->getRequest()->setControllerExtensionName('extension_key');
    return parent::render();
    }
    }