在 AnQiCMS 灵活强大的内容管理系统中,页面的动态内容展示离不开模板语法的支持。掌握条件显示和循环展示这两项核心功能,能帮助我们更高效、更精准地将数据呈现在网站前端。AnQiCMS 采用了类似 Django 的模板语法,这使得内容模板的制作既熟悉又易于上手。
模板语法基础:构建动态页面的基石
在 AnQiCMS 的模板中,我们主要通过两种标记来处理动态内容:
- 变量输出
{{ 变量 }}:用于直接在页面上显示数据,例如{{ siteName }}会输出网站名称。 - 逻辑标签
{% 标签 %}:用于控制页面的逻辑流程,如条件判断、循环迭代等。这类标签通常需要一个对应的结束标签,例如{% if 条件 %}...{% endif %}。
此外,还有 过滤器 |,用于对变量进行格式化或处理,让数据以更美观、更符合需求的方式呈现。
条件显示:根据特定条件决定内容去留
条件显示是模板设计中不可或缺的一部分,它允许我们根据数据的不同状态,灵活地展示或隐藏页面上的特定内容块。AnQiCMS 模板中的 if 标签为此提供了强大支持。
使用 if、elif、else 进行条件判断
if 标签的基本用法与多数编程语言类似,可以用来判断某个变量是否存在、是否满足特定值或范围。
例如,我们可能希望只有当文章存在缩略图时才显示图片:
{% if archive.Thumb %}
<img src="{{ archive.Thumb }}" alt="{{ archive.Title }}" />
{% else %}
<img src="/static/images/default-thumb.jpg" alt="默认图片" />
{% endif %}
这里,archive.Thumb 如果有值(非空),就会显示文章的缩略图;否则,显示一张预设的默认图片。
更复杂的场景下,我们可以结合 elif(else if 的缩写)和 else 来处理多种条件:
{% if archive.Views > 1000 %}
<p>这是一篇非常受欢迎的文章!</p>
{% elif archive.Views > 500 %}
<p>这篇文章有不错的阅读量。</p>
{% else %}
<p>欢迎阅读这篇文章。</p>
{% endif %}
除了直接比较值,if 标签还支持使用 and、or、not 等逻辑运算符来组合条件,以及 in 运算符来判断元素是否在列表中:
{% if archive.Flag and archive.CreatedTime > currentTime %}
<p>这篇文章被标记且是定时发布的。</p>
{% endif %}
{% if category.Id == 1 or category.Id == 5 %}
<p>这是一个特殊分类。</p>
{% endif %}
{% if not user.IsLoggedIn %}
<p>请先登录。</p>
{% endif %}
通过这些灵活的条件判断,我们可以为不同用户、不同内容状态提供定制化的页面体验。
循环展示:批量呈现动态数据
当我们需要展示一组数据,比如文章列表、产品列表、导航菜单时,循环展示就显得尤为重要。AnQiCMS 模板中的 for 标签是实现这一功能的利器。
使用 for 标签遍历数据集合
for 标签用于遍历数组、列表或任何可迭代的对象。每次循环,它会将当前迭代的元素赋值给一个临时变量,供我们在循环体内部使用。
例如,展示一个文章列表:
{% archiveList archives with type="list" categoryId="1" limit="10" %}
<ul>
{% for item in archives %}
<li>
<a href="{{ item.Link }}">{{ item.Title }}</a>
<span>发布日期:{{ stampToDate(item.CreatedTime, "2006-01-02") }}</span>
</li>
{% empty %}
<li>抱歉,目前没有找到相关文章。</li>
{% endfor %}
</ul>
{% endarchiveList %}
在这个例子中:
{% archiveList archives with type="list" categoryId="1" limit="10" %}是 AnQiCMS 提供的一个内容标签,它从 ID 为 1 的分类中获取最近的 10 篇文章,并将结果存储在archives变量中。{% for item in archives %}开始循环,每次循环将archives中的一个文章对象赋值给item。- 在循环体内,我们可以通过
{{ item.Link }}访问文章链接,{{ item.Title }}访问文章标题,{{ item.CreatedTime }}访问创建时间。 {% empty %}是for标签的一个补充,当archives列表为空时,empty块内的内容会被显示,这对于友好的用户提示非常有用。{% endfor %}标志着循环的结束。
for 循环中的辅助变量与高级用法
在 for 循环内部,AnQiCMS 提供了一些特殊的辅助变量,让我们的循环控制更加精细:
forloop.Counter:当前循环的迭代次数(从 1 开始)。forloop.Revcounter:当前循环剩余的迭代次数。
利用这些变量,我们可以实现一些特定的样式或逻辑:
{% categoryList categories with moduleId="1" parentId="0" %}
<nav>
{% for item in categories %}
<a href="{{ item.Link }}" {% if forloop.Counter == 1 %}class="first-item"{% endif %}>
{{ item.Title }} ({{ forloop.Revcounter }} more)
</a>
{% if item.HasChildren %}
{# 嵌套循环显示子分类 #}
<ul>
{% categoryList subCategories with parentId=item.Id %}
{% for subItem in subCategories %}
<li><a href="{{ subItem.Link }}">{{ subItem.Title }}</a></li>
{% endfor %}
{% endcategoryList %}
</ul>
{% endif %}
{% endfor %}
</nav>
{% endcategoryList %}
这里展示了如何为列表的第一个元素添加一个 first-item 类,以及如何通过嵌套 categoryList 标签和 for 循环来构建多级分类导航。
for 标签还支持 reversed 和 sorted 关键字,用于反转迭代顺序或对列表进行排序(如果列表元素可排序),这在需要不同展示顺序时非常实用。
结合实际:AnQiCMS 常用内容标签的运用
AnQiCMS 提供了丰富的内置内容标签,它们返回的数据结构大多可以直接与 if 和 for 标签结合使用。
- 文档列表 (
archiveList): 用于获取文章或产品列表。通过moduleId指定模型,categoryId指定分类,limit控制数量