You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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版本更复杂,直接判断视图助手类是否存在更准确:

  1. 先在自定义的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));
    }
}
  1. 然后在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:24:12