在网站模板的开发和维护中,我们经常会遇到这样的需求:根据特定的数据条件来决定页面上某个HTML元素是否显示。例如,一篇文章只有在存在缩略图时才展示图片标签,或者某个自定义字段有内容时才渲染对应的区块。这种“按需显示”的机制,不仅能让模板代码更加整洁,避免页面上出现空标签或不必要的视觉元素,还能显著提升用户体验和页面加载效率。
AnQiCMS 采用的模板引擎,其语法与 Django 模板引擎类似,提供了强大且灵活的条件判断和循环控制能力,让我们能够轻松实现这些动态的显示逻辑。理解并善用这些功能,是构建高效、优雅AnQiCMS网站模板的关键。
利用条件判断标签(if)精准控制HTML显示
AnQiCMS模板中最基础也是最核心的条件控制工具是if标签。通过它,我们可以根据变量的存在、特定值或变量间的比较来决定一个HTML区块的去留。
if标签的基本语法是{% if 条件 %} ... {% endif %}。当条件为真(true)时,{% if %}和{% endif %}之间的内容会被渲染;否则,这部分内容将被忽略。
例如,在文章详情页,我们通常希望只在文章有缩略图时才显示<img>标签,避免图片缺失时出现破损的图标或空白占位符。这可以通过如下方式实现:
{% if archive.Thumb %}
<img src="{{archive.Thumb}}" alt="{{archive.Title}}" class="article-thumbnail">
{% endif %}
这里,archive.Thumb代表文章的缩略图路径。如果这个变量有值(即缩略图存在),<img>标签就会被渲染出来。
除了简单的存在性判断,if标签还支持更复杂的逻辑:
多分支判断: 使用
{% elif 条件 %}和{% else %}可以处理多种情况。例如,根据文章状态显示不同的提示:{% if archive.Status == 1 %} <span class="status-published">已发布</span> {% elif archive.Status == 0 %} <span class="status-draft">草稿</span> {% else %} <span class="status-unknown">状态未知</span> {% endif %}变量比较: 可以比较变量的值,例如判断某个ID是否为特定值:
{% if archive.Id == 10 %}。逻辑组合: 使用
and、or、not进行逻辑组合,构建更精细的判断条件。例如,只有当文章有描述且描述长度大于某个值时才显示:{% if archive.Description and archive.Description|length > 20 %} <p class="article-summary">{{archive.Description}}</p> {% endif %}这里还用到了
length过滤器,用于获取字符串的长度,这在判断内容是否足够显示时非常实用。
循环中的动态展示与空列表处理(for和empty)
当我们需要遍历列表数据(例如文章列表、分类列表)时,for循环是不可或缺的。AnQiCMS的for标签不仅支持常规的循环遍历,还提供了empty子标签,用于处理列表为空的特殊情况。
其语法结构为{% for item in 列表 %} ... {% empty %} ... {% endfor %}。
如果列表中有数据,{% for %}和{% empty %}之间的内容会被重复渲染;如果列表为空,{% empty %}和{% endfor %}之间的内容则会被渲染一次。这使得在没有数据时显示友好的提示信息成为可能,避免页面出现空白或结构混乱。
例如,在一个产品展示区域,如果当前分类下没有产品,我们可以显示一个“暂无产品”的提示:
<div class="product-list">
{% archiveList products with moduleId="2" categoryId=currentCategory.Id limit="8" %}
{% for item in products %}
<div class="product-item">
<h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
{% if item.Thumb %}
<img src="{{item.Thumb}}" alt="{{item.Title}}">
{% endif %}
</div>
{% empty %}
<p class="no-products-tip">当前分类暂无产品,敬请期待!</p>
{% endfor %}
{% endarchiveList %}
</div>
在循环内部,我们也可以继续使用if标签来根据每个列表项(item)的属性进行条件判断,例如上面示例中判断item.Thumb是否存在来显示图片。
优化模板输出:去除多余的空白行
在使用条件判断和循环标签时,模板引擎在渲染时可能会引入一些不必要的空白行,尤其是在逻辑标签与HTML标签之间。这虽然不影响页面功能,但可能使生成的HTML源代码显得不够“干净”。AnQiCMS模板引擎提供了{%-和-%}这样的特殊标记,用于在渲染时去除这些空白。
{%-:会移除标签左侧的所有空白(包括换行符)。-%}:会移除标签右侧的所有空白(包括换行符)。
例如,如果一个if语句前后有多余的空白行:
{# 原始代码,可能产生空白行 #}
<div>
{% if archive.Thumb %}
<img src="{{archive.Thumb}}">
{% endif %}
</div>
{# 优化后,减少空白行 #}
<div>
{%- if archive.Thumb %}
<img src="{{archive.Thumb}}">
{%- endif %}
</div>
通过添加-符号,可以有效控制生成的HTML中空白行的数量,使代码更加紧凑。
数据预处理与默认值策略
有时候,我们并非要完全移除HTML标签,而是希望在数据缺失时提供一个默认值,防止空变量直接输出而导致页面显示不美