Динамическое изменение макета жидкости TYPO3 по typeNum

Я использую расширение FluidPages и хочу переключить макет по typeNum. можно ли изменить f:layout по условию? Это не сработает:

<f:layout name="{f:if(condition: '{typeNum} == 666', then: 'PageAjax', else: 'Page')}"/>

person kimomat    schedule 31.01.2014    source источник


Ответы (4)


Предлагаемый подход:

<f:layout name="Page/{typeNum}"/>

Требуемые файлы:

  • Ресурсы/Частные/Макеты/Страница/0.html
  • Resources/Private/Layouts/Page/666.html

Обратите внимание: это работает только в том случае, если гарантированно существует переменная {typeNum} — если это не так, вы столкнетесь с ошибкой «файл шаблона не найден» с пустым именем файла. Чтобы избежать этого, вы можете использовать v:var.convert ViewHelper расширения VHS, чтобы обеспечить правильное значение:

<f:layout name="Page/{typeNum -> v:var.convert(type: 'integer')}"/>

person Claus Due    schedule 19.03.2014
comment
Это не объясняет, почему вышеуказанное не работает. Было бы неплохо знать, чтобы справляться с подобными проблемами. - person ; 04.10.2018

Теперь я добавил условие в шаблон макета. Я получаю 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, но не смог запустить его: https://fedext.net/blog/archive.html?tx_news_pi1%5Bnews%5D=55&tx_news_pi1%5B@widget_0%5D%5BcurrentPage%5D=8&cHash=f9c3165598a28d2aa98fd30ef115bb75

person kimomat    schedule 05.02.2014

Недавно у меня возникла такая же проблема, и я нашел решение после нескольких исследований.

Проблема в том, что вы не можете использовать вложенные жидкости, такие как <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()

person Bill.Dagou    schedule 18.10.2016

Разве вы не можете использовать оператор 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>
person maholtz    schedule 04.02.2014
comment
Я просто взял встроенное условие if. Но не имеет значения, возьму ли я запись на основе тегов или встроенную запись. Я думаю, что у меня нет доступа к жидкости, если viewhelper в разделе f: layout. - person kimomat; 05.02.2014
comment
Это не сработает — причина в том, что значение узла f:layout обрабатывается без фактического рендеринга шаблона. - person Claus Due; 19.03.2014