在安企CMS中管理网站内容时,我们通常会将文章按照不同的分类进行组织,形成清晰的分类层级结构。这种结构在后台管理内容时提供了极大的便利。然而,在前端页面展示文章列表时,我们有时需要更精确地控制内容的显示范围,例如,只希望展示当前分类下直接发布的文章,而不包含其子分类中的内容。

幸运的是,安企CMS为此提供了一个简单而强大的解决方案:利用 archiveList 模板标签的 child 参数。

理解问题:默认行为与精确控制的需求

默认情况下,当你在一个分类页面(例如,访问“新闻中心”分类)使用 archiveList 标签调用文章列表时,安企CMS会智能地获取该分类下 及其所有子分类 下的文章。这在很多场景下是方便的,因为它能自动聚合相关内容。

但设想一下这样的情况:你有一个“产品介绍”的大分类,下面有“手机”、“电脑”、“配件”等子分类。在“产品介绍”页面,你可能只想展示一些通用的、直接归属于“产品介绍”分类的概览性文章,而不是把所有“手机”、“电脑”和“配件”下的具体产品文章都混在一起。这时,就需要将子分类的文章排除在外。

解决方案:archiveList 标签的 child=false 参数

安企CMS的 archiveList 标签是用于在模板中获取和展示文章列表的核心工具。它提供了多个参数来精细化控制文章的筛选条件,其中 child 参数正是解决我们当前问题的关键。

child 参数支持 truefalse 两个值:

  • child=true(默认行为):这将获取指定分类及其所有子分类下的文章。如果你不设置这个参数,系统会默认按 true 处理。
  • child=false:这将只获取指定分类下 直接发布 的文章,完全排除其任何子分类中的内容。

因此,要实现文章列表只显示当前分类下的文档,而不包括其子分类内容,我们需要在 archiveList 标签中明确指定 categoryId 参数(即当前分类的ID),并将其 child 参数设置为 false

实施步骤与代码示例

通常,你会在一个分类的列表模板文件(例如 /template/你的模板名/article/list.html 或更具体的 article/list-{分类ID}.html)中使用 archiveList 标签来展示文章。

  1. 获取当前分类ID: 在分类页面上下文中,安企CMS通常会将当前分类的信息暴露给模板。你可以通过 {{category.Id}} 来获取当前分类的唯一ID。

  2. 使用 archiveList 标签: 将获取到的分类ID赋值给 archiveListcategoryId 参数,并将 child 参数设置为 false

下面是一个具体的模板代码示例,展示如何在文章列表页中,只显示当前分类的文章,不包含子分类内容:

{# 假设这是在“文章”模型的某个分类列表模板中(例如:/template/default/article/list.html) #}

{# 1. 获取当前分类的ID。在分类页面上下文中,可以直接访问 'category.Id' #}
{% set currentCategoryId = category.Id %}

<div class="category-articles-section">
    {# 2. 显示当前分类的标题 #}
    <h1>{{ category.Title }} 下的最新文章</h1>
    <p>(只包含直接发布在本分类下的内容,不含子分类)</p>

    <ul>
        {# 3. 使用 archiveList 标签,指定当前分类ID,并设置 child=false #}
        {% archiveList archives with type="page" categoryId=currentCategoryId child=false limit="10" %}
            {% for item in archives %}
            <li>
                <h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
                <p>{{ item.Description }}</p>
                <small>发布日期: {{ stampToDate(item.CreatedTime, "2006-01-02") }} | 浏览量: {{ item.Views }}</small>
            </li>
            {% empty %}
            <li>
                当前分类下没有直接发布的文章。
            </li>
            {% endfor %}
        {% endarchiveList %}
    </ul>

    {# 4. 如果需要分页,可以继续添加分页标签 #}
    <div class="pagination-area">
        {% pagination pages with show="5" %}
            {# 首页 #}
            <a class="{% if pages.FirstPage.IsCurrent %}active{% endif %}" href="{{pages.FirstPage.Link}}">{{pages.FirstPage.Name}}</a>
            {# 上一页 #}
            {% if pages.PrevPage %}
            <a href="{{pages.PrevPage.Link}}">{{pages.PrevPage.Name}}</a>
            {% endif %}
            {# 中间多页 #}
            {% for item in pages.Pages %}
            <a class="{% if item.IsCurrent %}active{% endif %}" href="{{item.Link}}">{{item.Name}}</a>
            {% endfor %}
            {# 下一页 #}
            {% if pages.NextPage %}
            <a href="{{pages.NextPage.Link}}">{{pages.NextPage.Name}}</a>
            {% endif %}
            {# 尾页 #}
            <a class="{% if pages.LastPage.IsCurrent %}active{% endif %}" href="{{pages.LastPage.Link}}">{{pages.LastPage.Name}}</a>
        {% endpagination %}
    </div>
</div>

通过上述代码,你就可以精确地控制文章列表,使其只展示当前分类下的内容,而无需担心子分类文章的混入。这种方式有助于创建更清晰、更符合用户预期的内容展示页面,提升整体的网站用户体验和内容管理效率。


常见问题 (FAQ)

Q1: 为什么我的文章列表显示了子分类的内容,即使我没有明确设置 child 参数? A1: archiveList 标签中的 child 参数默认值为 true。这意味着如果你不显式地设置 child=false,系统会自动包含当前分类及其所有子分类下的文章。要只显示当前分类的内容,务必将 child 参数设置为 false

Q2: 在模板中,如何动态获取当前分类的 ID 赋值给 categoryId 参数? A2: 在处理分类列表页或分类详情页的模板时,通常当前分类的所有信息都会被加载到 category 对象中。因此,你可以直接使用 {{category.Id}} 来获取当前分类的 ID,并将其赋值给 archiveList 标签的 categoryId 参数。

Q3: 如果我想显示所有分类(包括子分类)的文章,应该如何设置 child 参数? A3: 如果你希望 archiveList 标签的行为保持默认,即同时显示当前分类和其所有子分类的文章,你可以选择不设置 child 参数(因为它默认为 true),或者明确地将其设置为 child=true。两种方式效果相同。例如:{% archiveList archives with type="page" categoryId=currentCategoryId limit="10" %}{% archiveList archives with type="page" categoryId=currentCategoryId child=true limit="10" %}