2017-06-15 27 views
1

已经有了一个模板变体的解决方案,它允许为extbase控制器使用的流体模板文件设置一个后缀。它由Peter Niederlag创建,并被Bastian Waidelich改进。TYPO3的VariantView 8.7

该解决方案不再在TYPO3 8.7中工作,因为代码已被重构,并且TemplateView中的方法expandGenericPathPattern不再存在。

我应该如何在TYPO3 8.7中实现这样的变体视图?

回答

0

我在我的扩展中创建了以下类,它们实现了TYPO3 8.7的VariantView。

类\查看\ VariantView.php

<?php 

namespace Vendor\Extkey\View; 

use TYPO3\CMS\Core\Utility\GeneralUtility; 
use TYPO3\CMS\Extbase\Object\ObjectManager; 
use TYPO3\CMS\Fluid\View\TemplateView; 

/** 
* Extended Fluid Template View that supports different "variants" 
* 
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later 
*/ 
class VariantView extends TemplateView 
{ 
    /** 
    * @param string $layoutVariant 
    * @return void 
    */ 
    public function setLayoutVariant($layoutVariant) 
    { 
     $objectManager = GeneralUtility::makeInstance(ObjectManager::class); 
     $this->baseRenderingContext->setTemplatePaths($objectManager->get(TemplatePaths::class)); 
     /** @var TemplatePaths $templatePaths */ 
     $templatePaths = $this->baseRenderingContext->getTemplatePaths(); 
     $templatePaths->setLayoutVariant($layoutVariant); 
    } 

    const DEFAULT_LAYOUT_VARIANT = '.default'; 
} 

类\查看\ TemplatePaths.php

<?php 

namespace Vendor\Extkey\View; 

class TemplatePaths extends \TYPO3\CMS\Fluid\View\TemplatePaths 
{ 
    /** 
    * Layout variant to use for this view. 
    * 
    * @var string 
    */ 
    protected $layoutVariant = VariantView::DEFAULT_LAYOUT_VARIANT; 

    /** 
    * @param string $layoutVariant 
    * @return void 
    */ 
    public function setLayoutVariant($layoutVariant) 
    { 
     $this->layoutVariant = $layoutVariant; 
    } 

    /** 
    * Wrapper for parent class method which adds layout variant in action parameter 
    * 
    * @param string $controller 
    * @param string $action 
    * @param string $format 
    * @return string|NULL 
    * @api 
    */ 
    public function resolveTemplateFileForControllerAndActionAndFormat($controller, $action, $format = self::DEFAULT_FORMAT) 
    { 
     $action = $action . $this->layoutVariant; 
     return parent::resolveTemplateFileForControllerAndActionAndFormat($controller, $action, $format = self::DEFAULT_FORMAT); 
    } 
} 

在你的控制器中添加以下行:

protected function setViewConfiguration(\TYPO3\CMS\Extbase\Mvc\View\ViewInterface $view) { 
    parent::setViewConfiguration($view); 
    $view->setLayoutVariant($this->settings['layoutVariant']); 
} 
1

$this->view->getRenderingContext()->setControllerAction('MyAction.Variant');应该做的伎俩(从任何initializeAction方法或行动方法)。请注意,与链接到的视图重写类相反,此方法意味着您必须在路径的路径中具有原始操作模板

+0

类'' 'ViewInterface'''不包含称为'''getRenderingContext'''的方法。 ''this-> view'''被定义为'''ViewInterface''',那么为了使''this-> view-> getRenderingContext()'''工作,我需要做些什么? –

+0

您可以改为使用普通的TemplateView。 –

+0

我再仔细一看。 'protected $ defaultViewObjectName'必须设置为'\ TYPO3 \ CMS \ Fluid \ View \ TemplateView :: class'。 我不喜欢这个解决方案是需要原始行动模板的路径,导致大量不必要的文件铺设。 –