TYPO3 11自定义实体RecordList添加搜索过滤器及编辑查询咨询
在TYPO3 11的RecordList中为自定义实体添加搜索过滤器并自定义查询语句
当然可以实现,TYPO3 11弃用旧钩子后,推荐使用事件驱动机制来完成这两个需求,以下是具体实现方案:
一、添加自定义搜索过滤器
通过监听ModifyRecordListTableOptionsEvent事件,可在RecordList的工具栏中插入自定义筛选控件(如下拉框、输入框等):
- 注册事件监听器
在你的扩展的Configuration/Services.yaml中添加:
services: Vendor\YourExtension\EventListener\BandoRecordListFilterListener: tags: - name: event.listener identifier: 'your-extension/bando-recordlist-filter' event: TYPO3\CMS\Recordlist\Event\ModifyRecordListTableOptionsEvent
- 编写监听器类
在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实例,实现自定义筛选逻辑:
- 注册事件监听器
同样在Configuration/Services.yaml中添加:
services: Vendor\YourExtension\EventListener\BandoRecordListQueryListener: tags: - name: event.listener identifier: 'your-extension/bando-recordlist-query' event: TYPO3\CMS\Recordlist\Event\ModifyQueryForRecordListEvent
- 编写监听器类
在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
相关产品推荐
相关产品推荐

