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 复制。 全量复制看起来省事,实际有三个坏处:
- 升级冲突——Discuz! 升级时你无法区分「这是我改的」和「这是从旧版拷来的旧文件」,合并时一片混乱。
- 版本漂移——复制来的文件停留在复制那一刻的版本,官方修了 bug 你这边不会自动跟上。
- 心智负担——目录里全是自己不认识的代码,出问题很难定位。
正确的做法是:先建空套系,然后按需求逐个把要改的文件从 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 取,自己新增的文件直接新建。
建完套系后的三件事
- 在后台切换到新套系,确认页面没有报错。有报错说明你复制过来的文件引用的路径不对。
- 更新缓存,让新套系的模板全部重新编译,否则混用的还是旧缓存。
- 至少访问几个主要页面:首页、版块列表、主题列表、主题详情、门户页、移动端页面。套系只覆盖了部分文件时,页面是「一半你的、一半 default 的」,这种混合状态最容易在某个角落暴露问题。
下一步
套系目录建起来了,文件也能覆盖了,但开发过程中还有两个拦路虎:进不去「设计新模板」入口,以及改完看不到效果。1.4 节把这两件事讲透。
