4.2 模板变量:给模板配一个后台设置页
模板自带后台参数配置页,不用再为几个开关单写一个插件。
4.2.1 为什么这是件大事
X3.5 时代模板想给站长留几个可调项只有两条路:写死,或配一个插件。哪怕只想暴露一个「首页显示多少条主题」的数字,也得建目录、写 XML 清单、定义类、装到后台去。一个模板作者干十遍这件事,就会开始怀疑人生。
X5.0 把插件变量的整套机制直接搬进了模板。模板变量完全复刻插件变量机制——变量类型、填写方式、校验方式都一样,只是入口从插件列表挪到了模板列表。你会写插件变量,就会写模板变量。
4.2.2 开启开发者模式
默认看不到模板的「设计」按钮。先在 config/config_global.php 末尾加一行:
<?php
$_config['plugindeveloper'] = 1;
保存后进 admin.php 点「更新缓存」。后台会多出「设计新插件」「设计新模板」这类入口,模板列表每行后面也多了「设计」按钮。
| 配置值 | 后台表现 |
|---|---|
未设置或 0 |
看不到任何设计入口 |
1 |
出现设计入口,模板列表有「设计」按钮 |
2 |
额外在页面源码输出钩子标记,用来查预定义钩子 |
顺带一个技巧:把值改成 2 并更新缓存,任意页面源码里搜索钩子标记,就能看到当前版本所有钩子点在哪。查钩子最快的办法,不用翻文档。
4.2.3 变量类型
类型与插件变量完全一致,下面这张表在插件变量页和模板变量页都适用:
| 类型 | 用途 | 典型场景 |
|---|---|---|
| 文本 | 单行输入 | 网站副标题、备案号 |
| 多行文本 | 多行输入 | 首页公告、页脚说明 |
| 单选 | 多个选项选一个 | 布局方式、开闭开关 |
| 多选 | 勾选若干项 | 首页展示哪些区块 |
| 下拉 | 长列表中选择 | 绑定某个版块作数据源 |
| 单选(图片) | 用图片当选项 | 换 logo、换配色缩略图 |
| 颜色 | 取色器 | 强调色、链接色 |
| 开关 | 一个勾选框 | 是否开启某功能 |
| 数字 | 带范围限制的数字 | 显示条数、缓存时长 |
最常搞混的是「单选」和「开关」:只有「是/否」两种状态就用开关,要在三个以上具名方案之间挑才用单选。
4.2.4 布局分类:标题栏与分组
X5.0 新增了两个布局分类,这是模板变量区别于老插件变量的地方。
标题栏,给多个设置项加个小标题,纯视觉分组,不参与逻辑。变量多了以后,站长不至于看到一长条毫无层次的输入框。
分组,做多页切换,页签形式。这里有条硬性规则:顺序第一个项目必须是分组类型。不遵守后台页面会渲染错位。
4.2.5 实录:设计一个带标题栏和分组的模板变量
假设做一个资讯类模板,需要站长配置站点信息、首页展示、控制项三块内容。
进 admin.php,界面 → 模板,找到模板点「设计」按钮进入变量页,然后按下面顺序添加:
| 步骤 | 类型 | 名称与设置 |
|---|---|---|
| 1 | 分组 | 命名「基础设置」,必须排第一 |
| 2 | 标题栏 | 「站点信息」,挂在分组下 |
| 3 | 文本 | 变量名 sitetitle,标题「站点副标题」,说明「显示在浏览器标题和页头横幅右侧」 |
| 4 | 标题栏 | 「首页展示」,同分组下 |
| 5 | 数字 | newsthnum,标题「首页主题条数」,范围 5 到 30,默认 10 |
| 6 | 单选 | homelayout,标题「首页布局」,选项:列表式(默认)、卡片式、瀑布流 |
| 7 | 分组 | 命名「进阶控制」,排在第二位 |
| 8 | 开关 | showqrcode,标题「页脚显示二维码」,默认关闭 |
| 9 | 数字 | cachepage,标题「页面缓存秒数」,范围 0 到 3600,默认 0 |
保存后第一个页签「基础设置」下有「站点信息」和「首页展示」两个小标题,各自挂一组输入项;第二个页签「进阶控制」下是开关和数字框。
4.2.6 模板里怎么读
取值和普通配置项一致,通过 $_G['setting'] 访问:
<!-- template/你的标识/common/header.htm -->
<div class="header-title">
<h1>{$_G[siteinfo][name]}</h1>
{if $_G[setting][sitetitle]}
<span class="header-slogan">{$_G[setting][sitetitle]}</span>
{/if}
</div>
<!-- template/你的标识/common/footer.htm -->
{if $_G[setting][showqrcode]}
<div class="footer-qr">
<img src="qrcode.png" alt="QR" width="80" height="80" />
</div>
{/if}
{$_G[setting][sitetitle]} 这种写法比写成点号保险,变量名跟某个函数名撞了也不会出问题。
数字类变量建议做一次兜底,避免站长把值填到超限:
// 放在模板渲染前的 PHP 上下文里,或直接在模板里判断
$newsnum = isset($_G['setting']['newsthnum']) && $_G['setting']['newsthnum'] > 0
? min(30, intval($_G['setting']['newsthnum']))
: 10;
4.2.7 导出 XML 与版本标记
变量配置会随模板一起导出成 XML,站长装完直接能配,不需要额外步骤。后台 模板 → 选中模板 → 导出,下载的 XML 里变量定义都在。
你可以在 XML 的 style 分支下写 version 节点,标记模板版本变化,系统据此判断风格文件需不需要重建缓存:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<style>
<styleid>1</styleid>
<name>资讯模板</name>
<version>1.2.0</version>
</style>
<template>
<name>资讯模板</name>
<identifier>news</identifier>
<copyright>你的团队</copyright>
<version>X5.0</version>
<var>
<title>站点副标题</title>
<description>显示在浏览器标题和页头横幅右侧</description>
<extra></extra>
</var>
</template>
</root>
4.2.8 收尾检查清单
- 开发者模式已开且缓存已更新,「设计」按钮能点开。
- 分组类型的项目排在第一位。
- 每个变量都有标题和说明文字,数字变量都设了范围和默认值。
- 模板里读取时都用
isset或默认值兜底。 - 导出的 XML 里变量齐全,
version已更新。
模板变量这条路走通后,模板就能脱离插件独立交付了。但还有件事挡着出海站点:中文写死在模板里,换英文得改一堆文件。下一节讲模板语言包与 i18n 多语言扩展。
