在安企CMS的模板设计中,根据不同的条件显示或隐藏内容块,是实现动态网站效果和提升用户体验的关键能力。利用系统内置的模板语法和丰富的标签功能,我们可以轻松地构建出灵活多变、响应不同情境的页面。
安企CMS的模板引擎采用了类似Django语法的标记方式,这使得条件判断和循环控制非常直观且易于上手。它允许我们在模板中直接获取各种数据,并通过逻辑判断来决定哪些内容应该被呈现给访问者。
一、核心机制:条件判断标签(if/elif/else)
在安企CMS的模板中,实现条件判断的核心是if标签。它的基本语法与其他常见的模板引擎类似,通过{% if 条件 %}、{% elif 其他条件 %}和{% else %}来构建逻辑分支,并以{% endif %}结束。
基本语法结构:
{% if 条件 %}
<!-- 当条件为真时显示的内容 -->
{% endif %}
{% if 条件1 %}
<!-- 当条件1为真时显示的内容 -->
{% elif 条件2 %}
<!-- 当条件1为假,条件2为真时显示的内容 -->
{% else %}
<!-- 当所有条件都为假时显示的内容 -->
{% endif %}
在这里,“条件”可以是多种形式:
- 比较运算: 例如,判断一个数值是否等于、不等于、大于、小于或介于某个范围。
archive.Id == 10(文档ID是否等于10)item.Views > 1000(文章浏览量是否大于1000)item.Price < 50(产品价格是否小于50)
- 布尔值判断: 检查变量本身是否为
true或false。item.HasChildren(是否有子分类,如果为true则执行)system.SiteCloseStatus(网站是否处于关闭状态)
- 逻辑组合: 使用
and(且)、or(或)、not(非)来组合多个条件。item.IsCurrent and item.HasChildren(既是当前项又有子分类)not item.Thumb(没有缩略图)
- 空值或非空判断: 判断一个变量是否存在内容。
{% if item.Title %}(标题不为空则显示)
二、数据来源:如何获取可用于判断的变量?
要进行条件判断,我们首先需要获取可供判断的数据。安企CMS提供了丰富的标签来获取网站的各项信息,并将这些信息作为变量在模板中直接使用。
系统全局设置(
system标签) 通过{% system with name="字段名称" %}可以获取网站的全局配置,例如网站的名称、Logo、备案号,甚至自定义的系统参数。- 示例:
{% system with name="SiteCloseStatus" %}可以获取网站的关闭状态(通常是一个布尔值或字符串),进而判断是否显示闭站提示。
- 示例:
分类、文档、单页详情(
categoryDetail,archiveDetail,pageDetail标签) 在分类列表页、文档详情页、单页等特定页面,系统会将当前页面的主要信息自动加载到上下文中,可以直接通过archive.Title、category.Description等方式访问。如果需要获取其他指定ID的详情,或者获取详细的字段信息,则可以使用categoryDetail、archiveDetail、pageDetail标签。- 示例: 在文章详情页,可以直接使用
{{archive.Title}}获取标题。如果想判断当前文章是否有缩略图,可以使用{% if archive.Thumb %}。
- 示例: 在文章详情页,可以直接使用
列表数据(
archiveList,categoryList,navList等标签结合for循环) 当我们使用archiveList、categoryList、navList等标签遍历列表时,在{% for item in items %}循环内部,item变量就包含了当前循环项的所有数据。这些数据是进行条件判断最常用的来源。- 示例: 循环分类列表时,
item.HasChildren可以判断该分类是否有子分类;item.IsCurrent可以判断是否为当前激活的分类,从而添加不同的样式。
- 示例: 循环分类列表时,
自定义字段 安企CMS支持为内容模型、分类等添加自定义字段。这些自定义字段的数据也可以直接用于模板中的条件判断。
- 示例: 如果你为文章模型添加了一个名为
VIPAccess的自定义字段,在文章详情页可以通过{% if archive.VIPAccess == 'true' %}来判断是否仅供VIP用户访问。
- 示例: 如果你为文章模型添加了一个名为
三、实用场景与示例
结合条件判断标签和数据来源,我们可以实现各种灵活的内容展示。
1. 根据网站状态显示不同内容
假设您的网站因维护需要暂时关闭,您可以在模板中判断SiteCloseStatus变量,以显示维护提示信息而不是正常内容。
{% system siteStatus with name="SiteCloseStatus" %}
{% if siteStatus == "true" %} {# 假设后台设置为字符串"true"或"false" #}
<div class="maintenance-message">
<h1>网站维护中</h1>
<p>抱歉,网站正在进行系统升级,请稍后访问。给您带来的不便敬请谅解!</p>
{% system closeTips with name="SiteCloseTips" %}
{% if closeTips %}<p>{{ closeTips }}</p>{% endif %}
</div>
{% else %}
<!-- 正常网站内容 -->
{% include "partial/header.html" %}
<main>
<!-- 页面主体内容 -->
</main>
{% include "partial/footer.html" %}
{% endif %}
2. 在导航菜单中高亮当前活跃项和显示子菜单 在构建导航菜单时,经常需要根据用户当前访问的页面来高亮显示对应的导航项,并判断是否有子菜单来动态展开。
<nav>
<ul class="main-menu">
{% navList navs %}
{% for item in navs %}
<li class="menu-item {% if item.IsCurrent %}active{% endif %}">
<a href="{{ item.Link }}">{{ item.Title }}</a>
{% if item.NavList %} {# 判断是否有下级导航 #}
<ul class="sub-menu">
{% for subItem in item.NavList %}
<li class="sub-menu-item {% if subItem.IsCurrent %}active{% endif %}">
<a href="{{ subItem.Link }}">{{ subItem.Title }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
{% endnavList %}
</ul>
</nav>
3. 列表循环中特殊处理首条、尾条或有图片的项 在文章列表或产品列表中,可能需要为第一篇文章、最后一篇文章或带有缩略图的文章添加特别