在 AnQiCMS 的模板中,灵活地引用变量并运用条件判断来控制内容的呈现,是构建动态且功能丰富的网站的关键。AnQiCMS 采用了类似 Django 的模板引擎语法,这使得模板开发既直观又强大。本文将深入探讨如何在 AnQiCMS 模板中有效地管理变量和逻辑,帮助你更好地驾驭内容呈现。
一、AnQiCMS 模板基础:变量的引用与显示
在 AnQiCMS 模板中,数据的流动通过变量来承载。理解如何正确地引用和显示这些变量是模板开发的第一步。
1. 模板引擎语法速览
AnQiCMS 模板遵循特定的语法规则:
- 变量引用:使用双花括号
{{ 变量名 }}来输出变量的值。 - 逻辑控制:使用单花括号和百分号
{% 标签名 %}来处理条件判断、循环、函数调用等逻辑操作。这些逻辑标签通常需要成对出现,例如{% if 条件 %}...{% endif %}。
2. 变量命名与访问
AnQiCMS 中的变量通常采用驼峰命名法(CamelCase),即每个单词的首字母大写。当你需要访问一个对象的属性时,使用点号 . 进行连接。
引用简单变量: 如果你在后台“全局功能设置”中配置了网站名称,并将其命名为
SiteName,在模板中你可以这样引用它:<h1>欢迎来到 {{ SiteName }}!</h1>或者使用系统标签显式调用并赋值给一个自定义变量名:
{% system siteNameVar with name="SiteName" %} <h1>欢迎来到 {{ siteNameVar }}!</h1>引用对象属性: 在遍历文档列表时,每个文档都是一个对象,你可以通过
item.Title、item.Link等方式访问其属性。例如,在一个文章列表中显示文章标题和链接:{% archiveList archives with type="list" limit="5" %} {% for item in archives %} <p><a href="{{ item.Link }}">{{ item.Title }}</a></p> {% endfor %} {% endarchiveList %}使用过滤器处理变量: AnQiCMS 提供了丰富的过滤器来对变量进行格式化或转换。过滤器通过竖线
|连接在变量名之后,可以串联使用。 例如,如果你的文章内容item.Content包含 HTML 标签,为了安全地显示这些内容而不被浏览器直接解析为恶意脚本,可以使用safe过滤器:<div>{{ item.Content|safe }}</div>再比如,格式化时间戳
item.CreatedTime为可读日期:<p>发布日期:{{ stampToDate(item.CreatedTime, "2006-01-02") }}</p>对于字符串截断,你可以使用
truncatechars:<p>简介:{{ item.Description|truncatechars:50 }}</p>
3. 自定义变量
有时你需要在模板中临时创建或赋值一个变量,AnQiCMS 提供了 with 和 set 标签来实现这一点。
{% with %}标签:用于在某个作用域内定义一个或多个变量,通常与include标签配合使用,将变量传递给被包含的模板片段。{% with greeting="你好" name="世界" %} <p>{{ greeting }}, {{ name }}!</p> {% endwith %}{% set %}标签:用于在当前模板作用域内声明一个变量,它的作用范围直到模板结束或被新的set标签覆盖。{% set articleCount = 0 %} {% archiveList archives with type="list" limit="10" %} {% for item in archives %} {% set articleCount = forloop.Counter %} <p>{{ articleCount }}. {{ item.Title }}</p> {% endfor %} {% endarchiveList %} <p>共有 {{ articleCount }} 篇文章。</p>
二、灵活控制内容呈现:条件判断(If 语句)
条件判断是模板逻辑的核心,它允许你根据不同的条件显示或隐藏特定的内容块。AnQiCMS 的 if 语句语法直观且功能完善。
1. {% if %} / {% elif %} / {% else %} 结构
最常见的条件判断结构包括 if (如果), elif (否则如果), else (否则) 和 endif (结束如果)。
{% if 用户已登录 %}
<p>欢迎回来,{{ 用户名 }}!</p>
{% elif 用户正在注册 %}
<p>欢迎注册新账号!</p>
{% else %}
<p>请登录或注册。</p>
{% endif %}
2. 常用条件判断
- 相等与不相等:使用
==(等于) 和!=(不等于)。{% if category.Id == 1 %} <p>这是新闻分类的特别内容。</p> {% endif %} - 大小比较:使用
>,<,>=,<=。{% if archive.Views > 1000 %} <span class="hot-badge">热门</span> {% endif %} - 逻辑运算:使用
and(且),or(或),not(非)。{% if user.IsVIP and user.ExpireTime > currentTime %} <p>您是尊贵的 VIP 会员。</p> {% elif not user.IsVIP %} <p>成为 VIP 享受更多特权。</p> {% endif %} - 判断变量存在或非空:直接使用变量名作为条件,当变量为
nil、空字符串、零值等时会被判断为false。{% if archive.Thumb %} <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}"> {% else %} <img src="/static/images/default_thumb.jpg" alt="默认缩略图"> {% endif %}
3. 实际场景应用
条件判断广泛应用于各种场景,例如:
- 根据用户角色显示不同导航菜单。
- 根据文章是否有缩略图显示图片或占位符。
- 在列表页根据文章的
Flag属性(如“推荐”、“头条”)添加特殊样式或标签。 - 在多站点管理中,根据
siteId加载不同的内容或布局。
三、遍历数据集合:循环(For 语句)
循环是处理数据列表的强大工具,无论是文章列表、分类列表还是导航菜单,for 语句都能帮助你高效地渲染。
1. {% for %} / {% endfor %} 结构
for 循环用于遍历数组、切片(slice)或其他可迭代对象中的每个元素。
{% categoryList categories with moduleId="1" parentId="0" %}
<ul>
{% for category in categories %}
<li><a href="{{ category.Link }}">{{ category.Title }}</a></li>
{% endfor %}
</ul>
{% endcategoryList %}
2. forloop 对象与辅助功能
在 for 循环内部,你可以访问一个特殊的 forloop 对象,它提供了当前循环状态的信息。
forloop.Counter:当前循环的迭代次数(从 1 开始)。forloop.Revcounter:当前循环剩余的迭代次数(倒序计数)。{% archiveList archives with type="list" limit="3" %} {% for item in archives %} <p>{{ forloop.Counter }}. {{ item.Title }} (还剩 {{ forloop.Revcounter }} 篇)</p> {% endfor %} {% endarchiveList %}