在AnQiCMS中高效地展示文章列表,并支持多种排序、筛选与分页方式,是内容管理的核心环节。理解其模板标签的灵活运用,能帮助您构建出高度定制化且用户体验友好的内容展示页面。

要实现这一目标,我们主要依赖AnQiCMS强大的模板标签体系,特别是核心的archiveList 标签,配合pagination 标签以及各种辅助性过滤器和逻辑控制。

一、核心:archiveList 标签的使用

archiveList 标签是获取和展示文章(或其他内容模型)列表的基础。它如同一个数据查询器,能够根据您设定的条件从数据库中提取文章。

在模板中,您可以这样引入并使用它:

{% archiveList archives with type="list" limit="10" %}
    {# 在这里循环展示每篇文章的详细信息 #}
{% endarchiveList %}

在这里,archives 是您自定义的一个变量名,用于存储获取到的文章列表。type="list" 表示我们获取的是一个固定数量的文章列表。limit="10" 则限定了只显示最新的10篇文章。

{% for item in archives %} 这样的循环中,item 变量会包含每篇文章的多种信息,例如 item.Title(标题)、item.Link(链接)、item.Description(简介)、item.Views(浏览量)和 item.CreatedTime(发布时间)等。这些字段可以被灵活地用于构建列表的显示内容。

二、实现文章列表的灵活展示

仅仅展示固定数量的文章列表是不够的,我们需要能够根据用户的需求或运营策略,对文章进行排序和筛选。

1. 智能排序

archiveList 标签提供了 order 参数,让您可以轻松地控制文章的排列顺序。

  • 按发布时间排序: 默认情况下,文章通常按ID降序(即最新发布)排列,您可以显式指定 order="id desc"
  • 按浏览量排序: 如果您想展示热门文章,可以设置为 order="views desc"
  • 按后台自定义排序: 某些内容可能需要人工干预排序,AnQiCMS支持 order="sort desc"

例如,要显示10篇浏览量最高的文章:

{% archiveList archives with type="list" limit="10" order="views desc" %}
    {# 循环展示文章 #}
{% endarchiveList %}

2. 丰富的筛选方式

筛选功能是内容展示个性化的关键。AnQiCMS提供了多种筛选途径。

  • 基于分类与属性筛选: 您可以使用 categoryId 参数来显示特定分类下的文章,例如 categoryId="1"。如果文章被赋予了推荐属性(如头条[h]、推荐[c]等),则可以通过 flag="c" 参数来筛选。如果您希望排除某些分类或属性,还可以使用 excludeCategoryIdexcludeFlag 参数。

    例如,显示文章模型(moduleId="1")下,ID为5的分类中的所有推荐文章:

    {% archiveList articles with moduleId="1" categoryId="5" flag="c" type="list" %}
        {# 循环展示推荐文章 #}
    {% endarchiveList %}
    
  • 全文搜索筛选: 对于用户输入的搜索关键词,archiveListq 参数能够派上用场。通常,搜索页面会将用户输入的关键词通过URL参数 q 传递,archiveList 会自动捕获并根据文章标题进行匹配。

    例如,搜索结果页面:

    {% archiveList searchResults with type="page" q=urlParams.q %}
        {# 循环展示搜索结果 #}
    {% endarchiveList %}
    

    urlParams.q 会自动获取URL中?q=关键词关键词部分)

  • 高级自定义参数筛选: AnQiCMS最强大的筛选功能之一是支持基于内容模型自定义字段的筛选。这对于构建垂直领域网站(如房产、招聘、商品)非常有用。您可以在后台为内容模型添加诸如“户型”、“薪资范围”、“品牌”等自定义字段,并将其设置为可筛选。

    要实现这种筛选,我们需要用到 archiveFilters 标签来生成筛选条件,然后 archiveList 会自动响应这些条件。archiveFilters 标签会返回一个包含每个筛选维度及其可选值的列表,并且会根据当前URL参数自动标记已选中的筛选项。

    例如,在房产网站中,您可以根据“户型”和“区域”进行筛选:

    {# 生成筛选条件 #}
    {% archiveFilters filters with moduleId="1" allText="不限" %}
        {% for item in filters %}
        <div>
            <span>{{item.Name}}: </span>
            {% for val in item.Items %}
            <a href="{{val.Link}}" class="{% if val.IsCurrent %}active{% endif %}">{{val.Label}}</a>
            {% endfor %}
        </div>
        {% endfor %}
    {% endarchiveFilters %}
    
    
    {# 结合筛选条件展示文章列表,archiveList会自动识别URL中的筛选参数 #}
    {% archiveList properties with type="page" moduleId="1" %}
        {# 循环展示房产列表 #}
    {% endarchiveList %}
    

    当用户点击筛选条件时,URL会自动携带相应的参数(如 ?huxing=三室一厅&quyu=朝阳区),archiveList 会根据这些参数动态调整查询结果。

三、精准控制分页显示

对于文章数量庞大的网站,分页是必不可少的功能。AnQiCMS将文章列表数据获取和分页链接的生成解耦,提供了清晰的实现路径。

要启用分页,首先在 archiveList 标签中将 type 参数设置为 "page"

{% archiveList articles with type="page" limit="10" %}
    {# 循环展示当前页的文章 #}
{% endarchiveList %}

limit="10" 在这里表示每页显示10篇文章。

接下来,利用pagination 标签来渲染分页链接:

{% pagination pages with show="5" %}
    <a href="{{pages.FirstPage.Link}}">首页</a>
    {% if pages.PrevPage %}
    <a href="{{pages.PrevPage.Link}}">上一页</a>
    {% endif %}
    {% for item in pages.Pages %}
    <a href="{{item.Link}}" class="{% if item.IsCurrent %}active{% endif %}">{{item.Name}}</a>
    {% endfor %}
    {% if pages.NextPage %}
    <a href="{{pages.NextPage.Link}}">下一页</a>
    {% endif %}
    <a href="{{pages.LastPage.Link}}">末页</a>
{% endpagination %}

pagination 标签会生成一个 pages 对象,其中包含当前页、总页数、首页、末页、上一页、下一页以及中间页码列表等信息。show="5" 参数控制了中间页码链接的最大显示数量。通过循环 pages.Pages,您可以构建出常见的分页导航。

四、结合其他标签提升列表信息维度

为了让文章列表更加丰富和实用,我们经常需要集成其他信息。

  • 显示文章分类信息: 在文章列表中,除了文章标题,通常还需要显示其所属分类。虽然 item.CategoryId 提供了分类ID,但要获取分类名称和链接,可以使用 categoryDetail 标签

    <span>所属分类:{% categoryDetail with name="Title" id=item.CategoryId %}</span>
    
  • 格式化时间与日期: 文章的发布时间通常是时间戳格式,为了便于阅读,可以使用 stampToDate 过滤器进行格式化:

    <span>发布时间:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
    

    其中的 “2006-01-02” 是Go语言的时间格式化标准,代表“年-月-日”。

  • 展示文章标签: 如果文章关联了标签,可以使用 tagList 标签来获取并展示:

    {% tagList tags with itemId=item.Id %}
        {% for tag in tags %}
        <a href="{{tag.Link}}">{{tag.Title}}</a>
        {% endfor %}
    {% endtagList %}
    
  • 访问自定义字段: 当内容模型定义了额外的自定义字段时,可以通过 archiveParams 标签或直接通过 `item.自定义字段名