已經有了一個模板變體的解決方案,它允許爲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'。 我不喜歡這個解決方案是需要原始行動模板的路徑,導致大量不必要的文件鋪設。 –