在安企CMS中管理和展示内容是其核心优势之一。当我们需要在网站前端呈现动态的列表数据时,例如最新的文章、热门产品、分类下的内容集合,了解如何在模板中高效地遍历这些数据并逐一显示,是网站运营者和模板开发者不可或缺的技能。
安企CMS的模板系统采用了类似Django的语法,这种语法直观且功能强大,让技术信息的转化和实际应用变得异常便捷。
核心循环语法:{% for %} 标签
在安企CMS的模板中,遍历列表数据最主要的工具就是{% for ... in ... %}循环标签。它的基本结构非常清晰:
{% for item in list_data %}
{# 在这里放置你想要为每个列表项显示的内容 #}
{{ item.Field1 }}
{{ item.Field2 }}
{# ...更多字段... #}
{% endfor %}
这里,list_data代表了你要遍历的列表数据源,而item则是在每次循环中,当前列表项的一个临时变量。你可以为item起任何你喜欢的名字,比如article、product、category等,以提高代码的可读性。
这个循环标签必须以{% endfor %}来结束,表示循环块的结束。
数据来源:从后台到模板的桥梁
安企CMS提供了多种标签来获取不同类型的数据列表,它们是{% for %}循环的数据来源:
文档列表 (
archiveList): 这是最常用的一种,用于获取文章、产品等文档数据。例如,要显示最新的10篇文章,你可以这样获取数据:{% archiveList archives with type="list" limit="10" order="id desc" %} {# 在这里遍历 'archives' 变量 #} {% endarchiveList %}这里的
archives就是我们在for循环中可以使用的list_data。archiveList标签提供了丰富的参数来筛选和排序数据,例如:moduleId:指定内容模型ID(例如,文章模型ID为1,产品模型ID为2)。categoryId:根据分类ID筛选内容。limit:控制显示的数量,也可以用"offset,limit"的形式来跳过前面的数据。type:指定列表类型,"list"用于普通列表,"page"用于分页列表(需配合pagination标签)。order:指定排序方式,如"id desc"(按ID降序,即最新发布)。
分类列表 (
categoryList): 如果你需要展示网站的分类结构,比如导航菜单或分类页面侧边栏,categoryList标签就非常有用:{% categoryList categories with moduleId="1" parentId="0" %} {# 在这里遍历 'categories' 变量 #} {% endcategoryList %}moduleId用于指定分类所属的内容模型,parentId="0"通常用于获取顶级分类。
除了以上两种,安企CMS还提供了pageList(单页列表)、tagList(标签列表)、linkList(友情链接)、navList(导航列表)等标签,它们同样遵循{% SomeList list_var %} ... {% endSomeList %}的结构,让你能够轻松获取各类数据。
获取并展示列表项的详细信息
一旦你通过{% for item in list_data %}进入循环,item变量就代表了当前正在处理的列表项。你可以通过.操作符来访问item的各种属性(字段)。这些字段通常与你在后台管理内容时填写的字段相对应,例如:
{{ item.Title }}:显示当前项的标题。{{ item.Link }}:显示当前项的链接。{{ item.Description }}:显示当前项的简介。{{ item.Thumb }}或{{ item.Logo }}:显示当前项的缩略图或封面图。{{ item.Views }}:显示当前项的浏览量。{{ item.CreatedTime }}:显示当前项的创建时间。
值得注意的是,对于CreatedTime这类时间戳字段,安企CMS提供了stampToDate过滤器,可以将其格式化成更易读的日期和时间。例如,要将时间戳格式化为“年-月-日”的格式,你可以这样写:
{{ stampToDate(item.CreatedTime, "2006-01-02") }}
如果列表项的某个字段可能包含HTML内容(比如文章详情中的部分HTML),为了确保这些HTML被正确解析而不是作为纯文本显示,你需要使用|safe过滤器:
{{ item.Content|safe }}
处理空数据:{% empty %} 的优雅之道
设想一下,如果你的列表数据源因为某些条件没有内容,但你又不希望页面上留下一片空白。这时,{% for %}标签的{% empty %}子句就能派上用场。它允许你在列表为空时,显示一段友好的提示信息:
{% for item in archives %}
{# 列表有数据时显示的内容 #}
{% empty %}
<p>抱歉,目前没有相关内容可供显示。</p>
{% endfor %}
实践案例:构建一个内容列表
下面,让我们通过一个常见的文章列表示例,看看如何将这些概念组合起来:
<div class="article-list">
{% archiveList latestArticles with type="list" moduleId="1" limit="5" order="id desc" %}
{% for article in latestArticles %}
<div class="article-item">
<a href="{{ article.Link }}" title="{{ article.Title }}">
{% if article.Thumb %} {# 判断是否有缩略图 #}
<img src="{{ article.Thumb }}" alt="{{ article.Title }}" class="article-thumb">
{% endif %}
<h3>{{ article.Title|truncatechars:30 }}</h3> {# 截取标题到30个字符 #}
</a>
<p class="article-description">
{{ article.Description|truncatewords:50 }} {# 截取简介到50个单词 #}
</p>
<div class="article-meta">
<span>发布于: {{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
<span>阅读量: {{ article.Views }}</span>
{% comment %} 假设Category是另一个需要获取详情的标签 {% endcomment %}
<span>分类: <a href="{% categoryDetail with name='Link' id=article.CategoryId %}">{% categoryDetail with name='Title' id=article.CategoryId %}</a></span>
</div>
</div>
{% empty %}
<p>目前还没有任何文章发布。</p>
{% endfor %}
{% endarchiveList %}
</div>
在这个例子中,我们展示了:
- 如何