在网站建设和维护中,如何高效地管理代码、避免重复劳动,是提升开发效率和确保网站一致性的关键。对于使用 AnQiCMS 构建网站的用户来说,其灵活的模板引擎提供了强大的代码复用机制,让我们可以轻松地引用其他模板文件,例如通用的页眉 (header) 和页脚 (footer),从而实现模块化开发。

AnQiCMS 的模板设计借鉴了 Django 模板引擎的语法特性,这对于熟悉前端开发或接触过其他主流 CMS 模板的开发者来说,上手非常容易。其核心思想在于,你可以将网站中重复出现的部分抽取出来,作为独立的模板文件,然后在需要的地方引用它们。这样不仅能减少代码量,更重要的是,当这些公共部分需要修改时,你只需更改一个文件,就能在全站范围内生效,极大地提升了网站的可维护性和一致性。

include 标签:灵活嵌入代码片段

在 AnQiCMS 模板中,最直接、最常用的代码复用方式就是使用 include 标签。这个标签的作用是将一个模板文件的内容直接嵌入到另一个模板文件的指定位置。它非常适合用来处理那些相对独立、自成一体的页面元素,比如网站的导航条(header.html)、底部信息区域(footer.html)、侧边栏(sidebar.html),甚至是某个页面中反复出现的独立组件(如文章列表项、产品卡片等)。

使用 include 标签非常直观,你只需要在主模板文件中指定要引入的模板文件路径即可。例如,假设你的模板目录结构中有一个 partial 文件夹,里面存放着 header.htmlfooter.html

<!-- template/your_template_name/index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的 AnQiCMS 网站</title>
</head>
<body>
    {% include "partial/header.html" %}

    <main>
        <h1>欢迎来到我的网站</h1>
        <p>这是网站的主体内容。</p>
    </main>

    {% include "partial/footer.html" %}
</body>
</html>

在这里,{% include "partial/header.html" %}{% include "partial/footer.html" %} 会将 partial/header.htmlpartial/footer.html 中的所有内容,原封不动地插入到 index.html 的相应位置。

include 标签还提供了更灵活的用法。如果你不确定某个文件是否一定存在,可以使用 if_exists 参数,这样即使文件不存在,页面也不会报错,而是默默地忽略该引用:

{% include "partial/optional_ad.html" if_exists %}

有时,你可能希望给被引入的模板文件传递一些特定的数据。这时,可以使用 with 关键字来指定变量:

<!-- partial/header.html 中可以接收 title 和 keywords 变量 -->
<header>
    <nav>
        <h1>{{ title }}</h1>
        <p>关键词:{{ keywords }}</p>
        <!-- 其他导航内容 -->
    </nav>
</header>

<!-- 在主模板中这样引用并传递变量 -->
{% include "partial/header.html" with title="AnQiCMS 官方网站" keywords="AnQiCMS, 建站, CMS" %}

如果你只想让被引入的模板文件使用你明确传递的变量,而不继承当前主模板的所有上下文变量,可以使用 only 关键字:

{% include "partial/header.html" with title="AnQiCMS 官方网站" only %}

这样,partial/header.html 就只能访问到 title 变量,而无法访问主模板中的其他变量。

extendsblock:构建网站骨架

当我们需要定义网站的整体布局,例如所有页面都共享相同的 <head> 区域、顶部导航、底部版权信息,但主体内容(文章、产品详情、列表等)各不相同的时候,extendsblock 标签的组合就显得尤为强大。这是一种模板继承的机制,它允许你创建一个“骨架”模板,然后其他页面模板可以“继承”这个骨架,并只填充或修改骨架中预留的特定区域。

首先,你需要创建一个基础布局模板,通常命名为 base.htmllayout.html。在这个模板中,定义网站的通用结构,并使用 block 标签标记出那些可能在子模板中被覆盖的区域:

<!-- template/your_template_name/base.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}AnQiCMS 网站{% endblock %}</title>
    <link rel="stylesheet" href="{% system with name='TemplateUrl' %}/css/style.css">
    <!-- 其他公共样式和脚本 -->
</head>
<body>
    {% include "partial/header.html" %} {# 顶部导航,可以继续使用 include #}

    <div id="wrapper">
        {% block content %}
            <!-- 子模板将在这里填充具体内容 -->
        {% endblock %}
    </div>

    {% include "partial/footer.html" %} {# 底部信息,也可以继续使用 include #}
    <script src="{% system with name='TemplateUrl' %}/js/main.js"></script>
</body>
</html>

base.html 中,我们定义了两个 block 区域:titlecontent。现在,任何其他页面模板如果想要使用这个布局,只需在文件的开头使用 extends 标签来继承它,然后通过同名的 block 标签来填充或覆盖 base.html 中对应区域的内容:

<!-- template/your_template_name/index.html (或其他页面,如 detail.html, list.html) -->
{% extends "base.html" %} {# 声明继承 base.html,这必须是模板文件的第一行 #}

{% block title %}网站首页 - {% system with name='SiteName' %}{% endblock %}

{% block content %}
    <section class="hero">
        <h2>欢迎使用 AnQiCMS 构建您的网站</h2>
        <p>轻松管理内容,高效展示信息。</p>
    </section>

    <section class="features">
        <h3>核心功能</h3>
        <ul>
            <li>多站点管理</li>
            <li>灵活内容模型</li>
            <li>高级 SEO 工具</li>
        </ul>
    </section>
{% endblock %}

这样,index.html 就不需要重复编写 <head><body>headerfooter 等公共代码,只需关注 titlecontent 区域的特定内容即可。页面的整体结构由 base.html 统一控制,而每个页面的具体内容则由子模板负责。

模板文件的组织:partial/ 目录的约定

为了更好地组织和管理这些可复用的模板文件,AnQiCMS 模板制作指南中建议,可以将那些小的、可复用的代码片段(如侧边栏、面包屑导航、页脚等)存放在 partial/ 目录下。例如:

/template
  /your_template_name
    /partial
      header.html
      footer.html
      sidebar.html
      breadcrumb.html
    base.html
    index.html
    article_detail.html
    ...

这种结构清晰地划分了模板的职责:base.html 定义了网站的整体布局,index.htmlarticle_detail.html 等是具体的页面模板,而 partial/ 目录下的文件则是各种小部件和公共区域。

通过上述两种主要的代码复用机制——include 标签用于嵌入独立的片段,extendsblock 标签用于构建和填充页面骨架——AnQiCMS 使得网站模板的开发变得高效且易于维护。你可以告别繁琐的复制粘贴,专注于网站内容的创意和设计,让技术工具真正服务于内容运营的目标。


常见问题 (FAQ)

1. 什么时候我应该使用 include,什么时候使用 extendsblock 通常来说,extendsblock 适用于构建页面的整体结构和布局(如网站的头部、底部、侧边栏的框架),因为它们定义了一个父子关系,子模板继承父模板的整体结构并修改特定区域。而 include 标签则更适合嵌入那些相对独立、可以在不同页面或不同区域重复使用的小型代码片段,比如一个导航栏的特定菜单项、一个广告位、文章摘要卡片或者一个通用的表单