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

siteweaver 6.8 模板
(图片来源网络,侵删)

Siteweaver 6.8 的模板系统主要由以下几个部分组成:


核心概念:模板、组件 和数据

理解这三个概念是掌握 Siteweaver 模板的关键。

a. 模板

模板是定义页面最终外观的文件,它们是普通的 HTML 文件,其中嵌入了特殊的 Siteweaver 标签(通常用 [% %] 包围),当用户访问一个页面时,Siteweaver 会读取对应的模板文件,解析其中的标签,并用动态数据替换它们,最终生成并输出纯 HTML 给用户的浏览器。

  • 文件位置: 通常位于服务器的 templates/ 目录下。
  • 作用: 定义页面的“骨架”,如页头、页脚、导航栏、内容区域等。

b. 组件

组件是可重用的模板片段,它们就像是乐高积木,可以组合成更大的模板,一个网站的每个页面都有相同的页眉和页脚,你就可以将它们创建成独立的组件,然后在所有主模板中引用,当需要修改页眉时,只需修改这一个组件文件即可,所有引用它的页面都会自动更新。

siteweaver 6.8 模板
(图片来源网络,侵删)
  • 文件位置: 通常位于 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.titlepage.created 是由 Siteweaver 在处理页面时传入模板的变量对象。

siteweaver 6.8 模板
(图片来源网络,侵删)

b. 控制结构

可以使用 IF/ELSE/UNLESSFOREACH 等逻辑结构。

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 页面请求处理流程如下:

  1. 用户请求: 用户在浏览器中输入一个 URL,http://example.com/about
  2. URL 解析: Siteweaver 的 Web 服务器(如 Apache + mod_perl)接收到请求,并根据配置规则(通常是 .htaccess)将请求转发给 Siteweaver 脚本。
  3. 数据库查询: Siteweaver 脚本分析请求的路径(/about),在数据库的 pages 表中查找对应的记录,假设它找到了一个 slugabout 的页面。
  4. 数据准备: 脚本从数据库中提取该页面的所有信息,如标题、内容、创建时间等,并将其组织成一个数据结构(通常是 Perl 的哈希引用)。
  5. 模板选择: 脚本确定要使用哪个模板文件来渲染这个页面,这个选择可能是硬编码在页面配置中,也可能是根据页面类型或 URL 规则动态决定的,所有“文章”页面可能都使用 templates/article.html
  6. 模板处理: 脚本调用 Template Toolkit 引擎,将准备好的数据(作为 stashcontext 传递)和选定的模板文件 article.html 一起进行处理。
  7. 标签替换: 引擎扫描模板文件,找到所有 [% %] 标签,并根据传入的数据替换它们。[% page.title %] 会被替换成数据库中“关于我们”的实际标题。
  8. 生成 HTML: 处理完成后,引擎生成一个完整的、纯 HTML 输出。
  9. 响应返回: 脚本将这个 HTML 响应发送回用户的浏览器,浏览器将其渲染成用户看到的最终页面。

如何开始创建或修改模板?

如果你要为 Siteweaver 6.8 创建或修改模板,可以遵循以下步骤:

  1. 备份: 在进行任何修改之前,务必备份你的 templates/ 目录和数据库 siteweaver.db
  2. 理解现有结构: 浏览你的 templates/ 目录,了解现有的模板文件是如何组织的,通常会有一个 default.htmlmaster.html 作为主模板,其他模板会 INCLUDE 它。
  3. 修改组件: 如果只是想更改页眉、页脚或导航栏,最简单的方法是直接编辑对应的组件文件(如 header.html)。
  4. 修改主模板: 如果需要更改整体布局(从三栏布局改为两栏布局),你需要编辑主模板文件(如 default.html)。
  5. 创建新模板:
    • templates/ 目录下创建一个新的 HTML 文件,contact.html
    • 在文件中使用 [% INCLUDE ... %] 来引用你的组件。
    • 使用 [% content %] 或其他变量来放置动态内容。
    • 在 Siteweaver 的管理后台(如果有的话)或数据库中,为这个新模板创建一个对应的页面记录,并将其模板字段指向 contact.html
  6. 测试: 每次修改后,都要在浏览器中预览效果,确保一切正常。

Siteweaver 6.8 的模板系统是一个成熟、灵活且易于维护的解决方案,它的核心优势在于关注点分离,通过 模板组件数据 的紧密配合,使得网站开发和管理变得高效而清晰,对于熟悉 HTML 和一点逻辑编程的人来说,上手 Siteweaver 的模板定制并不困难。