如何在 AnQiCMS 模板中定义并使用临时变量,以简化复杂数据处理?

在 AnQiCMS 模板开发中,我们常常会遇到需要处理或重用复杂数据的情况。直接在模板中重复书写复杂的逻辑或数据路径不仅会让代码变得冗长、难以阅读,还会影响维护效率。这时候,巧妙地利用临时变量,就能让模板代码变得更加清晰、简洁,数据处理也更加灵活。

AnQiCMS 的模板引擎提供了强大且灵活的变量定义机制,可以帮助我们有效地管理和处理页面数据。它主要通过 {% with %}{% set %} 这两种标签来实现临时变量的定义和赋值。理解并熟练运用它们,将极大提升您的模板开发效率。

AnQiCMS 模板中的临时变量机制

在 AnQiCMS 的模板语法中,变量的定义与赋值可以看作是在特定作用域内“暂时存储”数据,以便后续使用。这两种主要方式各有侧重:

  • {% with %} 标签: 主要用于定义一个或多个在当前 with 标签块内有效的临时变量。它的一个典型应用场景是向 include 引入的子模板传递数据,或者在某个局部区域聚合需要频繁使用的数据。
  • {% set %} 标签: 用于在当前模板的任意位置定义变量并赋值。它具有更广阔的灵活性,可以在模板的任何地方声明一个变量,并且可以在后续的代码中重新赋值。这使得 {% set %} 成为处理中间计算结果、捕获过滤器处理后的数据,或者在循环中构建复杂数据结构的理想选择。

了解了这两种标签的基本区别,接下来我们通过具体的应用场景来深入探讨它们如何简化复杂数据处理。

使用 {% with %} 定义局部作用域变量

{% with %} 标签允许您在代码块的局部范围内定义变量。这意味着这些变量只在 {% with %}{% endwith %} 之间的区域内可用。

基本语法:

{% with 变量名1=值1, 变量名2=值2 %}
    {# 在这里使用定义的变量 #}
    {{ 变量名1 }}
    {{ 变量名2 }}
{% endwith %}

实际应用:

假设您有一个页眉区域,需要在其中显示网站标题和关键词。如果您不想在每个页面都重复书写 {% system with name="SiteName" %}{% tdk with name="Keywords" %},并且这个页眉是一个被 include 引入的子模板,{% with %} 就能派上用场。

{# 在父模板中,定义变量并传递给子模板 #}
{% with pageTitle="我的定制标题", pageKeywords="模板,变量,安企CMS" %}
    {% include "partial/header.html" with currentTitle=pageTitle currentKeywords=pageKeywords %}
{% endwith %}

{# partial/header.html 子模板内容 #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ currentTitle }} - {% system with name="SiteName" %}</title>
    <meta name="keywords" content="{{ currentKeywords }}">
</head>
<body>
    {# ... 页面内容 ... #}
</body>
</html>

在这个例子中,pageTitlepageKeywords 变量只在 {% with %} 块内有效,并通过 with 关键字被传递给 header.html 子模板,子模板则以 currentTitlecurrentKeywords 的名称来接收并使用这些值。这种方式避免了变量名冲突,并确保了数据的局部化管理。

使用 {% set %} 定义和重用变量

{% set %} 标签提供了更灵活的变量定义方式,其作用域通常是整个当前模板文件。这意味着一旦使用 {% set %} 定义了变量,它就可以在该标签之后的任何地方被访问和重用,甚至可以被重新赋值。

基本语法:

{% set 变量名 = 值 %}
{# 在这里使用定义的变量 #}
{{ 变量名 }}

实际应用:

{% set %} 在处理中间计算结果、格式化数据或从复杂结构中提取特定值时非常有用。

1. 捕获过滤器处理后的数据:

假设您从文档列表中获取了一篇文章的创建时间(通常是一个时间戳),并希望在多个位置以特定的格式显示它。如果每次都调用 stampToDate 过滤器进行格式化,会显得重复。使用 {% set %} 可以将格式化结果存储起来,一次处理,多次使用。

{% archiveList archives with type="list" limit="1 %}
    {% for article in archives %}
        {# 格式化创建时间并存储到变量中 #}
        {% set formattedDate = stampToDate(article.CreatedTime, "2006年01月02日") %}

        <p>文章标题: {{ article.Title }}</p>
        <p>发布日期: {{ formattedDate }}</p>
        <p>更新通知: 本文章最后一次发布于 {{ formattedDate }}。</p>
    {% endfor %}
{% endarchiveList %}

这里,formattedDate 变量只被计算了一次,但在模板中被重复使用了两次,极大地简化了代码并提高了效率。

2. 从复杂数据结构中提取特定值:

在处理 archiveList 返回的文档数组时,您可能只想获取特定条件下的第一篇文章,或者需要从一个复杂对象中快速提取某个嵌套属性。

{% archiveList articles with type="list" categoryId="10" flag="c" limit="1" %}
    {% set featuredArticle = articles[0] %} {# 获取满足条件的第一篇文章 #}

    {% if featuredArticle %}
        <div class="featured-section">
            <h3>推荐文章:<a href="{{ featuredArticle.Link }}">{{ featuredArticle.Title }}</a></h3>
            <img src="{{ featuredArticle.Thumb }}" alt="{{ featuredArticle.Title }}">
            <p>{{ featuredArticle.Description|truncatechars:100 }}</p>
        </div>
    {% endif %}
{% endarchiveList %}

通过 {% set featuredArticle = articles[0] %},我们直接将查询