如何在AnQiCMS模板中定义和使用变量进行内容显示?

安企CMS(AnQiCMS)凭借其基于Go语言的高效架构和灵活的模板机制,让内容呈现变得既强大又直观。在网站内容运营中,我们经常需要展示动态信息,比如文章标题、产品价格、联系方式等,这就离不开在模板中定义和使用变量。理解如何在AnQiCMS模板中灵活运用变量,是搭建和维护高效、富有个性化网站的关键。

安企CMS的模板引擎借鉴了Django的语法,它使得变量的定义和引用变得非常易于理解。基本上,任何需要动态显示的数据,无论是来自系统配置、数据库内容,还是我们临时计算的值,都可以通过变量的形式在模板中进行操作。变量通常以双花括号 {{ 变量名 }} 的形式出现,而进行逻辑判断或循环等操作时,则会用到单花括号和百分号 {% 标签名 %}

理解模板中的变量来源

在AnQiCMS模板中,变量的来源主要有三种:

  1. 系统自动提供的变量: 在访问特定页面时,系统会自动将一些核心数据传递给模板,可以直接在模板中使用。例如,在文章详情页,archive 变量会包含当前文章的所有信息(如 archive.Titlearchive.Content);在分类列表页,category 变量则代表当前分类的数据。此外,像 pages 这样的变量会承载分页信息,无需我们手动获取。

  2. 通过内置标签获取并定义的变量: 这是我们最常用来获取和显示特定数据的方式。AnQiCMS提供了丰富的内置标签(例如 systemcontactarchiveListcategoryList 等),这些标签不仅能按需查询数据,还可以将查询结果赋值给一个我们自定义的变量名,以便在模板中进一步使用。

    举个例子,如果想在页脚显示网站名称,我们可以直接调用系统设置标签:

    <div>网站名称:{% system with name="SiteName" %}</div>
    

    但如果需要在多个地方重复使用这个网站名称,或者想对它进行进一步处理,最好将其赋值给一个变量:

    {% system siteNameVar with name="SiteName" %}
    <div>网站名称:{{ siteNameVar }}</div>
    

    这样,siteNameVar 就包含了网站名称,我们可以在后续的模板代码中多次引用。对于需要获取列表数据的情况,如文章列表,我们会这样定义一个变量 archives 来存储查询结果:

    {% archiveList archives with type="list" categoryId="1" limit="10" %}
        {% for item in archives %}
            <p><a href="{{ item.Link }}">{{ item.Title }}</a></p>
        {% endfor %}
    {% endarchiveList %}
    

    在这里,archives 成为了一个包含多篇文章数据的数组,我们通过 for 循环遍历它,并通过 item.Linkitem.Title 访问每篇文章的链接和标题。

  3. 在模板内部自定义的变量: 有时候,我们需要在模板中定义一些临时变量来存储计算结果、短语或者传递给其他模块的数据。AnQiCMS提供了两种常用的方式:

    • {% with ... %}{% endwith %}:这种方式定义的变量只在其 with 标签的内部有效,通常用于为 include 标签传递参数,或者在一个局部代码块中定义临时变量。

      {% with greeting="Hello AnQiCMS User!" %}
          <p>{{ greeting }}</p>
      {% endwith %}
      {# 在这里,greeting 变量将不再有效 #}
      
    • {% set ... %}set 标签定义的变量在当前模板文件中具有更广泛的有效范围,从定义位置开始,直到模板结束。

      {% set pageTitle = "关于我们" %}
      <title>{{ pageTitle }}</title>
      {# 稍后在页面其他地方依然可以使用 pageTitle #}
      <p>欢迎来到{{ pageTitle }}页面。</p>
      

      这两种方式各有侧重,with 强调作用域隔离,而 set 更适合在整个模板中共享数据。

访问变量的属性和调用方法

一旦变量被定义,我们就可以使用点(.)符号来访问其内部的属性或字段。例如,如果 archive 是一个文章对象变量,那么 {{ archive.Title }} 将显示文章标题,{{ archive.CreatedTime }} 则显示创建时间。

对于列表或数组类型的变量,我们通常会结合 {% for ... in ... %}{% endfor %} 循环标签来遍历其中的每一个元素,并在循环体内访问每个元素的属性:

{% archiveList latestNews with type="list" limit="5" %}
    <ul>
        {% for newsItem in latestNews %}
            <li><a href="{{ newsItem.Link }}">{{ newsItem.Title }}</a></li>
        {% endfor %}
    </ul>
{% endarchiveList %}

在这个例子中,latestNews 是一个文章列表变量,循环中的 newsItem 则代表列表中的每一个文章对象。

AnQiCMS的模板还支持直接调用Go语言结构体中定义的公共方法。例如,如果文章对象 item 有一个名为 GetThumb() 的方法来获取缩略图,我们就可以直接在模板中这样调用:

<img src="{{ item.GetThumb() }}" alt="{{ item.Title }}">

使用过滤器处理变量

AnQiCMS模板引擎内置了丰富的过滤器(Filters),它们允许我们对变量的值进行各种处理,如格式化、截取、转义等。过滤器通过管道符 | 连接在变量后面。

一些常用的过滤器包括:

  • |safe:当变量内容包含HTML代码(比如文章详情 Content 字段)时,使用 |safe 可以阻止模板引擎对其进行转义,从而让HTML代码正常渲染。
    
    <div>{% archiveDetail articleContent with name="Content" %}{{ articleContent|safe }}</div>
    
  • |stampToDate:"格式":用于将时间戳格式化为可读的日期或时间字符串。
    
    <p>发布时间:{{ stampToDate(archive.CreatedTime, "2006年01月02日 15:04") }}</p>
    
  • |truncatechars:数字:将字符串截取到指定长度,并在末尾添加省略号。
    
    <p>{{ archive.Description|truncatechars:100 }}</p>
    
  • |default:"默认值":如果变量没有值或为空,则显示一个默认值。
    
    <p>作者:{{ archive.Author|default:"佚名" }}</p>
    
    过滤器极大地增强了模板处理数据的灵活性,让我们能够在不修改后台逻辑的情况下,前端呈现更多样化的内容。

小结

在AnQiCMS中定义和使用变量,是从静态页面走向动态内容展示的核心步骤。无论是通过系统自带的变量快速获取数据,还是利用内置标签定制化查询,亦或是直接在模板中定义临时变量,都为我们提供了极大的灵活性。结合点符号访问属性、循环遍历数据以及运用过滤器进行格式化,我们可以构建出功能丰富、用户体验优秀的网站。掌握这些变量的使用技巧,将让您的内容运营工作更加得心应手。


常见问题 (FAQ)

1. 如何查看一个变量中到底包含了哪些数据和结构?

如果您在模板开发过程中对某个变量的内部结构或包含的数据不确定,可以使用 {{ 变量名 | dump }} 过滤器。它会在页面上直接打印出该变量的详细结构