在 AnQiCMS 中构建网站时,我们经常需要让页面内容更加灵活,以满足不同版块的展示需求。其中一个非常普遍的需求,就是如何在模板中精确地显示某个特定分类下的所有文章列表。AnQiCMS 凭借其基于 Go 语言的高效架构和类似 Django 的模板引擎语法,让这项任务变得既直观又强大。

模板文件在 AnQiCMS 中通常以 .html 为后缀,存放在 /template 目录下。您会发现,变量通常使用双花括号 {{变量}} 来引用,而像条件判断、循环控制这样的逻辑标签则使用单花括号和百分号 {% 标签 %} 定义,并且需要有相应的结束标签。熟悉这些基本约定,将帮助您更流畅地理解和编写模板代码。

核心工具:archiveList 标签

要在 AnQiCMS 模板中显示特定分类下的文章列表,我们主要会用到一个功能强大的标签——archiveList。这个标签专门用于获取各类文档列表,无论是常规列表、相关文档,还是需要分页显示的内容。

1. 显示单个已知分类下的文章列表

如果您明确知道某个分类的 ID(例如,通过后台查看分类管理时,每个分类都有一个唯一的 ID),那么直接调用该分类下的文章列表会非常简单。

使用 archiveList 标签时,您可以指定 categoryId 参数来筛选文章。此外,考虑到 AnQiCMS 支持灵活的内容模型(如文章模型、产品模型等),您还需要通过 moduleId 参数来指定您想获取的是哪个模型下的文章。通常,文章模型对应的 moduleId 默认为 1,产品模型为 2

例如,要显示 ID 为 1 的文章分类下的所有文章:

{% archiveList articles with categoryId="1" moduleId="1" limit="10" %}
    <ul>
    {% for item in articles %}
        <li>
            <a href="{{item.Link}}">{{item.Title}}</a>
            <p>{{item.Description}}</p>
            <small>发布时间:{{stampToDate(item.CreatedTime, "2006-01-02")}} | 浏览量:{{item.Views}}</small>
        </li>
    {% empty %}
        <li>这个分类下暂时没有文章。</li>
    {% endfor %}
    </ul>
{% endarchiveList %}

在上面的代码中:

  • archiveList articles:我们将获取到的文章列表赋值给一个名为 articles 的变量。
  • categoryId="1":明确指定要获取分类 ID 为 1 的文章。
  • moduleId="1":指定获取文章模型下的内容。
  • limit="10":限制只显示最新的 10 篇文章。如果您想显示所有文章,可以省略此参数或设置一个足够大的数字。
  • {% for item in articles %}:这是一个循环标签,用于遍历 articles 变量中的每一篇文章。在循环体内,item 代表当前遍历到的文章对象。
  • {{item.Link}}{{item.Title}} 等:可以直接通过 item 对象访问文章的各项属性,例如链接、标题、描述、创建时间、浏览量等。
  • {{stampToDate(item.CreatedTime, "2006-01-02")}}:这是一个格式化时间戳的标签,可以将文章的创建时间戳转换为易读的日期格式。
  • {% empty %}:这是一个非常实用的功能,当 articles 列表为空时,empty 块内的内容会被显示出来,避免页面空白。

2. 结合分页功能显示文章列表

如果一个分类下的文章数量很多,我们通常需要进行分页显示。这时,只需要将 archiveList 标签的 type 参数设置为 "page",并结合 pagination 标签即可:

{% archiveList articles with categoryId="1" moduleId="1" type="page" limit="10" %}
    <ul>
    {% for item in articles %}
        <li>
            <a href="{{item.Link}}">{{item.Title}}</a>
            <p>{{item.Description}}</p>
            <small>发布时间:{{stampToDate(item.CreatedTime, "2006-01-02")}} | 浏览量:{{item.Views}}</small>
        </li>
    {% empty %}
        <li>这个分类下暂时没有文章。</li>
    {% endfor %}
    </ul>

    <div class="pagination-wrapper">
    {% pagination pages with show="5" %}
        {% if pages.PrevPage %}<a href="{{pages.PrevPage.Link}}">上一页</a>{% endif %}
        {% for p in pages.Pages %}
            <a class="{% if p.IsCurrent %}active{% endif %}" href="{{p.Link}}">{{p.Name}}</a>
        {% endfor %}
        {% if pages.NextPage %}<a href="{{pages.NextPage.Link}}">下一页</a>{% endif %}
    {% endpagination %}
    </div>
{% endarchiveList %}

这里,type="page" 告诉系统要准备分页数据,pagination pages with show="5" 则会生成分页链接,pages 变量包含了所有分页信息,您可以灵活展示首页、上一页、下一页以及中间的页码链接。

动态展示:遍历分类并显示其文章

在某些场景下,您可能希望在首页或其他聚合页面上,遍历显示多个分类,并在每个分类下展示对应的文章列表。这时,您需要结合 categoryList 标签来首先获取分类列表,然后在其内部嵌套 archiveList

假设我们希望显示文章模型下所有顶级分类,并在每个分类下显示 5 篇文章:

{% categoryList categories with moduleId="1" parentId="0" %}
    {% for category in categories %}
        <section class="category-block">
            <h3><a href="{{ category.Link }}">{{ category.Title }}</a></h3>
            <ul>
            {% archiveList articles_in_category with categoryId=category.Id moduleId="1" limit="5" %}
                {% for item in articles_in_category %}
                    <li>
                        <a href="{{item.Link}}">{{item.Title}}</a>
                        <small>({{stampToDate(item.CreatedTime, "2006-01-02")}})</small>
                    </li>
                {% empty %}
                    <li>暂无文章。</li>
                {% endfor %}
            {% endarchiveList %}
            </ul>
        </section>
    {% endfor %}
{% endcategoryList %}

在这段代码中:

  • {% categoryList categories with moduleId="1" parentId="0" %}:我们首先获取文章模型下所有 parentId0(即顶级分类)的分类,并将其赋值给 categories 变量。
  • {% for category in categories %}:外层循环遍历每个顶级分类。
  • categoryId=category.Id:这是关键一步!在内层的 archiveList 标签中,我们将外层循环中获取到的 category.Id 动态地作为 categoryId 参数传入,确保每个分类下只显示其自身的文章。
  • articles_in_category:为内层循环中的文章列表指定一个独立的变量名,以避免与外层或其他部分的变量冲突。

通过这种嵌套结构,您就能轻松实现更加动态和丰富的文章展示布局。

实用技巧与注意事项

  • 模板文件位置:AnQiCMS 的模板文件统一存放在 /template 目录下,每个模板集都有自己的独立文件夹。您编写的代码通常会放在这些模板文件内。
  • 变量名大小写:请注意,AnQiCMS 模板中的变量名是区分大小写的,例如 item.Titleitem.title 会被视为不同的变量。
  • moduleId 的选择:根据您网站的实际内容结构,正确选择 moduleId 至关重要。文章