TYPO3系统分类及子分类展示实现技术咨询
TYPO3多级分类列表解决方案
1. 调整控制器逻辑
让listAction支持接收父分类ID参数,默认加载顶级分类,传入ID时加载对应子分类:
public function listAction(?int $parentUid = null) { if ($parentUid) { // 获取指定分类的子分类 $categories = $this->categorieRepository->findByParent($parentUid); // 传递当前父分类信息,用于显示层级导航 $currentCategory = $this->categorieRepository->findByUid($parentUid); $this->view->assign('currentCategory', $currentCategory); } else { // 默认加载pid=177下的顶级分类(parent为空的分类) $categories = $this->categorieRepository->findBy(['pid' => 177, 'parent' => 0]); } $this->view->assign('categories', $categories); }
如果你的CategorieRepository里没有findByParent方法,需要补上:
public function findByParent(int $parentUid) { $query = $this->createQuery(); $query->matching( $query->equals('parent', $parentUid) ); return $query->execute(); }
2. 修改模板实现层级展示
更新List.html,添加层级导航、分类跳转链接,还支持递归展开多级子分类:
<div> <!-- 层级导航:返回上级分类 --> <f:if condition="{currentCategory}"> <f:link.action action="list">返回顶级分类</f:link.action> <span> > </span> <f:link.action action="list" arguments="{parentUid: currentCategory.parent}">{currentCategory.title}</f:link.action> </f:if> <!-- 分类列表 --> <ul> <f:for each="{categories}" as="categorie"> <li> <f:link.action action="list" arguments="{parentUid: categorie.uid}"> {categorie.title} </f:link.action> <!-- 递归渲染子分类(如果有) --> <f:if condition="{categorie.children}"> <f:render section="SubCategories" arguments="{categories: categorie.children}" /> </f:if> </li> </f:for> </ul> </div> <!-- 递归子分类的模板片段 --> <f:section name="SubCategories"> <ul> <f:for each="{categories}" as="categorie"> <li> <f:link.action action="list" arguments="{parentUid: categorie.uid}"> {categorie.title} </f:link.action> <f:if condition="{categorie.children}"> <f:render section="SubCategories" arguments="{categories: categorie.children}" /> </f:if> </li> </f:for> </ul> </f:section>
要让模板里的{categorie.children}生效,需要在Categorie模型中添加子分类关联:
/** * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Extension\Domain\Model\Categorie> */ protected $children; public function __construct() { $this->children = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); } /** * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Extension\Domain\Model\Categorie> */ public function getChildren() { return $this->children; }
同时要在TCA配置里给parent字段设置双向关联,确保Extbase能自动加载子分类数据。
3. 可选:配置友好URL
如果需要更美观的URL,可以在ext_localconf.php中添加路由增强配置:
$GLOBALS['TYPO3_CONF_VARS']['FE']['routeEnhancers']['CategoryList'] = [ 'type' => 'Extbase', 'extension' => '你的扩展标识', 'plugin' => '你的插件名称', 'routes' => [ [ 'routePath' => '/category/{parentUid}', '_controller' => 'Categorie::list', '_arguments' => [ 'parentUid' => 'parentUid' ] ], [ 'routePath' => '/categories', '_controller' => 'Categorie::list' ] ], 'defaultController' => 'Categorie::list', 'defaults' => [ 'parentUid' => null ], 'requirements' => [ 'parentUid' => '\d+' ] ];
内容的提问来源于stack exchange,提问作者johndoe555
相关产品推荐
相关产品推荐

