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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:33:24