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

TYPO3 tx_news过滤无关联新闻及相关新闻去重问题咨询

TYPO3 新闻扩展相关新闻过滤与控制器扩展方案

一、无需新建控制器,扩展现有NewsController即可

直接继承官方新闻扩展的控制器,重写对应方法(比如单条新闻展示的showAction),既保留原有逻辑,又能按需修改数据输出。

步骤1:创建自定义控制器类

在你的站点扩展中新建Classes/Controller/NewsController.php,代码如下:

<?php
namespace YourVendor\YourExtension\Controller;

use GeorgRinger\News\Controller\NewsController as OriginalNewsController;
use GeorgRinger\News\Domain\Model\News;

class NewsController extends OriginalNewsController
{
    /**
     * 重写单条新闻展示方法
     *
     * @param News $newsItem
     * @return void
     */
    public function showAction(News $newsItem)
    {
        // 调用父类方法完成基础数据查询与视图赋值
        parent::showAction($newsItem);

        // 获取原相关新闻数据并过滤掉含relatedfrom的条目
        $relatedNews = $this->view->getVariable('relatedNews');
        if ($relatedNews) {
            $filteredRelated = $relatedNews->filter(function ($news) {
                return empty($news->getRelatedfrom());
            });
            // 将过滤后的数据重新传给视图
            $this->view->assign('relatedNews', $filteredRelated);
        }
    }
}

步骤2:通过TypoScript替换控制器

在模板配置的TypoScript中,指定使用自定义控制器:

plugin.tx_news {
    controller {
        News = YourVendor\YourExtension\Controller\NewsController
    }
}

二、用钩子在查询阶段直接过滤(更高效)

如果想从数据库查询层面就排除目标新闻,避免内存中二次过滤,可以用新闻扩展提供的modifyRelatedNewsQuery钩子。

步骤1:创建钩子类

在扩展中新建Classes/Hooks/ModifyRelatedNewsQueryHook.php:

<?php
namespace YourVendor\YourExtension\Hooks;

use TYPO3\CMS\Extbase\Persistence\QueryInterface;

class ModifyRelatedNewsQueryHook
{
    /**
     * 修改相关新闻的查询约束
     *
     * @param array $params
     * @param object $parentObject
     */
    public function modifyQuery(array &$params, $parentObject)
    {
        /** @var QueryInterface $query */
        $query = $params['query'];
        
        // 添加约束:只保留relatedfrom为空的新闻
        $newConstraint = $query->isEmpty('relatedfrom');
        $query->matching($query->logicalAnd(
            $query->getConstraint(),
            $newConstraint
        ));
    }
}

步骤2:注册钩子

在扩展的ext_localconf.php中添加钩子注册代码:

<?php
defined('TYPO3') or die();

$GLOBALS['TYPO3_CONF_VARS']['EXT']['news']['hooks']['modifyRelatedNewsQuery'][] = \YourVendor\YourExtension\Hooks\ModifyRelatedNewsQueryHook::class;

三、为什么不推荐JavaScript去重?

前端JS只能处理当前分页的局部数据,无法跨页统一去重,会导致分页总数与实际展示数据不匹配,破坏分页逻辑,后端过滤是最优解决方案。

内容的提问来源于stack exchange,提问作者Matic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:27:17