在构建和定制AnQiCMS网站时,模板扮演着核心角色。AnQiCMS的模板系统借鉴了Django模板引擎的强大与简洁,这意味着无论您是初次接触还是已经熟悉其他现代化模板语言,都能迅速上手。其语法规则围绕着如何有效地展示动态数据和控制页面逻辑,让网站内容呈现既灵活又富有条理。

理解AnQiCMS模板系统的核心,首先要区分两种主要元素:变量和标签。

动态数据的展现:模板变量

在AnQiCMS模板中,您会看到数据以双花括号{{ 变量名 }}的形式出现。这些是模板变量,它们是您网站后台管理系统中存储的各种动态数据的占位符。当页面被访问时,AnQiCMS会将这些变量替换为实际的内容。例如,{{ archive.Title }}可能会显示一篇文章的标题,而{{ system.SiteName }}则会展示您网站的全局名称。

为了保持清晰和一致性,AnQiCMS的变量命名通常遵循驼峰命名法(CamelCase),这意味着每个单词的首字母大写,例如Archive.IdArchive.Title。这种规范有助于提高模板的可读性。

此外,这些变量的值还可以通过“过滤器”进行进一步处理。过滤器通过管道符|附加在变量之后,例如{{ 对象 | 过滤器名称:参数 }}。它们能够对变量进行格式化、截断、转换等操作,比如{{ archive.CreatedTime | stampToDate("2006-01-02") }}可以把时间戳格式化为日期,{{ archive.Content | safe }}则指示模板引擎安全地渲染HTML内容,而不会进行转义。

控制页面逻辑与获取数据:模板标签

与变量不同,模板标签使用单花括号和百分号{% 标签名 参数 %}进行定义。它们是功能性的代码块,用于执行逻辑操作、获取数据集合、引用其他模板文件等。大多数模板标签都是成对出现的,这意味着它们有一个开始标签和一个结束标签,例如{% if 条件 %}...{% endif %}{% for 循环变量 in 数据集合 %}...{% endfor %}

  1. 控制流标签: AnQiCMS模板提供了强大的逻辑控制能力,让您能够根据不同条件显示不同内容,或者遍历数据集合。

    • 条件判断(if/elif/else/endif): 类似于编程语言中的条件语句,{% if 条件 %}允许您根据表达式的真假来决定渲染哪部分内容。您可以配合{% elif 其他条件 %}{% else %}来处理多个分支情况,最终以{% endif %}结束。
    • 循环遍历(for/empty/endfor): 当您需要展示列表数据时,{% for item in 集合 %}标签就派上用场了。它会遍历集合中的每一个元素,并让您可以在循环体内访问item(或其他您自定义的变量名)。这个标签还提供了一些便利的辅助变量,比如forloop.Counter用于获取当前循环的索引(从1开始),forloop.Revcounter则表示剩余的循环次数。当集合为空时,您可以使用{% empty %}子句来显示一段默认内容,而不是空的循环。您甚至可以在循环中添加reversedsorted关键字来改变遍历的顺序。
  2. 数据获取标签: AnQiCMS内置了多种标签,专门用于从后台获取特定类型的数据。

    • 内容列表与详情(archiveList/archiveDetail): 这是最常用的标签之一。{% archiveList archives with type="page" categoryId="1" limit="10" %}可以获取指定分类下的文章或产品列表,并支持分页。{% archiveDetail with name="Title" id="1" %}则可以获取特定ID文章的详细信息,如标题、内容等。它们通常带有参数,如moduleId(模型ID)、categoryId(分类ID)、id(内容ID)、name(字段名)、type(列表类型如page/list/related)、limit(数量限制)和order(排序方式)。
    • 分类信息(categoryList/categoryDetail): 类似地,{% categoryList categories with moduleId="1" parentId="0" %}可以获取网站的分类结构,{% categoryDetail with name="Title" %}则用于显示当前分类的标题或描述。
    • 站点配置(system/contact/tdk): 这些标签用于获取网站的全局配置,如{% system with name="SiteName" %}获取网站名称,{% contact with name="Cellphone" %}获取联系电话,{% tdk with name="Title" %}获取页面TDK信息。
    • 导航菜单(navList): {% navList navs %}标签能方便地获取后台配置的网站导航菜单,支持多级结构。
    • 分页功能(pagination): 当配合archiveList使用type="page"时,{% pagination pages with show="5" %}标签会自动生成美观的分页导航。
  3. 辅助标签:

    • 模板引用(include): 为了模块化,您可以使用{% include "partial/header.html" %}来将一个模板片段插入到当前模板中。这有助于提高模板的复用性和维护性。
    • 模板继承(extends/block): AnQiCMS支持模板继承,通过{% extends 'base.html' %}可以指定一个父模板,然后通过{% block 区块名 %}...{% endblock %}来重写父模板中的特定内容块。这对于创建统一布局的网站非常有用。
    • 宏函数(macro): 类似于编程中的函数,{% macro my_function(param1, param2) %}...{% endmacro %}可以定义可复用的代码块,减少重复编写。
    • 变量定义(with/set): {% with my_var="some_value" %}{% set another_var = "another_value" %}允许您在模板中定义临时变量,方便在局部范围内使用。
    • 时间戳格式化(stampToDate): 这是一个非常有用的内置函数,{{ stampToDate(时间戳, "2006-01-02 15:04:05") }}可以将Unix时间戳转换为人类可读的日期时间格式。

模板制作约定

在进行AnQiCMS模板制作时,遵循一些基本约定能让您的工作更加顺畅:

  • 文件格式: 模板文件通常以.html作为后缀,并统一存放在站点的/template目录下。
  • 静态资源: 模板中引用的样式、脚本、图片等静态文件,建议统一放置在/public/static/目录中。
  • 编码: 所有模板文件都应使用UTF-8编码,以避免乱码问题。
  • 清理空白: 有时为了代码可读性,标签会独占一行,但在实际渲染时可能会产生不必要的空行。您可以在标签的%符号后或前添加连字符-来去除空白,如{%- if condition %}{% endfor -%}

总而言之,AnQiCMS的模板变量和标签系统提供了一套既强大又易于学习的工具集,让网站的定制化和内容呈现变得直观而高效。掌握这些Django-like的语法规则,将助您更自如地驾驭AnQiCMS,打造出功能丰富、用户体验优秀的网站。


常见问题 (FAQ)

1. 如何在模板中获取内容模型中自定义的字段信息?

AnQiCMS的内容模型允许您为不同类型的内容(如文章、产品)添加自定义字段。如果您想在模板中显示这些自定义字段,可以利用archiveDetail标签或者archiveParams标签。例如,如果您自定义了一个名为author的字段,可以直接通过{{ archive.Author }}来访问。对于多个自定义字段的遍历,可以使用{% archiveParams params %}标签来获取所有自定义参数,然后通过{% for item in params %}{{ item.Name }}:{{ item.Value }}{% endfor %}循环