如何在Fluid中仅当Widget存在时使用?适配TYPO3 9/10及News扩展
TYPO3 9/10 兼容的News分页实现方案
你原来写的<f:if condition="n:widget.paginate">没法直接判断视图助手是否存在,Fluid不支持这种写法。要实现兼容TYPO3 9和10的News分页,有两种靠谱的思路:
思路1:通过TYPO3主版本号判断
因为News扩展的分页逻辑通常和TYPO3版本绑定,直接根据主版本号分支处理最直观:
<f:if condition="{f:system.version(major: 9)}"> <f:then> <!-- TYPO3 9 使用News扩展的旧分页组件 --> <n:widget.paginate objects="{news}" as="paginatedNews" configuration="{pagination}"> <f:for each="{paginatedNews}" as="newsItem"> <!-- 渲染单条新闻内容,比如标题、摘要等 --> <h3>{newsItem.title}</h3> <p>{newsItem.short}</p> </f:for> </n:widget.paginate> </f:then> <f:else> <!-- TYPO3 10+ 使用新的分页方法,比如官方视图助手或News扩展的新版本实现 --> <f:widget.paginate objects="{news}" as="paginatedNews" configuration="{pagination}"> <f:for each="{paginatedNews}" as="newsItem"> <h3>{newsItem.title}</h3> <p>{newsItem.short}</p> </f:for> </f:widget.paginate> </f:else> </f:if>
思路2:直接检查旧分页视图助手类是否存在
如果News扩展的版本差异比TYPO3版本更复杂,直接判断视图助手类是否存在更准确:
- 先在自定义的News列表控制器(继承官方News控制器)里注入视图助手解析器,传递判断变量到模板:
use TYPO3\CMS\Fluid\Core\ViewHelper\ViewHelperResolver; use GeorgRinger\News\ViewHelpers\Widget\PaginateViewHelper; class CustomNewsListController extends \GeorgRinger\News\Controller\NewsController { /** @var ViewHelperResolver */ protected $viewHelperResolver; public function injectViewHelperResolver(ViewHelperResolver $viewHelperResolver) { $this->viewHelperResolver = $viewHelperResolver; } public function listAction() { parent::listAction(); // 判断旧分页视图助手是否存在 $this->view->assign('hasOldNewsPaginate', class_exists(PaginateViewHelper::class)); } }
- 然后在Fluid模板里使用这个变量分支处理:
<f:if condition="{hasOldNewsPaginate}"> <f:then> <n:widget.paginate objects="{news}" as="paginatedNews" configuration="{pagination}"> <!-- 渲染新闻列表 --> </n:widget.paginate> </f:then> <f:else> <!-- 使用新分页实现 --> <f:widget.paginate objects="{news}" as="paginatedNews" configuration="{pagination}"> <!-- 渲染新闻列表 --> </f:widget.paginate> </f:else> </f:if>
如果不想修改控制器,也可以用Fluid的f:alias结合PHP表达式临时实现(不推荐,严格模式下有风险):
<f:alias map="{hasOldPaginate: '{f:format.raw(value: \'{class_exists(\\\\GeorgRinger\\\\News\\\\ViewHelpers\\\\Widget\\\\PaginateViewHelper::class)}\')}'}"> <f:if condition="{hasOldPaginate}"> <!-- 旧分页逻辑 --> </f:if> </f:alias>
内容的提问来源于stack exchange,提问作者user500665
相关产品推荐
相关产品推荐

