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'] 访问:

&lt;!-- template/你的标识/common/header.htm --&gt;
&lt;div class="header-title"&gt;
    &lt;h1&gt;{$_G[siteinfo][name]}&lt;/h1&gt;
    {if $_G[setting][sitetitle]}
    &lt;span class="header-slogan"&gt;{$_G[setting][sitetitle]}&lt;/span&gt;
    {/if}
&lt;/div&gt;

&lt;!-- template/你的标识/common/footer.htm --&gt;
{if $_G[setting][showqrcode]}
&lt;div class="footer-qr"&gt;
    &lt;img src="qrcode.png" alt="QR" width="80" height="80" /&gt;
&lt;/div&gt;
{/if}

{$_G[setting][sitetitle]} 这种写法比写成点号保险,变量名跟某个函数名撞了也不会出问题。

数字类变量建议做一次兜底,避免站长把值填到超限:

// 放在模板渲染前的 PHP 上下文里,或直接在模板里判断
$newsnum = isset($_G['setting']['newsthnum']) && $_G['setting']['newsthnum'] &gt; 0
    ? min(30, intval($_G['setting']['newsthnum']))
    : 10;

4.2.7 导出 XML 与版本标记

变量配置会随模板一起导出成 XML,站长装完直接能配,不需要额外步骤。后台 模板 → 选中模板 → 导出,下载的 XML 里变量定义都在。

你可以在 XML 的 style 分支下写 version 节点,标记模板版本变化,系统据此判断风格文件需不需要重建缓存:

&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;root&gt;
    &lt;style&gt;
        &lt;styleid&gt;1&lt;/styleid&gt;
        &lt;name&gt;资讯模板&lt;/name&gt;
        &lt;version&gt;1.2.0&lt;/version&gt;
    &lt;/style&gt;
    &lt;template&gt;
        &lt;name&gt;资讯模板&lt;/name&gt;
        &lt;identifier&gt;news&lt;/identifier&gt;
        &lt;copyright&gt;你的团队&lt;/copyright&gt;
        &lt;version&gt;X5.0&lt;/version&gt;
        &lt;var&gt;
            &lt;title&gt;站点副标题&lt;/title&gt;
            &lt;description&gt;显示在浏览器标题和页头横幅右侧&lt;/description&gt;
            &lt;extra&gt;&lt;/extra&gt;
        &lt;/var&gt;
    &lt;/template&gt;
&lt;/root&gt;

4.2.8 收尾检查清单

  • 开发者模式已开且缓存已更新,「设计」按钮能点开。
  • 分组类型的项目排在第一位。
  • 每个变量都有标题和说明文字,数字变量都设了范围和默认值。
  • 模板里读取时都用 isset 或默认值兜底。
  • 导出的 XML 里变量齐全,version 已更新。

模板变量这条路走通后,模板就能脱离插件独立交付了。但还有件事挡着出海站点:中文写死在模板里,换英文得改一堆文件。下一节讲模板语言包与 i18n 多语言扩展。