如何在AnQiCMS模板中显示当前分类及其子分类的所有文档?

在AnQiCMS的模板设计中,灵活地展示内容是网站运营的关键。当您需要在一个分类页面中,不仅显示当前分类下的文章,还希望将所有子分类的文章也一并呈现,或者以更结构化的方式展示时,AnQiCMS提供了强大的模板标签来实现这些需求。本文将详细介绍如何在您的AnQiCMS模板中实现这一功能。

理解AnQiCMS的分类与文档机制

在AnQiCMS中,内容通常组织在“文档模型”和“分类”之下。每个文档(或称文章/产品等)都归属于一个特定的分类,而分类之间可以存在父子层级关系。这种层级结构为内容的组织和展示提供了极大的灵活性。当我们在模板中调用内容时,需要明确是从哪个分类(及其子分类)获取,以及以何种方式排序和限制数量。

核心标签:archiveListcategoryList

实现当前分类及其子分类文档显示的核心在于两个模板标签:

  1. categoryList (分类列表标签):用于获取分类信息,包括当前分类的子分类。通过遍历这个列表,我们可以获取到所有子分类的ID和名称。
  2. archiveList (文档列表标签):用于获取文档列表。这个标签非常强大,它允许您通过多种参数来筛选文档,其中最关键的就是categoryId(分类ID)和child(是否包含子分类文档)。

接下来,我们将通过两种常见的场景来演示具体操作。

场景一:直接显示当前分类及其所有子分类的文档

这是最直接的需求,即在一个分类页面上,将所有属于当前分类及其下所有子分类(包括孙子分类等)的文档,一次性地罗列出来。

要实现这一功能,我们主要依赖archiveList标签的categoryIdchild参数。当您在一个分类页面的模板(例如{模型table}/list.html)中使用archiveList时,如果省略categoryId参数,archiveList默认会尝试读取当前页面的分类ID。而child参数默认为true,意味着它会自动包含所有子分类的文档。

代码示例:

{# 假设我们正在一个分类列表页面的模板中,例如 articles/list.html #}

{# 首先,可以获取当前分类的详细信息,用于标题等展示,这不是必须的,但有助于页面上下文 #}
{% categoryDetail currentCategory with name="Id" %}
{% categoryDetail currentCategoryTitle with name="Title" %}

<h1>{{ currentCategoryTitle }} 及下属所有分类文档</h1>

<div class="document-list-container">
    {% archiveList archives with type="page" limit="10" order="id desc" %}
        {% for item in archives %}
        <div class="document-item">
            <a href="{{ item.Link }}">
                <h3>{{ item.Title }}</h3>
                {% if item.Thumb %}
                <img src="{{ item.Thumb }}" alt="{{ item.Title }}" class="document-thumb">
                {% endif %}
                <p class="document-description">{{ item.Description }}</p>
                <div class="document-meta">
                    <span>所属分类: {% categoryDetail categoryName with name="Title" id=item.CategoryId %}{{ categoryName }}</span>
                    <span>发布日期: {{ stampToDate(item.CreatedTime, "2006-01-02") }}</span>
                    <span>浏览量: {{ item.Views }}</span>
                </div>
            </a>
        </div>
        {% empty %}
        <p>当前分类及其子分类下没有任何文档。</p>
        {% endfor %}
    {% endarchiveList %}

    {# 如果需要分页,可以结合 pagination 标签 #}
    {% pagination pages with show="5" %}
    <div class="pagination-nav">
        {% if pages.PrevPage %}<a href="{{ pages.PrevPage.Link }}">上一页</a>{% endif %}
        {% for p in pages.Pages %}<a href="{{ p.Link }}" class="{% if p.IsCurrent %}active{% endif %}">{{ p.Name }}</a>{% endfor %}
        {% if pages.NextPage %}<a href="{{ pages.NextPage.Link }}">下一页</a>{% endif %}
    </div>
    {% endpagination %}
</div>

代码解释:

  • {% categoryDetail currentCategory with name="Id" %}:这行代码会隐式获取当前分类页面的ID,并将其值赋给currentCategory变量(虽然这里没有直接使用这个变量,但archiveList会在未指定categoryId时自动使用当前页面的分类ID)。
  • {% archiveList archives with type="page" limit="10" order="id desc" %}
    • archives:定义一个变量来存储获取到的文档列表。
    • type="page":表示这是一个需要分页的列表。
    • limit="10":每页显示10篇文章。
    • order="id desc":按文档ID倒序排列,即最新发布的在前。
    • 由于未指定categoryIdarchiveList会智能地获取当前分类的ID。
    • 由于未指定child参数,它会使用默认值true,自动包含所有子分类的文档。
  • {% for item in archives %}...{% empty %}...{% endfor %}:循环遍历文档列表,如果列表为空,则显示{% empty %}内的内容。
  • {% categoryDetail categoryName with name="Title" id=item.CategoryId %}:在文档循环内部,根据每篇文章的CategoryId动态获取其所属分类的名称。
  • {% pagination pages with show="5" %}:用于生成分页导航,让用户可以在不同页面之间切换。

场景二:分层次显示:先当前分类文档,再逐级显示子分类及其文档

如果您希望页面结构更清晰,例如先显示当前主分类下的直接文档,然后列出其子分类,并在每个子分类下再列出其文档,可以采用嵌套循环的方式。

代码示例:

”`twig {# 假设我们正在一个分类列表页面的模板中,例如 products/list.html #}

{# 1. 获取当前分类的详细信息 #} {% categoryDetail currentCategoryDetail %}

{{ currentCategoryDetail.Title }}

{{ currentCategoryDetail.Description }}

{# 2. 显示当前分类下的直接文档(不包含子分类的文档) #}

{{ currentCategoryDetail.Title }} 下的文档