在构建网站页面时,我们常常需要展示各种列表数据,比如最新的文章、产品分类、导航菜单或是评论详情。安企CMS(AnQiCMS)的模板系统为我们提供了强大而灵活的循环遍历功能,让动态列表的展示变得非常简单。
安企CMS的模板语法借鉴了Django模板引擎,因此,熟悉这类语法的用户会感到非常亲切。它使用 for 循环标签来遍历数据集合,并将集合中的每个项目逐一展示出来。
安企CMS模板中的循环遍历基础
核心的循环遍历语法非常直观:
{% for item in collection %}
{# 在这里放置你的 HTML 代码和变量,用于显示每个 item 的数据 #}
<p>{{ item.Title }}</p>
{% endfor %}
在这里,collection 代表的是你想要遍历的数据集合,例如通过 archiveList 标签获取的文章列表,或者通过 categoryList 标签获取的分类列表。而 item 则是循环中当前正在处理的单个数据对象,你可以通过 item.属性名 的方式来访问这个数据对象的各项信息,比如标题(Title)、链接(Link)、ID(Id)等。
例如,如果我们想要展示一个简单的文章标题列表,可以这样操作:
{% archiveList archives with type="list" limit="5" %}
<ul class="article-list">
{% for article in archives %}
<li>
<a href="{{ article.Link }}">{{ article.Title }}</a>
</li>
{% endfor %}
</ul>
{% endarchiveList %}
这段代码首先使用 archiveList 标签从后台获取了最新的5篇文章数据,并将这些数据赋值给了 archives 变量。接着,for article in archives 循环会逐一处理 archives 中的每篇文章,在每次循环中,当前文章的数据就被赋给了 article 变量,我们便可以利用 article.Link 和 article.Title 来构建文章的链接和标题。
深入探索:循环中的实用技巧
除了基本的循环,安企CMS的 for 循环还提供了一些实用的辅助功能,让列表展示更加灵活。
1. 处理空数据:{% empty %}
如果某个数据集合在循环时为空,你可能希望显示一条提示信息,而不是空白页面。empty 标签就能派上用场:
{% for item in archives %}
<p>{{ item.Title }}</p>
{% empty %}
<p>抱歉,目前还没有任何内容。</p>
{% endfor %}
当 archives 列表没有数据时,{% empty %} 标签内的内容就会被显示出来。
2. 获取循环信息:forloop对象
在 for 循环内部,你可以访问一个特殊的 forloop 对象,它提供了关于当前循环状态的有用信息。最常用的是:
forloop.Counter: 当前循环的迭代次数,从1开始计数。forloop.Revcounter: 当前循环剩余的迭代次数,从总数倒数计数。
这在需要对列表中的特定项(如第一个或最后一个)进行特殊处理时非常方便。例如,给列表的第一个项目添加一个 active 类:
{% for item in archives %}
<li {% if forloop.Counter == 1 %}class="active"{% endif %}>
<a href="{{ item.Link }}">{{ item.Title }}</a>
</li>
{% endfor %}
3. 排序与反转:reversed和sorted
你可以在 for 循环中直接使用 reversed 或 sorted 关键字来改变遍历的顺序:
{% for item in archives reversed %}:将archives列表反向遍历。{% for item in archives sorted %}:尝试对archives列表进行排序(这通常要求列表中的元素是可比较的,例如数字或字符串)。
需要注意的是,更复杂的排序逻辑(例如按发布时间倒序、按浏览量排序等),通常是在获取数据的列表标签(如 archiveList)中使用 order 参数来实现,例如 order="views desc"。
4. 结合不同的列表标签获取数据
安企CMS提供了多种列表标签来获取不同类型的数据集合,这些集合都可以通过 for 循环进行遍历:
archiveList:获取文章、产品等文档列表。categoryList:获取分类列表。navList:获取网站导航菜单。pageList:获取单页面列表。tagList:获取标签列表。commentList:获取评论列表。linkList:获取友情链接列表。bannerList:获取首页Banner列表。
这些标签都接受不同的参数来精确控制获取哪些数据,并将数据集合赋值给一个变量名,供 for 循环使用。
实际应用场景与代码示例
让我们通过几个具体的例子来展示 for 循环在安企CMS模板中的应用。
1. 展示带有缩略图和发布时间的文章列表
{% archiveList articles with type="page" limit="10" order="id desc" %}
<div class="article-grid">
{% for item in articles %}
<article class="article-card">
{% if item.Thumb %}
<a href="{{ item.Link }}" class="article-thumb">
<img src="{{ item.Thumb }}" alt="{{ item.Title }}">
</a>
{% endif %}
<div class="article-info">
<h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
<p class="article-desc">{{ item.Description|truncatechars:100 }}</p>
<div class="article-meta">
<span>发布日期:{{ stampToDate(item.CreatedTime, "2006年01月02日") }}</span>
<span>浏览量:{{ item.Views }}</span>
</div>
</div>
</article>
{% empty %}
<p>抱歉,目前没有找到任何文章。</p>
{% endfor %}
</div>
{% endarchiveList %}
这个例子中,我们使用 archiveList 获取文档,并设置了 type="page"(用于分页),limit="10"(每页10条),order="id desc"(按ID倒序,即最新发布)。在循环内部,我们展示了文章标题、链接、缩略图、简介,并通过 stampToDate 格式化了发布时间。truncatechars:100 过滤器则用于截取简介,避免过长。
2. 嵌套展示多级分类导航
许多网站都需要多级分类导航,这可以通过嵌套 categoryList 标签和 for 循环来实现:
”`twig {% categoryList mainCategories with moduleId=“1” parentId=“0” %}
<nav class="main-nav">
<ul>
{% for mainCat in mainCategories %}