在内容管理系统中,如何高效地展示文章或产品列表,并为用户提供流畅的分页体验,是网站运营者普遍关心的问题。AnQiCMS作为一个基于Go语言开发的系统,通过其灵活强大的模板标签系统,让这一切变得直观且高效。接下来,我们将探讨如何利用AnQiCMS的内置功能,轻松实现文章或产品的列表展示与分页功能。

开启内容列表的旅程:archiveList标签

AnQiCMS为我们提供了功能强大的archiveList标签,它是获取网站文章、产品以及其他自定义内容模型列表的核心。无论你想展示最新的博客文章、热门的产品、或是特定分类下的内容,archiveList都能轻松应对。

在使用archiveList标签时,有几个关键参数需要我们留意:

  • moduleId:区分内容类型 AnQiCMS支持创建多种内容模型,例如文章模型和产品模型。当你调用列表时,通过moduleId参数来指定你想要获取哪种类型的内容。通常情况下,文章模型的moduleId"1",产品模型是"2",自定义模型则会有对应的ID。
  • categoryId:精准定位分类 如果你只想展示某个特定分类下的内容,可以使用categoryId参数。例如,categoryId="10"会只列出ID为10的分类下的内容。它甚至支持传入多个分类ID,用逗号隔开,比如categoryId="10,12,15"。如果不指定,系统会尝试读取当前页面的分类ID来展示。
  • limit:控制每页数量 这个参数用于控制每页显示多少条内容。比如,limit="10"意味着每页最多显示10条内容。
  • order:定义排序规则 你可以根据自己的需求,定义内容的排序方式。常用的有按发布时间倒序(order="id desc")、按浏览量倒序(order="views desc")、或按后台自定义排序(order="sort desc")等。
  • type="page":分页功能的关键 这是实现分页功能的关键参数。当你将type参数设置为"page"时,AnQiCMS会告诉系统为这个列表准备好分页所需的所有数据,为后续的分页导航做好铺垫。如果只希望获取固定数量的列表而不分页,可以设置为"list"

一个简单的文章列表调用可能像这样:

{# 假设我们想获取文章模型(moduleId="1")下最新发布的10篇文章 #}
<div>
{% archiveList archives with moduleId="1" order="id desc" limit="10" %}
    {% for item in archives %}
    <article>
        <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
        <p>{{item.Description}}</p>
        <footer>
            <span>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
            <span>浏览量:{{item.Views}}</span>
        </footer>
    </article>
    {% empty %}
    <p>暂时没有内容可供展示。</p>
    {% endfor %}
{% endarchiveList %}
</div>

在这个例子中,archives是我们定义的变量名,它会包含所有符合条件的内容项。for循环会遍历这些内容,并使用item.Titleitem.Link等字段来展示具体信息。stampToDate是一个非常实用的标签,能帮助我们将时间戳格式化为我们想要的日期样式。

赋予列表生命:pagination标签实现分页

一旦archiveList标签通过type="page"参数准备好了分页数据,pagination标签就能完美接力,为我们的内容列表创建出用户友好的分页导航。

pagination标签会接收一个包含所有分页信息的对象,我们可以利用它来构建“首页”、“上一页”、“下一页”、“末页”以及中间的页码链接。

  • show:控制页码数量 这个参数决定了分页导航中可见的页码数量。例如,show="5"会显示当前页码附近最多5个页码链接,让分页条看起来更简洁。

一个完整的、包含分页功能的内容列表通常会结合archiveListpagination标签来使用:

{# 假设我们正在文章列表页,希望分页显示文章,每页10条 #}
<div>
{% archiveList articles with moduleId="1" type="page" order="id desc" limit="10" %}
    {# 文章列表部分 #}
    {% for item in articles %}
    <article>
        <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
        <p>{{item.Description}}</p>
        <footer>
            <span>分类:{% categoryDetail with name="Title" id=item.CategoryId %}</span>
            <span>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
            <span>浏览量:{{item.Views}}</span>
        </footer>
    </article>
    {% empty %}
    <p>暂时没有内容可供展示。</p>
    {% endfor %}

    {# 分页导航部分 #}
    <div class="pagination-nav">
        {% 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>
            <span class="page-info">当前第 {{pages.CurrentPage}} / {{pages.TotalPages}} 页,共 {{pages.TotalItems}} 条</span>
        {% endpagination %}
    </div>
{% endarchiveList %}
</div>

这里,pages是一个包含所有分页信息的对象,它提供了FirstPage(首页)、PrevPage(上一页)、Pages(中间页码数组)、NextPage(下一页)和LastPage(末页)等实用属性。每个属性又包含Link(链接地址)和IsCurrent(是否当前页)等子属性,让我们能灵活地构建分页导航的样式和逻辑。

更精准的列表控制:筛选与搜索

AnQiCMS还允许我们对列表进行更细致的筛选和搜索。

  • q:集成搜索功能archiveList中使用q参数可以实现搜索功能。例如,q="AnQiCMS"会只显示标题中包含”AnQiCMS”的文章。如果你想让用户通过搜索框提交关键词,通常会结合一个HTML表单,并将搜索关键词作为URL的查询参数传递,AnQiCMS会自动识别并应用。
    
    <form method="get" action="/search"> {# 假设搜索结果页面的URL是/search #}
        <input type="text" name="q" placeholder="请输入搜索关键词" value="{{urlParams.q}}">
        <button type="submit">搜索</button>
    </form>
    
    这里,urlParams.q可以帮助我们保留用户上次输入的搜索词。
  • flag:按推荐属性筛选 在后台编辑文章或产品时,我们可以设置“头条”、“推荐”、“幻灯”等属性(Flag)。通过flag参数,可以轻松筛选出这些特殊内容。例如,flag="c"将显示所有被标记为“推荐”的内容。
  • excludeCategoryId:排除特定分类 如果想在某个分类列表页中排除其子分类或特定分类的内容,可以使用excludeCategoryId
  • 自定义模型字段筛选 对于那些在后台内容模型中自定义的字段,如果它们被设置为可筛选,也可以通过在URL中添加查询参数的方式进行筛选,例如?color=red。这些通常可以结合archiveFilters标签在前端生成动态筛选条件。

实用小贴士

  • 模板语法