Siteweaver 是一个经典的、基于 Perl 的内容管理系统,其模板系统非常灵活且强大,核心思想是将网站的内容(数据)与网站的呈现(样式/布局)完全分离,这种分离使得设计师可以专注于页面布局,而内容编辑者可以专注于填充内容,无需关心技术细节。

Siteweaver 6.8 的模板系统主要由以下几个部分组成:
核心概念:模板、组件 和数据
理解这三个概念是掌握 Siteweaver 模板的关键。
a. 模板
模板是定义页面最终外观的文件,它们是普通的 HTML 文件,其中嵌入了特殊的 Siteweaver 标签(通常用 [% %] 包围),当用户访问一个页面时,Siteweaver 会读取对应的模板文件,解析其中的标签,并用动态数据替换它们,最终生成并输出纯 HTML 给用户的浏览器。
- 文件位置: 通常位于服务器的
templates/目录下。 - 作用: 定义页面的“骨架”,如页头、页脚、导航栏、内容区域等。
b. 组件
组件是可重用的模板片段,它们就像是乐高积木,可以组合成更大的模板,一个网站的每个页面都有相同的页眉和页脚,你就可以将它们创建成独立的组件,然后在所有主模板中引用,当需要修改页眉时,只需修改这一个组件文件即可,所有引用它的页面都会自动更新。

- 文件位置: 通常位于
components/目录下。 - 作用: 实现代码复用,提高维护效率。
header.html,footer.html,news_box.html等。
c. 数据
数据是网站的实际内容,例如文章标题、正文、产品描述等,在 Siteweaver 中,数据通常存储在 SQLite 数据库中,Siteweaver 通过数据库查询获取这些数据,然后将其传递给模板进行渲染。
- 存储: 主要是一个
siteweaver.db的 SQLite 数据库文件。 - 结构: 数据库中包含多个表,如
pages(页面),articles(文章),links(链接) 等。
模板语法
Siteweaver 6.8 使用 Template Toolkit (TT) 作为其模板引擎,它的语法与 Template Toolkit 高度兼容,以下是最常用和最核心的语法:
a. 变量输出
使用 [% variable %] 来输出变量的值。
<h1>[% page.title %]</h1> <p>发布于: [% page.created %]</p>
这里的 page.title 和 page.created 是由 Siteweaver 在处理页面时传入模板的变量对象。

b. 控制结构
可以使用 IF/ELSE/UNLESS 和 FOREACH 等逻辑结构。
IF 条件判断:
[% IF user.is_logged_in %]
<p>欢迎, [% user.name %]! <a href="/logout">退出</a></p>
[% ELSE %]
<p><a href="/login">请登录</a></p>
[% END %]
FOREACH 循环: 假设你有一个文章列表需要显示。
<div class="news-list">
[% FOREACH article IN articles %]
<div class="news-item">
<h2><a href="[% article.url %]">[% article.title %]</a></h2>
<p class="summary">[% article.summary %]</p>
</div>
[% END %]
</div>
c. 包含组件
使用 INCLUDE 标签来引入并渲染一个组件。
[% INCLUDE header.html %]
<!-- 页面主要内容 -->
<div class="content">
[% content %] <!-- 这里的 content 变量通常由 Siteweaver 根据请求的页面自动填充 -->
</div>
[% INCLUDE footer.html %]
d. 过滤器
使用 符号对变量应用过滤器,进行格式化处理。
<!-- 格式化日期 -->
<p>发布日期: [% page.created | html %]</p> <!-- html 过滤器会转义 HTML 特殊字符,防止 XSS 攻击 -->
<!-- 如果没有标题,则显示默认值 -->
<h1>[% page.title | default('无标题页面') %]</h1>
<!-- 截取摘要,只显示前100个字符 -->
<p>[% article.content | truncate(100) %]</p>
模板工作流程
一个典型的 Siteweaver 页面请求处理流程如下:
- 用户请求: 用户在浏览器中输入一个 URL,
http://example.com/about。 - URL 解析: Siteweaver 的 Web 服务器(如 Apache + mod_perl)接收到请求,并根据配置规则(通常是
.htaccess)将请求转发给 Siteweaver 脚本。 - 数据库查询: Siteweaver 脚本分析请求的路径(
/about),在数据库的pages表中查找对应的记录,假设它找到了一个slug为about的页面。 - 数据准备: 脚本从数据库中提取该页面的所有信息,如标题、内容、创建时间等,并将其组织成一个数据结构(通常是 Perl 的哈希引用)。
- 模板选择: 脚本确定要使用哪个模板文件来渲染这个页面,这个选择可能是硬编码在页面配置中,也可能是根据页面类型或 URL 规则动态决定的,所有“文章”页面可能都使用
templates/article.html。 - 模板处理: 脚本调用 Template Toolkit 引擎,将准备好的数据(作为
stash或context传递)和选定的模板文件article.html一起进行处理。 - 标签替换: 引擎扫描模板文件,找到所有
[% %]标签,并根据传入的数据替换它们。[% page.title %]会被替换成数据库中“关于我们”的实际标题。 - 生成 HTML: 处理完成后,引擎生成一个完整的、纯 HTML 输出。
- 响应返回: 脚本将这个 HTML 响应发送回用户的浏览器,浏览器将其渲染成用户看到的最终页面。
如何开始创建或修改模板?
如果你要为 Siteweaver 6.8 创建或修改模板,可以遵循以下步骤:
- 备份: 在进行任何修改之前,务必备份你的
templates/目录和数据库siteweaver.db。 - 理解现有结构: 浏览你的
templates/目录,了解现有的模板文件是如何组织的,通常会有一个default.html或master.html作为主模板,其他模板会INCLUDE它。 - 修改组件: 如果只是想更改页眉、页脚或导航栏,最简单的方法是直接编辑对应的组件文件(如
header.html)。 - 修改主模板: 如果需要更改整体布局(从三栏布局改为两栏布局),你需要编辑主模板文件(如
default.html)。 - 创建新模板:
- 在
templates/目录下创建一个新的 HTML 文件,contact.html。 - 在文件中使用
[% INCLUDE ... %]来引用你的组件。 - 使用
[% content %]或其他变量来放置动态内容。 - 在 Siteweaver 的管理后台(如果有的话)或数据库中,为这个新模板创建一个对应的页面记录,并将其模板字段指向
contact.html。
- 在
- 测试: 每次修改后,都要在浏览器中预览效果,确保一切正常。
Siteweaver 6.8 的模板系统是一个成熟、灵活且易于维护的解决方案,它的核心优势在于关注点分离,通过 模板、组件 和 数据 的紧密配合,使得网站开发和管理变得高效而清晰,对于熟悉 HTML 和一点逻辑编程的人来说,上手 Siteweaver 的模板定制并不困难。
