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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:48