文档列表标签`archiveList`如何按条件筛选和分页显示文章或产品?

在安企CMS中,当我们希望在网站页面上展示一系列文章、产品或其他内容时,archiveList 标签是我们不可或缺的强大工具。它不仅能帮助我们灵活地提取和展示各类内容,还能根据多种条件进行精细筛选,并优雅地实现内容的分页显示,从而极大提升用户浏览体验和网站的信息组织效率。

灵活获取内容:archiveList 的基础用法

archiveList 标签的核心作用是获取指定的内容列表。最简单的使用方式,就像这样:

{% archiveList archives with type="list" limit="10" %}
    {% for item in archives %}
        <div class="article-item">
            <a href="{{item.Link}}">
                <h3>{{item.Title}}</h3>
                <p>{{item.Description}}</p>
                <span>发布时间:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
            </a>
        </div>
    {% empty %}
        <p>当前没有任何内容可显示。</p>
    {% endfor %}
{% endarchiveList %}

这里,我们通过 archiveList 标签将获取到的文档列表赋值给 archives 变量。type="list" 表示我们希望获取一个简单的列表,而 limit="10" 则限制了显示数量为 10 条。在 for 循环中,我们可以很方便地访问 item 对象的各种属性,如 Title(标题)、Link(链接)、Description(简介)以及 CreatedTime(创建时间)等。如果列表为空,{% empty %} 块中的内容就会显示出来,避免页面空白。

精细筛选,精准定位目标内容

archiveList 标签的真正强大之处在于其丰富的筛选参数,这些参数能帮助我们精确地控制显示哪些内容:

  1. 按内容模型筛选 (moduleId) 如果你的网站有文章和产品等不同的内容类型(在安企CMS中称为“内容模型”),你可以通过 moduleId 参数来指定只显示某一类内容。例如,moduleId="1" 通常用于获取文章列表,而 moduleId="2" 可能用于获取产品列表,具体取决于你在后台的模型设置。

  2. 按分类筛选 (categoryId, excludeCategoryId, child) 这是最常用的筛选方式之一。你可以指定一个或多个分类ID(用逗号隔开),来显示特定分类下的内容。

    • categoryId="1":只显示ID为1的分类下的内容。
    • categoryId="1,2,3":显示ID为1、2、3的分类下的内容。
    • excludeCategoryId="4":排除ID为4的分类下的内容。
    • 默认情况下,archiveList 会自动包含子分类的内容。如果你只希望显示当前指定分类下的内容,而不包括其子分类,可以添加 child=false
    • 一个特别有用的技巧是,如果你在分类列表页使用 archiveList 但不指定 categoryId,它会自动读取当前页面的分类ID。如果你不希望它自动读取,可以明确设置 categoryId="0"
  3. 按推荐属性筛选 (flag, excludeFlag) 在后台发布文章或产品时,我们可以为其设置“头条”、“推荐”、“幻灯”等推荐属性。通过 flag 参数,你可以轻松调用这些被特殊标记的内容。例如,flag="c" 可以用来显示所有被标记为“推荐”的文章,而 excludeFlag="h" 则可以排除所有“头条”内容。

  4. 按关键词搜索 (q) 当你在制作搜索结果页时,q 参数就显得尤为重要。它允许你根据用户输入的关键词来筛选内容标题。如果你的URL中已经包含了 q=关键词 这样的查询参数,archiveList 标签会自动读取并应用这个搜索条件,使得构建搜索功能非常便捷。

  5. 按排序方式展示 (order) 内容的排序可以显著影响用户获取信息的效率。order 参数提供了多种排序方式:

    • order="id desc":按内容ID倒序排列(最新发布的内容在前)。
    • order="views desc":按浏览量倒序排列(热门内容在前)。
    • order="sort desc":按后台设置的自定义排序字段倒序排列。
  6. 自定义筛选参数 安企CMS允许你为内容模型添加自定义字段。如果这些字段被设置为可筛选,那么你就可以通过URL中的查询参数进行高级筛选。例如,如果你的产品模型有一个“颜色”字段,你可以通过在URL中添加 color=红色 来筛选出所有红色的产品。这通常需要配合 archiveFilters 标签来生成这些筛选链接。

  7. 多站点与特殊组合 (siteId, combineId, combineFromId) 如果你在使用安企CMS的多站点管理功能,siteId 可以帮助你获取指定站点的内容。而 combineIdcombineFromId 则是更高级的用法,用于在列表中将两篇内容组合展示,生成新的标题和链接,这在构建对比页面或复杂推荐逻辑时非常有用。

优雅呈现:实现内容分页

当内容数量庞大时,分页是保持页面整洁和提升加载速度的关键。archiveList 标签与 pagination 标签结合,可以轻松实现分页功能。

首先,你需要将 archiveListtype 参数设置为 "page"

{% archiveList archives with type="page" limit="10" categoryId="1" order="id desc" %}
    {% for item in archives %}
        <div class="product-card">
            <a href="{{item.Link}}">
                <img src="{{item.Thumb}}" alt="{{item.Title}}">
                <h3>{{item.Title}}</h3>
                <p>浏览量:{{item.Views}}</p>
            </a>
        </div>
    {% empty %}
        <p>此分类下暂无产品。</p>
    {% endfor %}
{% endarchiveList %}

{# 分页代码将紧随其后 #}
<div class="pagination-area">
    {% pagination pages with show="5" %}
        {# 首页链接 #}
        <a class="page-link {% if pages.FirstPage.IsCurrent %}active{% endif %}" href="{{pages.FirstPage.Link}}">{{pages.FirstPage.Name}}</a>
        {# 上一页链接 #}
        {% if pages.PrevPage %}
        <a class="page-link" href="{{pages.PrevPage.Link}}">{{pages.PrevPage.Name}}</a>
        {% endif %}
        {# 中间页码链接 #}
        {% for pageItem in pages.Pages %}
        <a class="page-link {% if pageItem.IsCurrent %}active{% endif %}" href="{{pageItem.Link}}">{{pageItem.Name}}</a>
        {% endfor %}
        {# 下一页链接 #}
        {% if pages.NextPage %}
        <a class="page-link" href="{{pages.NextPage.Link}}">{{pages.NextPage.Name}}</a>
        {% endif %}
        {# 末页链接 #}
        <a class="page-link {% if pages.LastPage.IsCurrent %}active{% endif %}" href="{{pages.LastPage.Link}}">{{pages.LastPage.Name}}</a>
    {% endpagination %}
</div>

在这个例子中,limit="10" 定义了每页显示 10 条内容。pagination pages with show="5" 则会生成一个分页导航,其中 show="5" 表示最多显示 5 个页码按钮。pages 对象包含了所有与分页相关的信息,比如总页数 (TotalPages)、当前页 (CurrentPage)、首页链接 (FirstPage)、末页链接 (LastPage)、上一页 (PrevPage) 和下一页 (NextPage),以及所有可见页码的数组 (Pages)。通过循环 pages.Pages,我们可以构建出完整且可点击的页码导航。

总结

archiveList 标签是安