Я использую расширение FluidPages и хочу переключить макет по typeNum. можно ли изменить f:layout по условию? Это не сработает:
<f:layout name="{f:if(condition: '{typeNum} == 666', then: 'PageAjax', else: 'Page')}"/>
Я использую расширение FluidPages и хочу переключить макет по typeNum. можно ли изменить f:layout по условию? Это не сработает:
<f:layout name="{f:if(condition: '{typeNum} == 666', then: 'PageAjax', else: 'Page')}"/>
Предлагаемый подход:
<f:layout name="Page/{typeNum}"/>
Требуемые файлы:
Обратите внимание: это работает только в том случае, если гарантированно существует переменная {typeNum} — если это не так, вы столкнетесь с ошибкой «файл шаблона не найден» с пустым именем файла. Чтобы избежать этого, вы можете использовать v:var.convert
ViewHelper расширения VHS, чтобы обеспечить правильное значение:
<f:layout name="Page/{typeNum -> v:var.convert(type: 'integer')}"/>
Теперь я добавил условие в шаблон макета. Я получаю 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
Недавно у меня возникла такая же проблема, и я нашел решение после нескольких исследований.
Проблема в том, что вы не можете использовать вложенные жидкости, такие как <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()
Разве вы не можете использовать оператор 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>
f:layout
обрабатывается без фактического рендеринга шаблона.
- person Claus Due; 19.03.2014