已经有了一个模板变体的解决方案,它允许为extbase控制器使用的流体模板文件设置一个后缀。它由Peter Niederlag创建,并被Bastian Waidelich改进。TYPO3的VariantView 8.7
该解决方案不再在TYPO3 8.7中工作,因为代码已被重构,并且TemplateView
中的方法expandGenericPathPattern
不再存在。
我应该如何在TYPO3 8.7中实现这样的变体视图?
已经有了一个模板变体的解决方案,它允许为extbase控制器使用的流体模板文件设置一个后缀。它由Peter Niederlag创建,并被Bastian Waidelich改进。TYPO3的VariantView 8.7
该解决方案不再在TYPO3 8.7中工作,因为代码已被重构,并且TemplateView
中的方法expandGenericPathPattern
不再存在。
我应该如何在TYPO3 8.7中实现这样的变体视图?
我在我的扩展中创建了以下类,它们实现了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']);
}
$this->view->getRenderingContext()->setControllerAction('MyAction.Variant');
应该做的伎俩(从任何initializeAction方法或行动方法)。请注意,与链接到的视图重写类相反,此方法意味着您必须在路径的路径中具有原始操作模板。
类'' 'ViewInterface'''不包含称为'''getRenderingContext'''的方法。 ''this-> view'''被定义为'''ViewInterface''',那么为了使''this-> view-> getRenderingContext()'''工作,我需要做些什么? –
您可以改为使用普通的TemplateView。 –
我再仔细一看。 'protected $ defaultViewObjectName'必须设置为'\ TYPO3 \ CMS \ Fluid \ View \ TemplateView :: class'。 我不喜欢这个解决方案是需要原始行动模板的路径,导致大量不必要的文件铺设。 –