在 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" %}:我们首先获取文章模型下所有parentId为0(即顶级分类)的分类,并将其赋值给categories变量。{% for category in categories %}:外层循环遍历每个顶级分类。categoryId=category.Id:这是关键一步!在内层的archiveList标签中,我们将外层循环中获取到的category.Id动态地作为categoryId参数传入,确保每个分类下只显示其自身的文章。articles_in_category:为内层循环中的文章列表指定一个独立的变量名,以避免与外层或其他部分的变量冲突。
通过这种嵌套结构,您就能轻松实现更加动态和丰富的文章展示布局。
实用技巧与注意事项
- 模板文件位置:AnQiCMS 的模板文件统一存放在
/template目录下,每个模板集都有自己的独立文件夹。您编写的代码通常会放在这些模板文件内。 - 变量名大小写:请注意,AnQiCMS 模板中的变量名是区分大小写的,例如
item.Title和item.title会被视为不同的变量。 moduleId的选择:根据您网站的实际内容结构,正确选择moduleId至关重要。文章