在网站模板的开发和维护中,我们常常会遇到需要重复使用的HTML代码片段或逻辑结构。如果每次都复制粘贴,不仅效率低下,而且一旦需要修改,就得在多个地方重复操作,极易出错。安企CMS深知这一点,它提供的模板引擎借鉴了Django的语法,通过include标签和macro宏函数,让我们可以轻松实现代码复用,大大提升了模板的可维护性和开发效率。
复用公共HTML片段:include 标签
想象一下,我们网站的顶部导航栏和底部版权声明几乎在每个页面都会出现。如果每次都把这些HTML代码写一遍,那简直是噩梦。安企CMS的include标签正是解决这类问题的利器。它允许我们将一个HTML文件完整地嵌入到另一个模板文件中,就像拼图一样。这些公共部分通常被称为“代码片段”,例如页头、页脚、侧边栏等,它们可以存放在模板目录下的partial/目录中,方便统一管理和引用。
最简单的使用方式,就是直接指定要包含的文件路径。比如我们有一个存储在 partial 文件夹下的头部文件 header.html,我们可以在主模板中这样引入它:
{% include "partial/header.html" %}
有时候,我们引入的文件可能不是每个页面都必须存在的,或者说它是一个可选组件。这时,include标签的if_exists参数就派上用场了。加上这个参数后,如果指定的文件不存在,系统不会报错,而是会默默地跳过这个引入操作,这对于构建灵活多变的页面结构非常有用:
{% include "partial/header.html" if_exists %}
更强大的是,include标签还能让我们在引入公共片段时,向其传递特定的数据。这通过with参数实现。例如,我们希望公共头部能够动态显示页面的标题和关键词,但这些信息可能在不同的页面有所不同。我们可以这样向header.html传递数据:
{% include "partial/header.html" with title="这是声明给header使用的title" keywords="这是声明给header使用的keywords" %}
在header.html内部,我们就可以像使用普通变量一样,通过{{title}}和{{keywords}}来访问这些值。如果我们需要传递多个变量,只需用空格分隔开即可。
此外,如果只想让include进来的模板使用我们明确指定的变量,而不继承当前模板的所有上下文变量,可以使用only参数。这有助于保持代码的清晰性,避免不必要的变量污染:
{% include "partial/header.html" with title="我的页面标题" keywords="SEO关键词" only %}
这意味着header.html中只能访问title和keywords这两个变量,而不能访问主模板中其他的任何变量。
实际应用中,include标签非常适合复用那些结构相对固定、内容可能略有变化的区域,如网站的导航栏、页脚、侧边栏、通用的广告位等。通过这种方式,我们可以将复杂的页面拆分成多个小组件,每个组件负责自己的内容,从而提高模板的可读性和可维护性。
定义可重用代码块:macro 宏函数
如果说include标签是把一块现成的积木搬过来用,那么macro宏函数就像是制造积木的模具。它允许我们定义可重用的代码块,这些代码块可以接受参数,并根据参数动态生成HTML内容。macro的功能更像编程语言中的函数,拥有自己独立的作用域,只处理传入的参数,这使得它在处理重复的、结构相似但内容不同的元素时非常高效。
定义一个宏函数非常直观,它以{% macro 宏名称(参数列表) %}开始,以{% endmacro %}结束。例如,如果我们经常需要在页面中展示文章的缩略信息,我们可以定义一个名为archive_item的宏:
{% macro archive_item(archive) %}
<li class="article-item">
<a href="/archive/{{archive.Id}}" class="link">
<h5 class="title">{{archive.Title}}</h5>
</a>
</li>
{% endmacro %}
在需要使用这个宏的地方,我们只需像调用函数一样传入相应的文章数据即可,比如在一个文章列表中:
{% for item in archives %}
{{ archive_item(item) }}
{% endfor %}
这样,每个文章列表项都会按照archive_item宏定义的结构进行渲染。
为了更好地组织模板文件,我们还可以将宏函数保存在独立的模板文件中(例如archive.helper),然后在其他模板中通过import标签导入并使用。这有助于保持主模板的简洁,并将宏函数分类管理:
{% import "archive.helper" as my_macros %}
导入后,我们就可以通过my_macros.archive_item(item)这样的形式来调用宏了。如果archive.helper中包含多个宏,我们也可以一次性导入它们,甚至为它们设置别名,以方便使用和区分。
macro宏函数特别适用于那些需要高度定制化、但