在安企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)
  • 布尔值判断: 检查变量本身是否为truefalse
    • item.HasChildren (是否有子分类,如果为true则执行)
    • system.SiteCloseStatus (网站是否处于关闭状态)
  • 逻辑组合: 使用and(且)、or(或)、not(非)来组合多个条件。
    • item.IsCurrent and item.HasChildren (既是当前项又有子分类)
    • not item.Thumb (没有缩略图)
  • 空值或非空判断: 判断一个变量是否存在内容。
    • {% if item.Title %} (标题不为空则显示)

二、数据来源:如何获取可用于判断的变量?

要进行条件判断,我们首先需要获取可供判断的数据。安企CMS提供了丰富的标签来获取网站的各项信息,并将这些信息作为变量在模板中直接使用。

  1. 系统全局设置(system标签) 通过{% system with name="字段名称" %}可以获取网站的全局配置,例如网站的名称、Logo、备案号,甚至自定义的系统参数。

    • 示例: {% system with name="SiteCloseStatus" %} 可以获取网站的关闭状态(通常是一个布尔值或字符串),进而判断是否显示闭站提示。
  2. 分类、文档、单页详情(categoryDetail, archiveDetail, pageDetail标签) 在分类列表页、文档详情页、单页等特定页面,系统会将当前页面的主要信息自动加载到上下文中,可以直接通过archive.Titlecategory.Description等方式访问。如果需要获取其他指定ID的详情,或者获取详细的字段信息,则可以使用categoryDetailarchiveDetailpageDetail标签。

    • 示例: 在文章详情页,可以直接使用{{archive.Title}}获取标题。如果想判断当前文章是否有缩略图,可以使用{% if archive.Thumb %}
  3. 列表数据(archiveList, categoryList, navList等标签结合for循环) 当我们使用archiveListcategoryListnavList等标签遍历列表时,在{% for item in items %}循环内部,item变量就包含了当前循环项的所有数据。这些数据是进行条件判断最常用的来源。

    • 示例: 循环分类列表时,item.HasChildren可以判断该分类是否有子分类;item.IsCurrent可以判断是否为当前激活的分类,从而添加不同的样式。
  4. 自定义字段 安企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. 列表循环中特殊处理首条、尾条或有图片的项 在文章列表或产品列表中,可能需要为第一篇文章、最后一篇文章或带有缩略图的文章添加特别