如何在安企CMS中显示不同层级的文档分类列表及其关联的文档?

在网站运营中,如何高效地组织和展示海量内容,是提升用户体验和网站可用性的关键。对于使用安企CMS(AnQiCMS)的朋友们来说,系统提供了强大的内容模型和模板标签功能,能够帮助我们轻松实现多层级的文档分类列表,并清晰地展示每个分类下关联的文档。

接下来,我们就一起探索如何在安企CMS中,利用这些功能,构建一个既有层次感又内容丰富的网站导航。

理解安企CMS的内容结构

在安企CMS中,内容主要围绕“内容模型”和“分类”两个核心概念构建。内容模型(如文章模型、产品模型)定义了内容的类型和其特有的字段,而分类则是这些内容模型下的组织结构。每一个文档(无论是文章还是产品)都会归属于一个特定的分类。

要显示不同层级的文档分类及其关联文档,我们主要会用到安企CMS的两个关键模板标签:categoryList 用于获取分类信息,以及 archiveList 用于获取文档列表。

获取顶层文档分类列表

首先,我们需要在模板中展示最顶级的分类。这通常是网站主导航的基础。我们可以使用 categoryList 标签,并通过 parentId="0" 来指定获取所有没有上级分类的顶级分类。同时,别忘了通过 moduleId 参数指定是获取文章模型(通常是 1)还是产品模型(通常是 2)的分类。

一个简单的例子,用来展示文章模型的顶级分类列表:

{% categoryList categories with moduleId="1" parentId="0" %}
    <ul>
        {% for item in categories %}
            <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
        {% endfor %}
    </ul>
{% endcategoryList %}

在这段代码中,categories 是我们为顶级分类列表定义的变量名,item 则是循环中每个分类的实例。item.Link 会自动输出该分类的访问链接,item.Title 则显示分类名称。

展示多层级的子分类

网站结构往往不止一层。安企CMS的 categoryList 标签支持嵌套使用,允许我们在顶级分类下进一步展示其子分类。这得益于 item 对象中的 HasChildren 字段,它可以判断当前分类是否有子分类。

如果一个分类有子分类,我们就可以在其内部再次调用 categoryList,并将当前分类的 Id 作为 parentId 传递给子分类的查询,这样就能逐层展开。

考虑一个两级分类的展示:

{% categoryList topCategories with moduleId="1" parentId="0" %}
    <ul class="main-nav">
        {% for category in topCategories %}
            <li>
                <a href="{{ category.Link }}">{{ category.Title }}</a>
                {% if category.HasChildren %} {# 判断当前分类是否有子分类 #}
                    <ul class="sub-nav">
                        {% categoryList subCategories with parentId=category.Id %} {# 获取当前分类的子分类 #}
                            {% for subCategory in subCategories %}
                                <li><a href="{{ subCategory.Link }}">{{ subCategory.Title }}</a></li>
                            {% endfor %}
                        {% endcategoryList %}
                    </ul>
                {% endif %}
            </li>
        {% endfor %}
    </ul>
{% endcategoryList %}

这样,我们就能在网站上看到清晰的二级分类导航结构了。如果需要更多层级,可以依照这个模式继续嵌套 categoryList

关联并显示每个分类下的文档

仅仅展示分类名称还不够,用户更希望看到每个分类下具体的内容。这时,archiveList 标签就派上用场了。我们可以在循环展示分类的同时,调用 archiveList 来显示该分类下的文档。

关键在于将当前分类的 Id 传递给 archiveListcategoryId 参数,这样 archiveList 就会只获取属于当前分类的文档。为了页面整洁,通常我们会限制显示文档的数量,使用 limit 参数可以轻松实现。

例如,在每个分类下显示最新的5篇文档:

{% categoryList categories with moduleId="1" parentId="0" %}
    <div class="category-section">
        {% for cat in categories %}
            <h3><a href="{{ cat.Link }}">{{ cat.Title }}</a></h3>
            <ul class="document-list">
                {% archiveList docs with type="list" categoryId=cat.Id limit="5" %} {# 获取当前分类下的5篇文档 #}
                    {% for doc in docs %}
                        <li><a href="{{ doc.Link }}">{{ doc.Title }}</a></li>
                    {% empty %} {# 如果当前分类下没有文档 #}
                        <li>暂无相关文档。</li>
                    {% endfor %}
                {% endarchiveList %}
            </ul>
        {% endfor %}
    </div>
{% endcategoryList %}

综合示例:构建完整的层级导航与内容列表

现在,让我们把上述概念结合起来,构建一个既能显示多级分类,又能显示每个分类下关联文档的完整示例。一个常见的需求是,如果分类有子分类,就显示子分类列表;如果没有子分类,就直接显示该分类下的文档。

”`twig {# 假设我们正在制作一个产品列表页面,产品模型的ID是2 #}

{% categoryList productCategories with moduleId="2" parentId="0" %} {# 获取产品模型的顶级分类 #}
    <ul class="main-categories">
        {% for mainCategory in productCategories %}
            <li>
                <a href="{{ mainCategory.Link }}">{{ mainCategory.Title }}</a>
                {% if mainCategory.HasChildren %} {# 如果有子分类,则显示子分类 #}
                    <ul class="sub-categories">
                        {% categoryList subCategories with parentId=mainCategory.Id %} {# 获取子分类 #}
                            {% for subCategory in subCategories %}
                                <li>
                                    <a href="{{ subCategory.Link }}">{{ subCategory.Title }}</a>
                                    {# 可以在这里继续嵌套显示三级分类,或直接显示文档 #}
                                    {% if subCategory.HasChildren %}
                                        <ul class="tertiary-categories">
                                            {% categoryList tertiaryCategories with parentId=subCategory.Id %}
                                                {% for tercat in tertiaryCategories %}
                                                    <li><a href="{{ tercat.Link }}">{{ tercat.Title }}</a></li>
                                                {% endfor %}
                                            {% endcategoryList %}
                                        </ul>
                                    {% else %}
                                        {# 如果没有三级分类,则直接显示该二级分类下的产品文档 #}
                                        <ul class="associated-products">
                                            {% archiveList products with type="list" categoryId=subCategory.Id limit="4" %}
                                                {% for product in products %}
                                                    <li>
                                                        <a href="{{ product.Link }}">
                                                            <img src="{{ product.Thumb }}" alt="{{ product.Title }}" />
                                                            <span>{{ product.Title }}</span>
                                                        </a>
                                                    </li>
                                                {% empty %}
                                                    <li>该分类暂无产品。</li>
                                                {% endfor %}
                                            {% endarchiveList %}
                                        </ul>
                                    {% endif %}
                                </li>
                            {% endfor %}
                        {% endcategoryList %}
                    </ul>
                {% else %} {# 如果没有子分类,则直接显示该顶级分类下的产品文档 #}
                    <ul class="associated-products">
                        {% archiveList products with type="list" categoryId=mainCategory.Id limit="4" %}
                            {% for product in products %}
                                <li>
                                    <a href="{{ product.Link }}">
                                        <img src="{{ product.Thumb }}" alt="{{ product.Title }}" />
                                        <span>{{ product.Title }}</span>