在AnQiCMS中,模板是构建网站外观和展示内容的核心。要让网站的内容呈现更加灵活和智能,熟练运用模板中的逻辑标签至关重要。这其中,if 条件判断和 for 循环输出标签是实现内容动态展示的两大利器。它们允许您根据特定条件显示或隐藏内容,以及高效地遍历并输出一系列数据,从而打造出高度定制化且响应用户需求的前端页面。
AnQiCMS的模板语法设计上借鉴了Django模板引擎,因此对于熟悉此类语法的用户来说会非常容易上手。它的基本规则是:变量使用双花括号 {{ 变量名 }} 来输出,而像条件判断和循环控制这类逻辑标签则使用单花括号和百分号 {% 标签名 %} 包裹,并且这些逻辑标签通常都需要一个对应的结束标签来闭合。
条件显示:if、elif、else 的妙用
想象一下这样的场景:您希望只在某个特定条件下才显示一段文字、一张图片或一个功能按钮,或者根据不同的情况显示不同的内容。这时,if 逻辑标签就能派上大用场了。它允许您在模板中设定条件,只有当条件为真时,被包裹的内容才会呈现在用户面前。
if 标签的基本用法非常直观:
{% if 条件 %}
<!-- 当条件为真时显示的内容 -->
{% endif %}
在实际应用中,您可能会遇到需要处理多种条件分支的情况。AnQiCMS模板提供了 elif(else if 的缩写)和 else 标签,让您能够构建更复杂的条件逻辑:
{% if 第一个条件 %}
<!-- 当第一个条件为真时显示的内容 -->
{% elif 第二个条件 %}
<!-- 当第一个条件为假,且第二个条件为真时显示的内容 -->
{% else %}
<!-- 当所有条件都为假时显示的内容 -->
{% endif %}
常用的判断场景包括:
判断变量是否存在或有值: 比如,您只有在文章有缩略图时才显示图片。
{% if archive.Thumb %} <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}" /> {% else %} <img src="/static/images/default-thumb.png" alt="默认图片" /> {% endif %}比较变量的值: 例如,根据文档的ID显示特定信息,或者判断某个状态值。
{% if archive.Id == 10 %} <p>这是ID为10的特别推荐文章!</p> {% endif %} {% if category.ParentId == 0 %} <p>这是一个顶级分类。</p> {% endif %}布尔值判断: 某些变量本身就是布尔类型(True/False),可以直接用于判断。
{% if item.IsCurrent %} <span class="active">当前选中</span> {% endif %}使用
in和not运算符: 检查某个值是否包含在一个集合(如数组、列表)中,或者判断某个条件是否不成立。{# 假设 archive.Flag 包含多个推荐属性标志,如 "h,c,f" #} {% if "h" in archive.Flag %} <span class="hot-badge">热门</span> {% endif %} {% if not archive.Thumb %} <p>此文章暂无缩略图。</p> {% endif %}
通过这些灵活的 if 逻辑组合,您可以精确控制页面上每一个元素的显示与否,极大地增强了模板的智能性和交互性。
循环输出:for 遍历的强大功能
当您需要展示一系列相似的内容,例如文章列表、产品列表、导航菜单项或图片轮播时,手动逐一编写HTML代码将是非常低效和难以维护的。这时,for 循环标签就成为了您的得力助手。它允许您遍历一个数据集合(如由 archiveList、categoryList、navList 等标签获取的数据),并对集合中的每一个元素应用相同的模板结构,从而动态生成大量内容。
for 标签的基本用法是:
{% for item in 集合变量 %}
<!-- 对每一个 item 执行的操作,item 代表集合中的当前元素 -->
{% endfor %}
遍历常见数据类型:
AnQiCMS的许多标签都会返回一个数据集合,例如:
archiveList返回文档列表。categoryList返回分类列表。navList返回导航菜单列表。pageList返回单页面列表。tagDataList返回某个标签下的文档列表。
您可以使用这些标签获取数据后,再通过 for 循环来展示它们。例如,显示最新的10篇文章标题:
{% archiveList archives with type="list" limit="10" %}
<ul>
{% for article in archives %}
<li><a href="{{ article.Link }}">{{ article.Title }}</a></li>
{% endfor %}
</ul>
{% endarchiveList %}
forloop 变量:增强循环控制
在 for 循环内部,AnQiCMS提供了一些特殊的 forloop 变量,让您能够更好地控制循环的样式或行为:
forloop.Counter: 当前循环的迭代次数(从 1 开始)。forloop.Revcounter: 当前循环的剩余迭代次数(从总数递减)。
这些变量在需要为列表项添加奇偶样式、显示序号或判断是否是第一个/最后一个元素时特别有用:
<ul>
{% for item in archives %}
<li class="{% if forloop.Counter is odd %}odd{% else %}even{% endif %}">
{{ forloop.Counter }}. <a href="{{ item.Link }}">{{ item.Title }}</a>
{% if forloop.Counter == 1 %} (最新) {% endif %}
</li>
{% endfor %}
</ul>
特殊情况处理:empty 标签
当您遍历的集合可能为空时,为了避免页面空白,可以使用 empty 标签来提供一个备选内容:
{% for item in archives %}
<li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
{% empty %}
<li>目前还没有任何文章发布。</li>
{% endfor %}
循环控制:reversed 与 sorted
AnQiCMS的 for 标签还支持 reversed 和 sorted 关键字,用于改变遍历的顺序:
{% for item in archives reversed %}: 反向遍历集合。{% for item in archives sorted %}: 对集合进行排序后遍历(适用于数字或可比较的字符串)。
cycle 标签:轮流显示样式或内容
cycle 标签允许您在每次循环迭代时,按顺序输出预定义的多个值。这在需要为列表项应用交替的CSS类,或者轮流显示不同的图标时非常方便:
<ul>
{% for item in archives %}
<li class="{% cycle 'row-a' 'row-b' %}">
<a href="{{ item.Link }}">{{ item.Title }}</a>
</li>
{% endfor %}
</ul>
这里,列表项的 class 会在 row-a 和 row-b 之间交替。
进阶技巧与注意事项
结合使用 if 和 for: 掌握了 if