Динамическое изменение макета жидкости 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>
Другие вопросы по тегам