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
相关产品推荐
相关产品推荐

