如何为Typo3 News扩展自定义字段添加列表ID筛选功能?
实现Typo3 News分类列表页自定义字段筛选
1. 完善前端表单的选中状态回显
先修改你的/Template/Category/List.html模板,添加选中状态判断,确保提交筛选后下拉框能保留选中项:
<form action="{f:uri.page(pageUid: '{settings.listPid}')}" method="get" id="filterForm"> <div class="row gy-3"> <div class="col-12 col-lg-4"> <select class="form-select ww-select gemeinde w-100" aria-label="select-example-lg" name="gemeinde"> <option value="0" {f:if(condition: '{request.requestArguments.gemeinde} == 0 || {request.requestArguments.gemeinde} == null', then: 'selected')}>Gemeinde</option> <f:for each="{gemeinden}" as="gemeinde"> <option value="{gemeinde.uid}" {f:if(condition: '{request.requestArguments.gemeinde} == {gemeinde.uid}', then: 'selected')}>{gemeinde.title}</option> </f:for> </select> <div class="d-flex justify-content-center mt-5"> <button class="btn btn-primary" type="submit">Jetzt suchen</button> </div> </div> </form>
2. 自定义控制器添加筛选逻辑
在你的站点扩展(sitepackage)中创建自定义Category控制器,继承News扩展的原控制器,添加对gemeinde参数的筛选处理:
<?php namespace Vendor\Sitepackage\Controller\News; use GeorgRinger\News\Controller\CategoryController as OriginalCategoryController; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface; class CategoryController extends OriginalCategoryController { public function listAction(\GeorgRinger\News\Domain\Model\Category $category = null) { // 执行原控制器的列表逻辑 parent::listAction($category); // 获取并转换GET参数中的Gemeinde ID $gemeindeUid = (int)GeneralUtility::_GET('gemeinde'); if ($gemeindeUid > 0) { $newsRepository = $this->objectManager->get(\GeorgRinger\News\Domain\Repository\NewsRepository::class); $query = $newsRepository->createQuery(); // 构建筛选条件:匹配指定Gemeinde和当前分类 $constraints = [ $query->equals('gemeinde', $gemeindeUid), $query->equals('categories', $category) ]; // 配置查询设置(按需调整,比如是否忽略存储页) $querySettings = GeneralUtility::makeInstance(QuerySettingsInterface::class); $querySettings->setRespectStoragePage(true); // 保持原存储页限制 $query->setQuerySettings($querySettings); // 执行筛选并更新模板变量 $filteredNews = $query->matching($query->logicalAnd($constraints))->execute(); $this->view->assign('news', $filteredNews); } } }
3. 配置TypoScript替换控制器
在站点扩展的TypoScript配置中,指定使用自定义的Category控制器:
plugin.tx_news { controllers { Category { actions { list { controller = Vendor\Sitepackage\Controller\News\CategoryController } } } } }
4. 验证模型与字段映射
确保你通过ProxyClassGenerator生成的自定义News模型中,已正确定义gemeinde属性:
<?php namespace Vendor\Sitepackage\Domain\Model\News; use GeorgRinger\News\Domain\Model\News as OriginalNews; use Vendor\Sitepackage\Domain\Model\Gemeinde; class News extends OriginalNews { /** * @var Gemeinde|null */ protected $gemeinde = null; /** * @return Gemeinde|null */ public function getGemeinde(): ?Gemeinde { return $this->gemeinde; } /** * @param Gemeinde|null $gemeinde */ public function setGemeinde(?Gemeinde $gemeinde): void { $this->gemeinde = $gemeinde; } }
注意事项
- 替换代码中的
Vendor\Sitepackage为你实际的扩展命名空间 - 如果
gemeinde是直接存储的UID而非关联模型,只需将查询条件中的gemeinde字段对应调整为数据库中的实际字段名(如tx_news_domain_model_news.gemeinde_uid) - 确保查询设置符合你的站点需求,比如是否需要忽略存储页限制
内容的提问来源于stack exchange,提问作者Clez20
相关产品推荐
相关产品推荐

