如何使用AnQiCMS的模板继承功能来构建一致的页面骨架和局部内容显示?

在网站建设与运营过程中,如何高效地管理页面布局、确保视觉风格一致,同时又能灵活地调整局部内容,是许多运营者面临的挑战。AnQiCMS 提供了强大的模板继承功能,它能够帮助我们巧妙地解决这些问题,实现网站页面的结构化管理和内容的灵活展示。

理解模板继承的核心概念

想象一下,模板继承就像是建筑设计中的“蓝图”或“母版”。我们首先设计一个通用的页面骨架,它包含了网站所有页面共享的元素,比如页头、页脚、导航栏等。这个骨架被称为“基础模板”(Base Template),它就像一张总体的设计图。

在这个基础模板中,我们通过使用 {% block %} 标签来定义一些可替换的区域。这些区域就像建筑中的预留空间,比如客厅、卧室或者厨房。子页面(也就是继承了基础模板的页面)可以根据自己的需求,选择性地填充或修改这些预留空间的内容。

当一个子模板使用 {% extends 'base.html' %} 标签声明继承某个基础模板时,它就获得了基础模板的所有布局和结构。子模板然后可以通过定义同名的 {% block %} 标签来覆盖或修改基础模板中对应块的内容。如果子模板没有定义某个块,那么它将直接沿用基础模板中该块的默认内容。值得注意的是,{% extends %} 标签必须是子模板中的第一个标签,否则模板继承将无法正常工作。

建立页面的“骨架”:Base 模板的实践

在 AnQiCMS 中,通常我们会创建一个名为 base.html 的文件作为我们网站的基础模板。这个模板承载了网站最核心、最通用的布局和元素。例如,它会包含 HTML 的 <html><head><body> 标签,以及页面的主要区域划分。

一个典型的 base.html 可能会这样组织:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block title %}
        <title>默认网站标题</title>  <!-- 子页面可重写此块,不重写则使用默认 -->
    {% endblock %}
    {% comment %} 这里可以放置其他全局的meta标签、CSS链接 {% endcomment %}
    <link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/global.css">
    {% block head_extra %}{% endblock %} {# 预留给子页面添加额外头部内容 #}
</head>
<body>

<div class="header">
    {% comment %} 通常这里会包含网站Logo、主导航等固定内容 {% endcomment %}
    <img src="{% system with name="SiteLogo" %}" alt="{% system with name="SiteName" %}" />
    {% navList navs %}
        <ul>
            {%- for item in navs %}
                <li><a href="{{ item.Link }}">{{item.Title}}</a></li>
            {% endfor %}
        </ul>
    {% endnavList %}
</div>

<div class="main-content-wrapper">
    <div class="sidebar">
        {% include 'partial/aside.html' %} {# 引入侧边栏局部片段 #}
    </div>
    <div class="main-area">
        {% block content %}
            <h4>这里是主内容区的默认占位符</h4>
        {% endblock %}
    </div>
</div>

<div class="footer">
    {% comment %} 通常这里会包含版权信息、备案号、友情链接等 {% endcomment %}
    <p>{% system with name="SiteCopyright" %}</p>
    <p><a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">{% system with name="SiteIcp" %}</a></p>
    {% linkList friendLinks %}
        {% if friendLinks %}
            <span>友情链接:</span>
            {% for item in friendLinks %}
                <a href="{{item.Link}}" {% if item.Nofollow == 1 %} rel="nofollow"{% endif %} target="_blank">{{item.Title}}</a>
            {% endfor %}
        {% endif %}
    {% endlinkList %}
</div>

{% block scripts %}{% endblock %} {# 预留给子页面添加JS脚本 #}
</body>
</html>

在这个 base.html 中,我们定义了 titlehead_extracontentscripts 等多个 block。这些 block 将成为子页面可以自由填充或覆盖的“插槽”。