通过typeNum动态更改TYPO3 fluid布局

3
我正在使用扩展程序fluidpages,并希望通过typeNum切换布局。 是否可以通过条件更改f:layout? 以下内容无法实现:
<f:layout name="{f:if(condition: '{typeNum} == 666', then: 'PageAjax', else: 'Page')}"/>
4个回答

3

建议的做法:

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

所需文件:

  • Resources/Private/Layouts/Page/0.html
  • Resources/Private/Layouts/Page/666.html

请注意:只有当{typeNum}变量存在时,它才能正常工作 - 如果不存在,您将面临“找不到模板文件”的错误,并显示空文件名。为了避免这种情况,您可以使用VHS扩展中的v:var.convert ViewHelper来确保一个正确的值:

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


1
这并没有解释为什么上述方法不起作用。了解原因可以帮助我们处理类似的问题。 - user9073987

1
我最近遇到了同样的问题,在进行一些研究后找到了解决方案。
问题是,您不能在中使用嵌套的fluid,例如、或其他内容。否则,您将在缓存文件中得到致命错误,说“调用非对象上的getViewHelper()成员函数。”当您查看缓存文件时,您会发现这是因为$ self未定义。
因此,我的解决方案是,在\TYPO3\CMS\Fluid\Core\Compiler\TemplateCompiler中搜索public function getLayoutName(,并在$currentVariableContainer = $ renderingContext->getTemplateVariableContainer()之前添加\$self = \$this;,就像generateCodeForSection()一样。

0

我现在在布局模板中添加了Condition。我从typoscript获取typeNum。

<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[news]=55&tx_news_pi1[%40widget_0][currentPage]=8&cHash=f9c3165598a28d2aa98fd30ef115bb75


-2

你不能使用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>

我刚刚使用了内联if条件。但是,如果我采用基于标签或内联写法都无所谓。我认为在f:layout部分中我没有访问fluid if viewhelper的权限。 - kimomat
1
这样做是行不通的 - 原因是 f:layout 节点的值在没有实际渲染模板的情况下被处理。 - Claus Due

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接