[BUGFIX] Add missing getTemplatePathAndFilename() in TemplatePaths 04/51004/7
authorDaniel Lorenz <info@extco.de>
Tue, 20 Dec 2016 11:43:27 +0000 (12:43 +0100)
committerMarkus Klein <markus.klein@typo3.org>
Wed, 21 Dec 2016 11:53:12 +0000 (12:53 +0100)
The StandaloneView getTemplatePathAndFilename() calls
a method that the fluid standalone extension doesn't implement anymore,
hence the method is added to the Core's TemplatePaths class.

Additionally, a lot of type checks are added to ensure that the correct
object types are present in all usages.

Resolves: #79045
Releases: master
Change-Id: I3ec766a29c31d299451f33dd079a56e9a5855c69
Reviewed-on: https://review.typo3.org/51004
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Nicole Cordes <typo3@cordes.co>
Tested-by: Nicole Cordes <typo3@cordes.co>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
typo3/sysext/fluid/Classes/View/AbstractTemplateView.php
typo3/sysext/fluid/Classes/View/StandaloneView.php
typo3/sysext/fluid/Classes/View/TemplatePaths.php

index d6ab6cb..1e427a6 100644 (file)
@@ -50,7 +50,7 @@ abstract class AbstractTemplateView extends TemplateView implements \TYPO3\CMS\E
         if (!$context) {
             $context = GeneralUtility::makeInstance(ObjectManager::class)->get(RenderingContext::class, $this);
         }
-        $this->setRenderingContext($context);
+        parent::__construct($context);
     }
 
     /**
@@ -80,6 +80,8 @@ abstract class AbstractTemplateView extends TemplateView implements \TYPO3\CMS\E
         $this->controllerContext = $controllerContext;
         $this->baseRenderingContext->getTemplatePaths()->fillDefaultsByPackageName($request->getControllerExtensionKey());
         $this->baseRenderingContext->getTemplatePaths()->setFormat($request->getFormat());
-        $this->baseRenderingContext->setControllerContext($controllerContext);
+        if ($this->baseRenderingContext instanceof RenderingContext) {
+            $this->baseRenderingContext->setControllerContext($controllerContext);
+        }
     }
 }
index 7716b3a..24dad28 100644 (file)
@@ -33,6 +33,11 @@ use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
 class StandaloneView extends AbstractTemplateView
 {
     /**
+     * @var ObjectManager|null
+     */
+    protected $objectManager = null;
+
+    /**
      * Constructor
      *
      * @param ContentObjectRenderer $contentObject The current cObject. If NULL a new instance will be created
@@ -64,7 +69,7 @@ class StandaloneView extends AbstractTemplateView
         $controllerContext->setUriBuilder($uriBuilder);
         $renderingContext = $this->objectManager->get(RenderingContext::class, $this);
         $renderingContext->setControllerContext($controllerContext);
-        $this->setRenderingContext($renderingContext);
+        parent::__construct($renderingContext);
     }
 
     /**
@@ -80,32 +85,45 @@ class StandaloneView extends AbstractTemplateView
      *
      * @param string $format
      * @return void
+     * @throws \RuntimeException
      * @api
      */
     public function setFormat($format)
     {
-        $this->baseRenderingContext->getControllerContext()->getRequest()->setFormat($format);
+        if ($this->baseRenderingContext instanceof RenderingContext) {
+            $this->baseRenderingContext->getControllerContext()->getRequest()->setFormat($format);
+        } else {
+            throw new \RuntimeException('The rendering context must be of type ' . RenderingContext::class, 1482251886);
+        }
     }
 
     /**
      * Returns the format of the current request (defaults is "html")
      *
      * @return string $format
+     * @throws \RuntimeException
      * @api
      */
     public function getFormat()
     {
-        return $this->baseRenderingContext->getControllerContext()->getRequest()->getFormat();
+        if ($this->baseRenderingContext instanceof RenderingContext) {
+            return $this->baseRenderingContext->getControllerContext()->getRequest()->getFormat();
+        }
+        throw new \RuntimeException('The rendering context must be of type ' . RenderingContext::class, 1482251887);
     }
 
     /**
      * Returns the current request object
      *
      * @return WebRequest
+     * @throws \RuntimeException
      */
     public function getRequest()
     {
-        return $this->baseRenderingContext->getControllerContext()->getRequest();
+        if ($this->baseRenderingContext instanceof RenderingContext) {
+            return $this->baseRenderingContext->getControllerContext()->getRequest();
+        }
+        throw new \RuntimeException('The rendering context must be of type ' . RenderingContext::class, 1482251888);
     }
 
     /**
@@ -124,11 +142,16 @@ class StandaloneView extends AbstractTemplateView
      * Returns the absolute path to a Fluid template file if it was specified with setTemplatePathAndFilename() before
      *
      * @return string Fluid template path
+     * @throws \RuntimeException
      * @api
      */
     public function getTemplatePathAndFilename()
     {
-        return $this->baseRenderingContext->getTemplatePaths()->getTemplatePathAndFilename();
+        $templatePaths = $this->baseRenderingContext->getTemplatePaths();
+        if ($templatePaths instanceof TemplatePaths) {
+            return $templatePaths->getTemplatePathAndFilename();
+        }
+        throw new \RuntimeException('The template paths storage must be of type ' . TemplatePaths::class, 1482251889);
     }
 
     /**
index ac9eae8..ec989e1 100644 (file)
@@ -237,4 +237,14 @@ class TemplatePaths extends \TYPO3Fluid\Fluid\View\TemplatePaths
     {
         return parent::getPartialPathAndFilename($partialName);
     }
+
+    /**
+     * Get absolute path to template file
+     *
+     * @return string Returns the absolute path to a Fluid template file
+     */
+    public function getTemplatePathAndFilename()
+    {
+        return $this->templatePathAndFilename;
+    }
 }