如何在AnQiCMS模板中引入公共的页头、页脚等代码片段以统一显示风格?

如何在AnQiCMS模板中引入公共的页头、页脚等代码片段以统一显示风格?

构建一个网站时,无论是个人博客、企业官网还是营销站点,保持页面视觉和功能的一致性都至关重要。设想一下,如果每个页面的顶部导航、底部版权信息甚至是侧边栏都各不相同,用户体验将大打折扣,网站的专业性也会大打折扣。安企CMS(AnQiCMS)提供了一套强大而灵活的模板引擎,能够帮助我们轻松实现网站的统一风格管理,其中最核心的实践就是将公共的页头、页脚以及其他常用代码片段进行模块化处理和统一引入。

通过这种方式,我们不仅能确保网站的每个页面都拥有一致的品牌标识和操作体验,还能大幅提升开发效率和后期维护的便捷性。当网站的导航结构、联系方式或版权声明需要更新时,我们只需修改一处代码,即可让所有相关页面同步更新,免去了逐页修改的繁琐。

那么,在AnQiCMS中,我们具体应该如何操作呢?

理解AnQiCMS模板引擎的基础

AnQiCMS的模板引擎采用了类似Django的语法风格,这对于熟悉模板开发的朋友来说会非常亲切。它的模板文件通常以.html为后缀,并统一存放在/template目录下。在模板文件中,我们主要会用到两种标记:

  • 双花括号 {{ 变量名 }}:用于输出变量内容,比如网站名称、文章标题等。
  • 单花括号加百分号 {% 标签名 参数 %}:用于控制逻辑流程,如条件判断、循环遍历,以及引入其他模板文件等。

要实现页面风格的统一,我们主要会运用到模板引擎的两个核心特性:模板继承(extendsblock模板包含(include

模板继承:构建网站骨架

模板继承是构建统一网站布局的基石。它允许我们创建一个“基础模板”(通常命名为base.html或根据design-director.md中的建议命名为bash.html),其中定义了网站的整体结构,例如HTML文档声明、head区域、页头、主体内容区域、页脚等。基础模板中的可变部分则通过block标签进行定义。

例如,一个基础模板 (base.html) 可能看起来像这样:

<!DOCTYPE html>
<html lang="{% system with name='Language' %}">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    {# 引入页面的TDK信息 #}
    <title>{% tdk with name="Title" siteName=true %}</title>
    <meta name="keywords" content="{% tdk with name="Keywords" %}">
    <meta name="description" content="{% tdk with name="Description" %}">
    {%- tdk canonical with name="CanonicalUrl" %}
    {%- if canonical %}
    <link rel="canonical" href="{{canonical}}" />
    {%- endif %}
    
    {# 引入公共样式表 #}
    <link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/main.css">
    {% block head_extra %}{% endblock %} {# 预留额外头部内容的区块 #}
</head>
<body>
    <header id="header">
        {% block header %}
            {% include "partial/header.html" %} {# 引入公共页头片段 #}
        {% endblock %}
    </header>

    <main id="main-content">
        {% block content %}{% endblock %} {# 页面主体内容的区块,由子模板填充 #}
    </main>

    <footer id="footer">
        {% block footer %}
            {% include "partial/footer.html" %} {# 引入公共页脚片段 #}
        {% endblock %}
    </footer>

    {# 引入公共脚本文件 #}
    <script src="{% system with name="TemplateUrl" %}/js/main.js"></script>
    {% block scripts_extra %}{% endblock %} {# 预留额外脚本的区块 #}
</body>
</html>

在这个base.html中,我们定义了titlekeywordsdescription这些TDK信息通过{% tdk %}标签动态获取,并使用{% system with name="TemplateUrl" %}获取模板静态资源路径,确保样式和脚本能正确加载。关键在于{% block header %}{% block content %}{% block footer %}等标签,它们是子模板可以覆盖和填充内容的区域。

任何希望保持统一风格的页面,例如首页 (index.html) 或文章详情页 (archive/detail.html),都只需在文件顶部使用{% extends "base.html" %}来继承这个基础模板,然后根据需要填充或覆盖block中定义的内容。

例如,一个文章详情页 (archive/detail.html) 可能会这样继承和填充:

{% extends "base.html" %}

{% block head_extra %}
    <link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/detail.css">
{% endblock %}

{% block content %}
    <div class="container article-detail">
        <h1>{% archiveDetail with name="Title" %}</h1>
        <div class="meta-info">
            <span>发布日期: {{ stampToDate(archive.CreatedTime, "2006-01-02") }}</span>
            <span>分类: <a href="{% categoryDetail with name='Link' %}">{% categoryDetail with name='Title' %}</a></span>
        </div>
        <article class="content">
            {%- archiveDetail archiveContent with name="Content" %}
            {{ archiveContent|safe }}
        </article>
        {# 显示上一篇/下一篇文章 #}
        <nav class="pagination-nav">
            {% prevArchive prev %}
            {% if prev %}
                <a href="{{ prev.Link }}">上一篇: {{ prev.Title }}</a>
            {% else %}
                <span>没有了</span>
            {% endif %}
            {% endprevArchive %}
            {% nextArchive next %}
            {% if next %}
                <a href="{{ next.Link }}">下一篇: {{ next.Title }}</a>
            {% else %}
                <span>没有了</span>
            {% endif %}
            {% endnextArchive %}
        </nav>
    </div>
{% endblock %}

{% block scripts_extra %}
    <script src="{% system with name="TemplateUrl" %}/js/detail.js"></script>
{% endblock %}

可以看到,文章详情页只关注了自身独特的“内容”部分,而页头、页脚等公共元素则由base.html负责引入和管理。

模板包含:模块化代码片段

include标签则用于引入较小的、独立的、可重用的代码片段。它非常适合那些在多个block中都可能出现,或者不属于整体布局但功能独立的模块,如导航菜单、侧边栏、版权信息块、联系方式卡片等。AnQiCMS推荐将这些片段放在partial/目录下。

以上面base.html为例,它就通过{% include "partial/header.html" %}{% include "partial/footer.html" %}引入了单独的页头和页脚文件。

一个公共页头 (partial/header.html) 示例:

<div class="top-bar">
    <div class="container">
        欢迎访问{% system with name="SiteName" %}!
        电话:{% contact with name="Cellphone" %}
    </div>
</div>
<div class="main-header">
    <div class="container">
        <a href="{% system with name="BaseUrl" %}" class="logo">
            <img src="{% system with name="SiteLogo" %}" alt="{% system with name="SiteName" %} Logo">
        </a>
        <nav class="main-nav">
            {% navList navs %}
            <ul>
                {%- for item in navs %}
                <li class="{% if item.IsCurrent %}active{% endif %}">
                    <a href="{{ item.Link }}">{{item.Title}}</a>
                    {%- if item.NavList %}
                    <dl>
                        {%- for inner in item.NavList %}
                            <dd class="{% if inner.IsCurrent %}active{% endif %}">
                                <a href="{{ inner.Link }}">{{inner.Title}}</a>
                            </dd>
                        {% endfor %}
                    </dl>
                    {% endif %}
                </li>
                {% endfor %}
            </ul>
            {% endnavList %}
        </nav>
    </div>
</div>

而公共页脚 (partial/footer.html) 示例可能包含:

”`html