AnQiCMS 的模板中如何使用变量和控制标签?

安企CMS,一个基于Go语言构建的企业级内容管理系统,以其高效、安全和灵活的特性,为内容运营者和企业用户提供了强大的支持。在AnQiCMS中,内容不仅仅是静态的文字和图片,通过其精心设计的模板引擎,我们可以将数据转化为生动、个性化的网站页面。理解如何在AnQiCMS模板中使用变量和控制标签,是释放其强大定制能力的关键一步。

AnQiCMS的模板引擎采用了类似Django或Blade语法的标记方式,这意味着熟悉这些前端模板语言的开发者会感到非常亲切。它以简洁直观的方式,让动态内容的渲染变得轻而易举。模板文件通常以.html作为后缀,整齐地存放在/template目录下,而配套的样式、脚本和图片等静态资源则独立保存在/public/static/目录中,保持了良好的组织结构。

变量:让内容活起来的魔法

在AnQiCMS模板中,变量是我们展示动态数据的主要手段。想象一下,如果网站的标题、文章内容、产品价格都需要手动修改,那将是多么繁琐。变量的引入,正是为了解决这个问题。

当你需要在页面上显示一块动态信息时,比如当前文章的标题、网站的名称或者联系电话,只需将变量名用双花括号包裹起来,就像这样:{{ 变量名称 }}。AnQiCMS的变量命名遵循驼峰法则,即每个单词的首字母大写,例如archive.Title表示文章的标题,system.SiteName则代表网站的名称。这种清晰的命名方式,让开发者能够迅速理解变量所指向的内容。

举个例子,如果我们要显示一篇博客文章的标题和发布时间,可能会这样写:

<h1>{{ archive.Title }}</h1>
<p>发布时间:{{ stampToDate(archive.CreatedTime, "2006-01-02") }}</p>

这里,archive.Title直接取用当前文章对象的标题字段。而archive.CreatedTime获取的是一个时间戳,我们巧妙地使用了AnQiCMS内置的stampToDate函数(在AnQiCMS中,它被视为一个标签函数),将其格式化成我们熟悉的“年-月-日”形式。AnQiCMS内置了丰富的标签来获取不同类型的数据,例如system标签用于获取全局设置(如SiteNameSiteLogo),contact标签用于获取联系方式(如CellphoneEmail),archiveDetail标签则专门用于获取文章详情,它们都可以通过name参数指定要获取的具体字段。

除了直接输出变量,AnQiCMS还提供了强大的“过滤器”(Filters),让我们可以对变量的输出进行进一步处理。过滤器通过管道符|连接在变量之后,例如{{ obj|filter__name:param }}。一个常见的应用场景是处理富文本内容,为了防止XSS攻击,模板引擎默认会对HTML标签进行转义。如果我们需要显示由编辑器生成的HTML内容,就必须使用|safe过滤器来声明内容是安全的,允许浏览器正常解析,比如{{ archive.Content|safe }}。此外,还有|truncatechars:9用于截断字符串并添加省略号,|lower用于将字符串转换为小写,以及|add:2用于数字相加等等,这些过滤器极大地增强了变量输出的灵活性。

控制标签:构建页面逻辑的骨架

仅仅有动态数据还不够,一个功能完善的网站还需要根据不同条件展示不同内容,或者遍历列表数据。这就是控制标签发挥作用的地方。在AnQiCMS模板中,控制标签使用单花括号和百分号来定义,例如{% 标签 %},并且大多数需要对应的结束标签{% end标签 %}来明确作用范围。

1. 条件判断:ifelifelseendif

if标签是我们实现条件逻辑的基础。它可以根据表达式的真假来决定是否渲染某段内容。例如,如果一篇文章有缩略图,我们就显示它:

{% if archive.Thumb %}
    <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}">
{% else %}
    <img src="{% system with name='DefaultThumb' %}" alt="默认缩略图">
{% endif %}

这里,{% if archive.Thumb %}会检查archive.Thumb是否存在或有值。如果为真,则显示文章的缩略图;否则,{% else %}部分会显示一个系统默认的缩略图。此外,{% elif %}可以用于处理多个并列的条件,让逻辑判断更加细致。

2. 循环遍历:foremptyendfor

网站中充满了列表数据,比如文章列表、产品列表、导航菜单等。for标签正是为遍历这些数据而生。它能够逐一访问数组、Slice等集合中的每个项目,并让每个项目在循环体内可用。

假设我们要展示一个最新文章列表:

{% archiveList archives with type="list" limit="10" %}
    {% for item in archives %}
        <li>
            <a href="{{ item.Link }}">{{ item.Title }}</a>
            <span>阅读量:{{ item.Views }}</span>
        </li>
    {% empty %}
        <p>当前没有任何文章发布。</p>
    {% endfor %}
{% endarchiveList %}

在这个例子中,{% archiveList archives with type="list" limit="10" %}是一个用于获取文章列表的控制标签,它将获取到的10篇文章数据赋值给archives变量。接着,{% for item in archives %}循环会遍历archives中的每一篇文章,并将当前文章命名为item,然后在<li>标签中展示其链接、标题和阅读量。

值得一提的是,for循环还支持一些便捷的属性和修饰符:

  • forloop.Counter:获取当前循环的索引(从1开始)。
  • forloop.Revcounter:获取当前循环剩余的次数。
  • reversed:将列表反向遍历。
  • sorted:对列表进行排序遍历。
  • empty:当循环的集合为空时,{% empty %}{% endfor %}之间的内容就会被渲染,非常适合展示“无内容”提示。
  • cycle:在循环中交替输出多个值,例如{% cycle "even" "odd" %}可以在每次循环中轮流输出“even”和“odd”,常用于为列表项添加不同的CSS类。

3. 变量赋值:withset

在模板中临时定义一些变量,可以有效提高代码的可读性和复用性。{% with %}标签允许你在一个块级作用域内声明一个或多个变量,并在{% endwith %}之间使用:

{% with pageTitle="安企CMS官网", pageKeywords="CMS,建站系统,Go语言" %}
    <title>{{ pageTitle }}</title>
    <meta name="keywords" content="{{ pageKeywords }}">
{% endwith %}

{% set %}则可以在当前模板的任何位置声明一个变量,其作用域通常更广,直到当前模板渲染结束。

4. 模块化与继承:includeextendsblockmacro

为了提高模板的复用性和可维护性,AnQiCMS引入了模块