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

TYPO3 11自定义实体RecordList添加搜索过滤器及编辑查询咨询

在TYPO3 11的RecordList中为自定义实体添加搜索过滤器并自定义查询语句

当然可以实现,TYPO3 11弃用旧钩子后,推荐使用事件驱动机制来完成这两个需求,以下是具体实现方案:

一、添加自定义搜索过滤器

通过监听ModifyRecordListTableOptionsEvent事件,可在RecordList的工具栏中插入自定义筛选控件(如下拉框、输入框等):

  1. 注册事件监听器
    在你的扩展的Configuration/Services.yaml中添加:
services:
  Vendor\YourExtension\EventListener\BandoRecordListFilterListener:
    tags:
      - name: event.listener
        identifier: 'your-extension/bando-recordlist-filter'
        event: TYPO3\CMS\Recordlist\Event\ModifyRecordListTableOptionsEvent
  1. 编写监听器类
    在Classes/EventListener/BandoRecordListFilterListener.php中实现逻辑,判断当前表为你的bando实体表后,添加自定义筛选HTML:
<?php
declare(strict_types=1);

namespace Vendor\YourExtension\EventListener;

use TYPO3\CMS\Recordlist\Event\ModifyRecordListTableOptionsEvent;

class BandoRecordListFilterListener
{
    public function __invoke(ModifyRecordListTableOptionsEvent $event): void
    {
        $table = $event->getTable();
        // 替换为你的bando实体表名,比如tx_yourext_domain_model_bando
        if ($table !== 'tx_yourext_domain_model_bando') {
            return;
        }

        // 获取当前请求的筛选参数,用于回显选中状态
        $request = $event->getRequest();
        $statusFilter = $request->getQueryParams()['tx_recordlist']['bando_status'] ?? '';

        // 插入自定义筛选下拉框
        $filterHtml = sprintf(
            '<div class="form-group">
                <label for="bando-status-filter">状态筛选:</label>
                <select name="tx_recordlist[bando_status]" id="bando-status-filter" class="form-control">
                    <option value="" %s>全部</option>
                    <option value="active" %s>已激活</option>
                    <option value="inactive" %s>未激活</option>
                </select>
            </div>',
            $statusFilter === '' ? 'selected' : '',
            $statusFilter === 'active' ? 'selected' : '',
            $statusFilter === 'inactive' ? 'selected' : ''
        );

        // 将自定义筛选HTML追加到现有工具栏
        $event->setOptionsHtml($event->getOptionsHtml() . $filterHtml);
    }
}

二、自定义查询语句

通过ModifyQueryForRecordListEvent事件,可以直接修改RecordList查询使用的QueryBuilder实例,实现自定义筛选逻辑:

  1. 注册事件监听器
    同样在Configuration/Services.yaml中添加:
services:
  Vendor\YourExtension\EventListener\BandoRecordListQueryListener:
    tags:
      - name: event.listener
        identifier: 'your-extension/bando-recordlist-query'
        event: TYPO3\CMS\Recordlist\Event\ModifyQueryForRecordListEvent
  1. 编写监听器类
    在Classes/EventListener/BandoRecordListQueryListener.php中处理查询修改:
<?php
declare(strict_types=1);

namespace Vendor\YourExtension\EventListener;

use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Recordlist\Event\ModifyQueryForRecordListEvent;

class BandoRecordListQueryListener
{
    public function __invoke(ModifyQueryForRecordListEvent $event): void
    {
        $table = $event->getTable();
        if ($table !== 'tx_yourext_domain_model_bando') {
            return;
        }

        $queryBuilder = $event->getQueryBuilder();
        $request = $event->getRequest();
        $queryParams = $request->getQueryParams()['tx_recordlist'] ?? [];

        // 处理自定义状态筛选
        if (!empty($queryParams['bando_status'])) {
            $this->addStatusFilter($queryBuilder, $queryParams['bando_status']);
        }

        // 扩展原生搜索逻辑:比如额外搜索关联表字段
        $searchString = $event->getSearchString();
        if (!empty($searchString)) {
            $this->extendSearchQuery($queryBuilder, $searchString);
        }
    }

    private function addStatusFilter(QueryBuilder $queryBuilder, string $status): void
    {
        $queryBuilder->andWhere(
            $queryBuilder->expr()->eq(
                'status',
                $queryBuilder->createNamedParameter($status, \PDO::PARAM_STR)
            )
        );
    }

    private function extendSearchQuery(QueryBuilder $queryBuilder, string $searchString): void
    {
        // 假设bando关联了category表,额外搜索category的名称
        $queryBuilder->leftJoin(
            'tx_yourext_domain_model_bando',
            'tx_yourext_domain_model_category',
            'category',
            $queryBuilder->expr()->eq('category.uid', $queryBuilder->quoteIdentifier('tx_yourext_domain_model_bando.category'))
        );

        $searchExpr = $queryBuilder->expr()->orX(
            $queryBuilder->expr()->like('title', $queryBuilder->createNamedParameter('%' . $searchString . '%')),
            $queryBuilder->expr()->like('category.name', $queryBuilder->createNamedParameter('%' . $searchString . '%'))
        );

        // 替换原生搜索条件,或者追加条件
        $whereClauses = $queryBuilder->getRestrictions()->buildExpression(['tx_yourext_domain_model_bando' => $queryBuilder->getFromClause()[0]['table']], $queryBuilder);
        $queryBuilder->resetWhere()->andWhere($whereClauses)->andWhere($searchExpr);
    }
}

三、原生searchFields的配合使用

你之前配置的searchFields依然生效,上述事件监听器可以在原生搜索的基础上扩展逻辑,比如添加关联表搜索、自定义字段匹配规则等,无需弃用原有配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:33