我正在使用 Extbase 和 fluid_styled_content。
正在开发一个具有以下要求的 Extbase 插件:如果满足特定条件(取决于 URL 查询参数),则前端中不应为该插件显示任何内容。在这种情况下,插件的流体输出将为空(取决于控制器中设置的变量)。但 TYPO3 仍然 - 默认情况下 - 渲染一个包装 div 和标题。
所以,本质上,我得到的是这样的:
<div id="c217" class="...">
<header>
<h2 class="...">Header</h2>
</header>
<p> <!-- plugin output here is empty -- > </p>
</div>
我如何(动态)防止这种情况?
以前曾问过这个问题,但我找到的解决方案不适用于fluid_styled_content:
您应该使用FSC方式。
所有内容均通过使用布局和部分的模板呈现。除了简单的 CE 之外,您还有一个插件模板,它请求渲染标题的布局。
使用插件的特殊条件增强(全局)布局,以避免标头(请确保自己渲染标头),或者如果您的插件不会渲染任何输出,则避免标头。
编辑:
将覆盖模板路径添加到 FSC:
lib.contentElement {
templateRootPaths {
200 = EXT:your_extension_key/Resources/Private/FSC/Templates/
}
partialRootPaths {
200 = EXT:your_extension_key/Resources/Private/FSC/Partials/
}
layoutRootPaths {
200 = EXT:your_extension_key/Resources/Private/FSC/Layouts/
}
}
现在您可以将默认布局从 FSC 文件夹复制到您的布局文件夹,并在该布局中添加一个条件,如果您的插件被渲染,该条件将跳过标题和全局换行。
<f:if condition="{data.CType} == 'list' && {data.list_type} == 'myPlugin'">
<f:then>
<f:comment> only plugin output </fcomment>
</f:then>
<f:else>
<f:comment> original output with headers and wrap </fcomment>
</f:else>
</f:if>
我设法找到了一个可行的解决方案:但是它似乎过于复杂:(
我所做的是覆盖我的插件的 List.html 流体模板。
TypoScript:将fluid_styled_content部分路径添加到我的视图中,覆盖我的插件的列表模板:
plugin.tx_myext.view.partialRootPaths < lib.contentElement.partialRootPaths
plugin.tx_myext.view.partialRootPaths.100 = EXT:myext/Resources/Private/Partials/
tt_content.list.templateRootPaths.50 = EXT:myext/Resources/Private/Templates/Override/
tt_content.list.templateName = TEXT
tt_content.list.templateName.stdWrap {
cObject = TEXT
cObject {
data = list_type
override.field = list_type
if.isInList.field = list_type
if.value = myext_plugin1,myext_plugin2
split {
token = myext_
1.current = 1
1.wrap = |
}
}
ifEmpty = List
}
EXT:myext/Resources/Private/Templates/Override/Plugin1.html:覆盖默认列表模板,复制粘贴 List.html,不带布局。
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:cObject typoscriptObjectPath="tt_content.list.20.{data.list_type}" data="{data}" table="tt_content" />
</html>
EXT:myext/Resources/Private/Templates/MyController/View.html:使用覆盖/默认布局
<f:layout name="Override/Default" />
<f:section name="Main" />
EXT:myext/Resources/Private/Layout/Override/Default.html:是具有隐藏功能的fluid_styled_content默认布局的副本。
....
<f:if condition="{hidden}">
<f:then>
</f:then>
<f:else>
....
Controller/MyController.php:必须添加tt_content数据(因为需要header、header_layout、uid等)
$data = $this->configurationManager->getContentObject()->data;
$this->view->assign('data', $data);