1.3 新建一个模板套系:从零到目录

> 十分钟搭出自己的套系骨架,只复制真正要改的文件。

先决定:值不值得建套系

建套系是有成本的——多一套文件要跟着升级走,多一份缓存要维护。所以先过一遍 1.2 节的判断:

你的需求 该做什么
换个 logo、换配色、换字号 建风格,不建套系
只改一两个页面的排版 建风格 + 用扩展 CSS
改整站导航结构、页脚布局 建套系
要给客户交付一套独立外观 建套系

确定要建,往下走。

后台一键创建

最省事的方式是走后台,路径是:后台 → 模板 → 设计新模板。

但这里有个前置条件——必须先开启开发者模式,否则菜单里看不到「设计新模板」这个入口。开启方法在 config/config_global.php 末尾加一行:

<?php
<!-- 该行写在 config_global.php 末尾,勿放进任何条件分支 -->
$_config['plugindeveloper'] = 1;

加完更新缓存、重新登录后台,模板页才会出现「设计」相关按钮。

然后填三个字段:

字段 含义 建议
name 模板名称,显示在后台和用户端 用中文写给人看
copyright 版权信息 写清楚作者与授权方式
identifier 唯一标识符,生成 template/{标识符}/ 目录 只能用字母数字下划线,一次定好不要改

identifier 是这里唯一有技术含量的字段。它必须是 PHP 变量合法的命名形式,且不能和 template/ 下已有目录重名。后台提交后,template/{identifier}/ 目录会自动生成,站点也识别出这是一个新套系。

为什么强调不能改名:目录名是套系在磁盘上的唯一身份,改名等于新建一个套系,你基于它做的所有风格设置、所配的 DIY 数据、扩展配色引用全部对不上。定名之前想清楚。

手写方式创建目录骨架

后台点一下只生成一个空目录,完整的骨架还得自己建。X5.0 的默认套系目录结构如下:

template/xxx/                     xxx 换成你的 identifier
├── common/                公共模板(header/footer 等)
├── forum/                 论坛页面模板
├── portal/                门户模板(diyxml 也放这里)
├── touch/                 手机版模板
├── style/                 扩展配色(如 style/t1/style.css)
├── cell/                  细胞模板({cell} 调用)
├── cells/                 细胞集合({cells} 调用)
└── i18n/                  多语言包(如 i18n/en/)

各个目录的职责和典型内容:

目录 放什么 什么时候你会碰它
common/ 页面公共部分,header、footer、导航 几乎必改,页头页脚
forum/ 版块、主题、帖子列表与详情页 改论坛主界面
portal/ 门户页面、文章页,以及 diyxml/ 做门户或 DIY
touch/ 手机版模板 做移动端适配
style/ 扩展配色 CSS 换配色
cell/ 最小封装单元,.htm,可多级目录 X5 新特性,封装逻辑
cells/ 多个 cell 的再封装,.htm 或 .php X5 新特性,开放 DIY
i18n/ 多语言扩展 做多语言站点

注意 cell/、cells/ 和 i18n/ 是 X5.0 才有的,X3.5 的套系里不存在这几个目录。portal/diyxml/ 下面还分页面组件(page/)和模块组件(module/)两个子目录,用来存放可导出的 DIY 组件。

继承:同名文件即覆盖

Discuz! 套系之间是隐式继承的,没有任何配置文件声明继承关系。规则只有一条:

你在自己的套系里放一个和 default 同名同路径的文件,系统就用你的;不放,就回落到 default 的。

所以套系的正常工作方式是「按需覆盖」,不是「整包复制」:

template/default/common/header.htm      ← 系统原版,绝大多数情况别动
template/xxx/common/header.htm          ← 你覆盖了 header,其他文件仍走 default
template/xxx/common/footer.htm          ← 你也覆盖了 footer

上面这个例子说明:你的套系只提供了两个文件,页面的其他部分(比如 forum/forumdisplay.htm)依然来自 default。这既是 Discuz! 套系的设计哲学,也是它升级 painless 的原因。

只复制你要改的文件

不要整个目录 cp -r 复制。 全量复制看起来省事,实际有三个坏处:

  1. 升级冲突——Discuz! 升级时你无法区分「这是我改的」和「这是从旧版拷来的旧文件」,合并时一片混乱。
  2. 版本漂移——复制来的文件停留在复制那一刻的版本,官方修了 bug 你这边不会自动跟上。
  3. 心智负担——目录里全是自己不认识的代码,出问题很难定位。

正确的做法是:先建空套系,然后按需求逐个把要改的文件从 default 复制过来作为起点,再改:

# 建好空套系后,只取需要改的三个文件
cp template/default/common/header.htm    template/xxx/common/header.htm
cp template/default/common/footer.htm    template/xxx/common/footer.htm
cp template/default/style/t1/style.css   template/xxx/style/t1/style.css

命令行一行写路径容易错,手动复制也一样。核心原则只有一条:覆盖文件从 default 取,自己新增的文件直接新建。

建完套系后的三件事

  1. 在后台切换到新套系,确认页面没有报错。有报错说明你复制过来的文件引用的路径不对。
  2. 更新缓存,让新套系的模板全部重新编译,否则混用的还是旧缓存。
  3. 至少访问几个主要页面:首页、版块列表、主题列表、主题详情、门户页、移动端页面。套系只覆盖了部分文件时,页面是「一半你的、一半 default 的」,这种混合状态最容易在某个角落暴露问题。

下一步

套系目录建起来了,文件也能覆盖了,但开发过程中还有两个拦路虎:进不去「设计新模板」入口,以及改完看不到效果。1.4 节把这两件事讲透。