如何使用AnQiCMS内置的标签来控制内容显示逻辑?

在AnQiCMS中,内置的标签系统是您掌控网站内容展示逻辑的核心工具。它提供了一套强大且灵活的语法,让您无需编写复杂的后端代码,就能在模板文件中精确地控制内容的获取、筛选、排序、格式化乃至最终的布局。这套系统类似Django模板引擎的语法,易于上手,能够帮助您将技术细节转化为直观的展示效果。

AnQiCMS标签的基础构成

AnQiCMS的标签系统主要由两种基本元素组成:

  1. 变量输出标签 ({{ 变量名 }}):用于直接在页面上显示数据,例如获取文章标题 {{ item.Title }}
  2. 逻辑控制标签 ({% 标签名 参数 %}):用于处理各种逻辑,比如条件判断、循环遍历、引入文件等,这些标签通常需要一个 {% end标签名 %} 来闭合。

理解这两种标签是深入使用AnQiCMS模板的关键。所有的标签和变量都严格区分大小写,使用时务必保持一致。

获取并展示内容:数据驱动的显示逻辑

AnQiCMS提供了多种标签来获取不同类型的内容,您可以根据需求选择合适的标签:

  • 列表型数据获取

    • archiveList:用于获取文章、产品等模型下的文档列表。您可以设置 moduleId 指定模型(如 moduleId="1" 获取文章)、categoryId 筛选分类、limit 控制数量、type="page|list" 选择分页或普通列表、order 定义排序规则等。
    • categoryList:获取分类列表。常用于展示导航菜单或侧边栏分类。您可以通过 parentId 指定父级分类,甚至获取当前分类的子分类或兄弟分类。
    • pageList:获取单页面列表,如“关于我们”、“联系我们”等。
    • tagList:获取标签列表,常用于构建热门标签云或相关标签。
    • navList:获取后台配置的网站导航菜单。支持多级导航。

    当您获取到列表数据后,通常会结合 {% for %} 循环标签来遍历并逐一显示:

    {% archiveList archives with type="list" categoryId="1" limit="5" %}
        {% for item in archives %}
            <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
        {% empty %}
            <li>当前分类下暂无内容。</li>
        {% endfor %}
    {% endarchiveList %}
    

    上述代码会显示分类ID为1的前5篇文章标题,如果列表为空,则显示“当前分类下暂无内容。”

  • 详情型数据获取

    • archiveDetail:获取单篇文档的详细信息。在文章详情页,通常无需指定ID,它会自动获取当前页面的文档信息。您可以指定 name="Title" 获取标题,name="Content" 获取内容等。
    • categoryDetail:获取单个分类的详细信息,如分类标题、描述、链接等。
    • pageDetail:获取单个单页面的详细信息。
    • tagDetail:获取单个标签的详细信息。
    • system:获取全局系统设置,如网站名称 SiteName、网站Logo SiteLogo、备案号 SiteIcp 等。
    • contact:获取后台配置的联系方式,如联系电话 Cellphone、联系邮箱 Email 等。
    • tdk:获取当前页面的SEO信息,如标题 Title、关键词 Keywords、描述 Description

    这些标签通常用于页面头部SEO设置、详情页内容展示或页脚信息显示:

    <title>{% tdk with name="Title" siteName=true %}</title>
    <meta name="keywords" content="{% tdk with name="Keywords" %}">
    <meta name="description" content="{% tdk with name="Description" %}">
    
    
    <h1>{% archiveDetail with name="Title" %}</h1>
    <div>{{ archiveDetail with name="Content" | safe }}</div>
    

逻辑控制与条件显示

在内容展示中,我们常常需要根据特定条件来决定是否显示某个元素或显示哪种内容。{% if %} 标签是实现这种逻辑的核心:

  • 条件判断

    {% if item.Thumb %}
        <img src="{{ item.Thumb }}" alt="{{ item.Title }}">
    {% else %}
        <img src="{% system with name="DefaultThumb" %}" alt="默认图片">
    {% endif %}
    

    这段代码会判断文章是否有缩略图,如果有则显示,否则显示系统默认缩略图。

  • 多重条件判断:您可以使用 {% elif %}{% else %} 来处理更复杂的逻辑,例如判断用户权限、内容类型等。

数据格式化与转换

AnQiCMS提供了一系列过滤器 (|) 和专用标签来处理数据的格式化,确保内容以**方式呈现:

  • 日期和时间stampToDate 标签可以将时间戳格式化为易读的日期和时间字符串。需要注意的是,其格式参数遵循Go语言的特定时间格式化标准(如 2006-01-02 15:04:05)。

    <span>发布日期:{{ stampToDate(item.CreatedTime, "2006年01月02日") }}</span>
    
  • 文本内容处理

    • |safe:这是非常重要的过滤器,用于显示富文本编辑器中的内容或包含HTML标签的字符串。它可以防止HTML标签被转义,确保页面正确渲染。
    • |truncatechars:N:截取字符串到指定字符数,并在末尾添加“…”
    • |default:"默认值":当变量为空或不存在时,显示一个预设的默认值。
    • |render:如果您的内容是Markdown格式,此过滤器可以将其渲染为HTML。
    • |replace:"旧词,新词":替换字符串中的特定子串。
    • |split:"分隔符"|join:"分隔符":用于字符串和数组之间的转换。
    <p>{{ item.Description | truncatechars:100 }}</p> {# 截取前100个字符 #}
    <p>{{ item.Content | render | safe }}</p> {# 渲染Markdown内容并确保HTML正确显示 #}
    

模板代码的复用与组织

为了提高效率和维护性,AnQiCMS支持模板的继承、包含和宏定义:

  • {% include "路径/文件名.html" %}:将另一个模板文件的内容插入到当前位置。这非常适合复用页眉、页脚、侧边栏等公共模块。您还可以通过 with 参数向被包含的模板传递变量。
  • {% extends "基础模板.html" %}{% block 名称 %}:实现模板继承。您可以定义一个基础布局(如 base.html),其中包含页面骨架,然后子模板通过重写 block 来填充特定内容,而不需要