TYPO3 8.7 Extbase前端插件:如何筛选分类及子分类事件?
在TYPO3 8.7 Extbase中筛选分类及其子分类的事件
我之前在TYPO3 8.7的Extbase项目里也遇到过完全一样的需求——后端选一个分类,前端要显示所有关联该分类或其子分类的记录。确实,默认的CategoryCollection没法直接帮我们做这个筛选,得手动扩展查询逻辑,但其实方法并不复杂,核心思路是先拿到目标分类及其所有子分类的ID集合,再用这些ID来过滤事件。
下面是具体的实现步骤:
1. 递归获取分类及其所有子分类的ID
首先我们需要一个递归方法,传入一个分类对象,返回该分类本身加上所有层级子分类的ID数组。在你的EventRepository里可以这么写:
/** * @var \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository * @inject */ protected $categoryRepository; /** * 递归获取分类及其所有子分类的ID * * @param \TYPO3\CMS\Extbase\Domain\Model\Category $category * @return array */ protected function getCategoryTreeIds(\TYPO3\CMS\Extbase\Domain\Model\Category $category): array { // 先加入当前分类的ID $categoryIds = [$category->getUid()]; // 获取当前分类的直接子分类 $subcategories = $this->categoryRepository->findByParent($category); // 递归遍历每个子分类,把它们的ID也加进来 foreach ($subcategories as $subcategory) { $categoryIds = array_merge($categoryIds, $this->getCategoryTreeIds($subcategory)); } return $categoryIds; }
2. 编写自定义查询方法
接下来在EventRepository里写一个自定义的查询方法,用上面拿到的ID数组来筛选事件:
/** * 根据分类及其所有子分类查找事件 * * @param \TYPO3\CMS\Extbase\Domain\Model\Category $selectedCategory * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface */ public function findByCategoryWithSubcategories(\TYPO3\CMS\Extbase\Domain\Model\Category $selectedCategory) { $query = $this->createQuery(); $categoryIds = $this->getCategoryTreeIds($selectedCategory); // 假设你的Event模型里关联分类的属性叫`categories`(多对多关联) // 如果是一对一关联,就改成`category.uid` return $query->matching( $query->in('categories.uid', $categoryIds) )->execute(); }
3. 在控制器中调用这个方法
最后在插件的控制器里,从后端设置中拿到选中的分类,调用上面的查询方法即可:
// 从插件设置中获取选中的分类(这里要根据你实际的设置字段调整) $selectedCategory = $this->settings['selectedCategory']; // 获取符合条件的事件 $events = $this->eventRepository->findByCategoryWithSubcategories($selectedCategory); // 把事件传给模板 $this->view->assign('events', $events);
补充优化
如果你的分类结构不会频繁变动,可以给getCategoryTreeIds方法加上缓存,避免每次请求都递归查询数据库,提升性能。比如用TYPO3的CacheManager来缓存ID数组。
总结
TYPO3 8.7的Extbase确实没有内置的“包含子分类”查询条件,所以需要手动实现这个递归获取分类树ID的逻辑,这是目前最直接且可靠的方案。按照上面的步骤,就能实现后端选一个分类,前端自动展示该分类下所有层级子分类的事件了。
内容的提问来源于stack exchange,提问作者Adrian Dymorz
相关产品推荐
相关产品推荐

