在 AnQiCMS 的模板开发中,我们常常需要展示一系列内容,例如文章列表、产品列表或导航菜单。但很多时候,我们并不希望将所有数据都一股脑地显示出来,而是希望能根据某些特定条件,巧妙地跳过其中一部分,让最终展示的内容更加精准和符合用户需求。AnQiCMS 采用类似 Django 模板引擎的语法,这为我们实现这种条件性跳过提供了强大而灵活的工具。
要实现在 for 循环中根据特定条件跳过某些项的显示,最核心的工具就是 if 逻辑判断标签。通过将需要有条件显示的 HTML 片段包裹在 if 标签中,我们可以轻松地控制每一项内容的可见性。
核心机制:if 逻辑判断标签
想象一下,你正在遍历一个文章列表,并希望只显示那些不被标记为“推荐”的文章。这时,你就可以利用 {% if ... %} 结构。AnQiCMS 的 archiveList 标签获取的每篇文章(或其他模型内容)通常会有一个 Flag 字段,用于标记其推荐属性,例如 c 代表推荐。如果某个 item(循环中的当前项)的 Flag 字段不等于 c,我们才让它显示:
{% archiveList archives with type="list" limit="10" showFlag=true %}
{% for item in archives %}
{% if item.Flag != "c" %}
<li class="article-item">
<a href="{{ item.Link }}">
<h3>{{ item.Title }}</h3>
<p>{{ item.Description }}</p>
</a>
</li>
{% endif %}
{% endfor %}
{% endarchiveList %}
在上面的例子中,{% if item.Flag != "c" %} 这行代码起到了关键作用。它检查当前 item 的 Flag 是否不等于 "c"。如果条件为真,那么 <li> 标签及其内部的内容就会被渲染;如果条件为假(即 Flag 等于 "c"),则整个 <li> 及其内容都会被跳过,不会出现在最终的页面上。
除了 !=(不等于),你还可以使用其他比较操作符:
==(等于)>(大于)<(小于)>=(大于等于)<=(小于等于)and(逻辑与)or(逻辑或)not(逻辑非)in(包含)
这些操作符可以让你构建出非常复杂的条件。
结合内容属性与自定义字段
AnQiCMS 的灵活性在于其强大的内容模型和自定义字段功能。这意味着你可以根据文章、产品或单页面的任何内置属性或自定义字段来设置跳过条件。
例如,如果你希望跳过那些没有设置缩略图的文章,可以这样做:
{% archiveList archives with type="list" limit="10" %}
{% for item in archives %}
{% if item.Thumb %} {# 如果 item.Thumb 存在且不为空,则为 True #}
<li class="article-with-thumb">
<a href="{{ item.Link }}">
<img src="{{ item.Thumb }}" alt="{{ item.Title }}">
<h3>{{ item.Title }}</h3>
</a>
</li>
{% endif %}
{% endfor %}
{% endarchiveList %}
这里,{% if item.Thumb %} 会检查 item.Thumb 字段是否有值。如果有,就显示该项;如果没有,就跳过。反之,如果你想只显示那些没有缩略图的文章,你可以使用 {% if not item.Thumb %}。
对于自定义字段,假设你在文章模型中添加了一个名为 EditorRecommend 的布尔类型字段,用于标记编辑特别推荐的文章。那么,你可以这样显示所有非编辑推荐的文章:
{% archiveList archives with type="list" moduleId="1" limit="10" %}
{% for item in archives %}
{% if not item.EditorRecommend %} {# 假设 EditorRecommend 是一个布尔值 #}
<li class="normal-article">
<h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
<p>{{ item.Description }}</p>
</li>
{% endif %}
{% endfor %}
{% endarchiveList %}
更灵活的筛选:利用过滤器
AnQiCMS 模板引擎还支持多种过滤器,这些过滤器可以在条件判断中提供更高级的逻辑。例如,contain 过滤器可以判断一个字符串是否包含某个子字符串,这在需要根据关键词进行跳过时非常有用。
假设你有一个单页面列表,但你不想在主导航中显示任何标题包含“隐私政策”的页面:
{% pageList pages %}
{% for item in pages %}
{% if not item.Title|contain:"隐私政策" %}
<li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
{% endif %}
{% endfor %}
{% endpageList %}
这里,item.Title|contain:"隐私政策" 会检查当前页面的标题是否包含“隐私政策”这个关键词。如果包含,not 操作符会使其变为 false,从而跳过该项。
另一个例子是使用 length 过滤器来判断内容的长度。比如,你只想显示那些简介(Description)超过 50 个字符的文章:
{% archiveList archives with type="list" limit="10" %}
{% for item in archives %}
{% if item.Description|length > 50 %}
<li class="detailed-description-article">
<h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
<p>{{ item.Description }}</p>
</li>
{% endif %}
{% endfor %}
{% endarchiveList %}
实践案例:常见的跳过场景
让我们再看几个常见的应用场景:
隐藏特定 ID 的导航项: 如果你有一个导航菜单,其中某个 ID 为
5的导航项是临时的或不希望在当前模板中显示:{% navList navs %} {% for item in navs %} {% if item.Id != 5 %} <li><a href="{{ item.Link }}">{{ item.Title }}</a></li> {% endif %} {% endfor %} {% endnavList %}跳过没有子分类的父分类: 在显示分类列表时,有时我们只希望显示那些包含子分类的分类项,或者反过来,只显示叶子分类: “`twig {% categoryList categories with moduleId=“1” parentId=“0” %}
{% for item in categories %} {% if item.HasChildren %} {# 只显示有子分类的项 #} <li><a href="{{ item.Link }}">{{ item.