Динамическое изменение макета жидкости TYPO3 по typeNum
Я использую жидкостные страницы расширения и хочу переключить макет с помощью typeNum. Можно ли изменить расположение f: по условию? Это не сработает:
<f:layout name="{f:if(condition: '{typeNum} == 666', then: 'PageAjax', else: 'Page')}"/>
4 ответа
Предлагаемый подход:
<f:layout name="Page/{typeNum}"/>
Обязательные файлы:
- Ресурсы / Private / Макеты / Страница /0.html
- Ресурсы / Private / Макеты / Страница /666.html
Обратите внимание: это работает только в том случае, если переменная {typeNum} гарантированно существует - в противном случае вы столкнетесь с ошибкой "файл шаблона не найден" с пустым именем файла. Чтобы избежать этого, вы можете использовать расширение VHS v:var.convert
ViewHelper, чтобы обеспечить правильное значение:
<f:layout name="Page/{typeNum -> v:var.convert(type: 'integer')}"/>
Недавно я получил ту же проблему и нашел решение после нескольких исследований.
Проблема в том, что вы не можете использовать вложенную жидкость, как <f:if>
, <f:cObject>
или другие в <f:layout>
, В противном случае вы получите фатальную ошибку в файле кеша: call to a member function getViewHelper() on a non-object.
И когда вы посмотрите на файл кэша, вы обнаружите, что это потому, что $self
не определено.
Поэтому мое решение заключается в поиске public function getLayoutName(
в \TYPO3\CMS\Fluid\Core\Compiler\TemplateCompiler и добавление \$self = \$this;
до \$currentVariableContainer = \$renderingContext->getTemplateVariableContainer();
, как generateCodeForSection()
Теперь я добавил условие в шаблон макета. Я получаю typeNum из Typoscript.
<f:if condition="{f:cObject(typoscriptObjectPath:'plugin.nc_template.settings.pageLayout')} == 'Default'">
<p>Default Template</p>
</f:if>
<f:if condition="{f:cObject(typoscriptObjectPath:'plugin.nc_template.settings.pageLayout')} == 'Ajax'">
<p>Ajax Template</p>
</f:if>
Я нашел пример на странице fedext, но не смог заставить его работать
Разве вы не можете вместо этого использовать оператор if? ИМХО, это легче читать - и если вам нужно добавить больше аргументов, которые зависят от typeNum, он останется читабельным.
<f:if condition="{typeNum} == 666">
<f:then>
<f:layout name="PageAjax">
</f:then>
<f:else>
<f:layout name="Page">
</f:else>
</f:if>