TYPO3 Fluid:如何使用 <f:section> 之外的条件和变量来使布局动态化?
TYPO3 Fluid: How is it possible to use conditions and variables outside of <f:section> to make the layout dynamic?
我尝试根据后端的定义更改包装每个内容元素的布局。不幸的是,{data}
的变量似乎仅在 <f:section>
元素内可用。更有问题的是,<f:if>
条件 ViewHelper 在 <f:section>
之外没有任何效果,两个 <f:layout>
语句都被执行,只有最后一个用于渲染。这没有用……而且文档确实只讨论了本节中的 ViewHelper。你知道任何其他方法来实现这一目标吗?提前致谢!
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{data.layout} == 101"><!-- if-condition has no effect here -->
<f:then>
<f:layout name="FullWidth" />
</f:then>
<f:else>
<f:layout name="Default" />
</f:else>
</f:if>
<f:debug>TEST1: {data.layout}</f:debug><!-- THIS DOES NOT SHOW UP AT ALL! -->
<f:section name="Main">
<f:debug>TEST2: {data.layout}</f:debug><!-- Output is TEST2: 101 (integer) -->
[...]
</f:section>
</html>
读取 f:layout
标记而不呈现模板,因此围绕它的 if 语句将不起作用。但是,f:layout
标记的名称呈现为模板,因此您可以使用内联 if 语句,如下所示:
<f:layout name="{f:if(condition: '{data.layout} == 101', then: 'FullWidth', else: 'Default')}" />
尝试将条件移动到您的 TS 中,并使用布局名称的设置。
打字稿
lib.layout = TEXT
lib.layout.value = Page
[globalVar = GP:print = 1]
lib.layout.value = Print
[global]
模板
<f:layout name="{f:cObject(typoscriptObjectPath: 'lib.layout')}" />
我就是这样做的。
另一种选择是使用 data.layout
的值来构建布局的名称。这样它类似于内联 f:if-viewhelper.
<f:layout name="layout{data.layout}" />
确保处理未知值或空值。使用具有匹配名称的文件或使用 .ifEmpty = default
或类似的打字稿准备变量。
我决定布局的常规解决方案(我使用 backend_layout
和 backend_layout_next_level
这两个字段,因为它们提供了继承和单独覆盖的选项):
templateName = TEXT
templateName.cObject = CASE
templateName.cObject {
key.data = levelfield:-1, backend_layout_next_level, slide
key.override.field = backend_layout
#Default Template
default = TEXT
default.value = Unterseite
pagets__startseite = TEXT
pagets__startseite.value = Startseite
pagets__katalogseite = TEXT
pagets__katalogseite.value = Katalogseite
}
另一种方法是评估布局文件中的布局。根据布局值,您可以呈现构建完整模板的特定部分或部分。
在这里,您也可以选择使用内联布局值来决定部分/部分。
<f:render partial="page-{page.layout}" />
<f:render section="section-{page.layout} />
或者您使用 f:switch
或 f:if
-VH。
一如既往:
哪种解决方案最好?这取决于。
您需要考虑您的特殊要求以获得最佳解决方案。
我尝试根据后端的定义更改包装每个内容元素的布局。不幸的是,{data}
的变量似乎仅在 <f:section>
元素内可用。更有问题的是,<f:if>
条件 ViewHelper 在 <f:section>
之外没有任何效果,两个 <f:layout>
语句都被执行,只有最后一个用于渲染。这没有用……而且文档确实只讨论了本节中的 ViewHelper。你知道任何其他方法来实现这一目标吗?提前致谢!
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{data.layout} == 101"><!-- if-condition has no effect here -->
<f:then>
<f:layout name="FullWidth" />
</f:then>
<f:else>
<f:layout name="Default" />
</f:else>
</f:if>
<f:debug>TEST1: {data.layout}</f:debug><!-- THIS DOES NOT SHOW UP AT ALL! -->
<f:section name="Main">
<f:debug>TEST2: {data.layout}</f:debug><!-- Output is TEST2: 101 (integer) -->
[...]
</f:section>
</html>
读取 f:layout
标记而不呈现模板,因此围绕它的 if 语句将不起作用。但是,f:layout
标记的名称呈现为模板,因此您可以使用内联 if 语句,如下所示:
<f:layout name="{f:if(condition: '{data.layout} == 101', then: 'FullWidth', else: 'Default')}" />
尝试将条件移动到您的 TS 中,并使用布局名称的设置。
打字稿
lib.layout = TEXT
lib.layout.value = Page
[globalVar = GP:print = 1]
lib.layout.value = Print
[global]
模板
<f:layout name="{f:cObject(typoscriptObjectPath: 'lib.layout')}" />
我就是这样做的。
另一种选择是使用 data.layout
的值来构建布局的名称。这样它类似于内联 f:if-viewhelper.
<f:layout name="layout{data.layout}" />
确保处理未知值或空值。使用具有匹配名称的文件或使用 .ifEmpty = default
或类似的打字稿准备变量。
我决定布局的常规解决方案(我使用 backend_layout
和 backend_layout_next_level
这两个字段,因为它们提供了继承和单独覆盖的选项):
templateName = TEXT
templateName.cObject = CASE
templateName.cObject {
key.data = levelfield:-1, backend_layout_next_level, slide
key.override.field = backend_layout
#Default Template
default = TEXT
default.value = Unterseite
pagets__startseite = TEXT
pagets__startseite.value = Startseite
pagets__katalogseite = TEXT
pagets__katalogseite.value = Katalogseite
}
另一种方法是评估布局文件中的布局。根据布局值,您可以呈现构建完整模板的特定部分或部分。
在这里,您也可以选择使用内联布局值来决定部分/部分。
<f:render partial="page-{page.layout}" />
<f:render section="section-{page.layout} />
或者您使用 f:switch
或 f:if
-VH。
一如既往:
哪种解决方案最好?这取决于。
您需要考虑您的特殊要求以获得最佳解决方案。