在AnQiCMS的模板设计中,灵活地展示内容是网站运营的关键。当您需要在一个分类页面中,不仅显示当前分类下的文章,还希望将所有子分类的文章也一并呈现,或者以更结构化的方式展示时,AnQiCMS提供了强大的模板标签来实现这些需求。本文将详细介绍如何在您的AnQiCMS模板中实现这一功能。
理解AnQiCMS的分类与文档机制
在AnQiCMS中,内容通常组织在“文档模型”和“分类”之下。每个文档(或称文章/产品等)都归属于一个特定的分类,而分类之间可以存在父子层级关系。这种层级结构为内容的组织和展示提供了极大的灵活性。当我们在模板中调用内容时,需要明确是从哪个分类(及其子分类)获取,以及以何种方式排序和限制数量。
核心标签:archiveList 与 categoryList
实现当前分类及其子分类文档显示的核心在于两个模板标签:
categoryList(分类列表标签):用于获取分类信息,包括当前分类的子分类。通过遍历这个列表,我们可以获取到所有子分类的ID和名称。archiveList(文档列表标签):用于获取文档列表。这个标签非常强大,它允许您通过多种参数来筛选文档,其中最关键的就是categoryId(分类ID)和child(是否包含子分类文档)。
接下来,我们将通过两种常见的场景来演示具体操作。
场景一:直接显示当前分类及其所有子分类的文档
这是最直接的需求,即在一个分类页面上,将所有属于当前分类及其下所有子分类(包括孙子分类等)的文档,一次性地罗列出来。
要实现这一功能,我们主要依赖archiveList标签的categoryId和child参数。当您在一个分类页面的模板(例如{模型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倒序排列,即最新发布的在前。- 由于未指定
categoryId,archiveList会智能地获取当前分类的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. 显示当前分类下的直接文档(不包含子分类的文档) #}