2017-06-15 29 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'。 我不喜歡這個解決方案是需要原始行動模板的路徑,導致大量不必要的文件鋪設。 –