3.1 插件变量与通用配置界面

让插件的配置项由系统托管,你只写取值的那几行。

先判断:通用程序够不够用

Discuz! 的插件接口自带一个通用插件配置管理程序。它把常见的参数配置需求(填个文字、选个开关、勾几个选项)用统一表单收集起来,存进系统表,再同步进系统缓存。

对绝大多数插件来说这就是默认方案——相当于快递柜,柜子尺寸是标准件,你的东西合身就直接塞进去。只有通用程序确实表达不了你的配置形态,才退回自写「扩展项目 管理中心」。官方措辞是「通常情况下应优先使用通用插件配置管理程序,只有在通用程序确实无法实现时才自行编写后台管理模块」。

你的需求 该走哪条路
一个值,填了就生效 通用变量配置
一组枚举值,选一个 通用变量配置(单选/下拉/多选)
每个版块或用户组填不同值 通用变量配置(X5 增强类型)
表单里要嵌自定义表格或色盘 X5 设置项组件,挂到通用变量上
要点「测试连接」再决定能否提交 自写「扩展项目 管理中心」

后台操作路径:从插件列表到变量配置

  1. 后台 → 顶部菜单「插件」→「插件列表」,找到目标插件;
  2. 点该插件一行的「详情」,进入详细设置页;
  3. 找到变量配置这一块,点「添加」或点已有变量名进入编辑;
  4. 填配置名称(给站长看的标题)、变量名(程序里用的键,规则同 PHP 变量)、选配置类型;
  5. 点变量前的「详情」,继续编辑说明文字、默认值、排序、扩展参数。

配置名称和变量名是两件事:名称是给站长看的,可以写中文、随时改;变量名写进代码里,一旦有代码在读,改名等于把所有取值点一起掀翻,建议一次定好。

硬前提一条:只有把插件设为「可用」,这些设置才生效。停用状态下变量不参与缓存,代码里读到的是空值。

变量类型怎么选

后台可选类型以你的实际后台为准,常见的是下面这些。X5.0 补了「按版块/按用户组分别设置」的一组增强类型,思路是从「一个插件一份配置」升级成「一个插件多份配置」。

类型 站长看到的控件 典型用途
文本 单行输入框 接口地址、密钥、昵称前缀
多行文本 文本域 公告模板、提示语、代码片段
数字 数字输入框 每页条数、保留天数、积分数额
开关 单个勾选框 是否记录日志、是否走异步
单选(radio) 一组单选钮 显示模式、排序方式(选项写 extra 里)
多选(checkbox) 一组勾选框 允许的板块类型、启用的功能模块
下拉(select) 下拉菜单 数量很大的枚举,如分类列表
版块选择 板块树选择器 插件作用范围限定在某几个版
用户组选择 用户组多选 哪些组能看到插件入口

X5.0 的增强类型配置时以「版块面板」或「用户组面板」展开,站长按版块逐个填:groups(用户组多选)、group_text、group_textarea(按用户组设文本/多行文本)、forum_text、forum_textarea(按版块设文本/多行文本)。

插件里怎么把值读出来

变量值不用查数据库。系统已经把插件配置缓存好了,你要做的是先加载缓存,再按路径取。

<?php

if(!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

// 嵌入点插件和以 plugin.php 为主脚本调用的插件,系统已自动加载过缓存
loadcache('plugin');

// 普通类型:$_G['cache']['plugin'][插件标识][变量名]
$points = isset($_G['cache']['plugin']['myplugin']['checkin_points'])
    ? intval($_G['cache']['plugin']['myplugin']['checkin_points']) : 10;

// 开关类读到的是 '1' / '0',用 intval 转一下再用
$enabled = !empty($_G['cache']['plugin']['myplugin']['log_enabled']);

这段放在 source/plugin/myplugin/myplugin.inc.php 或任意被调用的 .func.php 里。每次要用现取,别把整个 $_G['cache']['plugin'] 拷进局部变量——那里面是这个站所有插件的全部配置。

按版块、按用户组的变量存放位置不一样,这是最容易踩的地方:

变量类型 读取路径
普通变量 $_G['cache']['plugin'][标识][变量名]
版块类变量 $_G['cache']['forums'][fid]['plugin'][变量名]
用户组类变量 $_G['cache']['usergroup_groupid'][groupid]['plugin'][变量名]
用户组类变量(当前用户视角) $_G['group']['plugin'][变量名]

缓存读取相对直接查数据库,资源消耗几乎可以忽略。但前提是配置走通用程序存进 pluginvars 表;若你自写后台模块把参数存进自己的表,系统缓存就看不到。

什么时候才该自写「扩展项目 管理中心」

三种情况值得自写:配置之间有依赖;需要异步校验(填了 AppKey 后点按钮去对方接口探活);需要列表型操作(批量导入、批量重算、手动跑任务)——最后一种本就不是「配置」,是管理功能。

自写时脚本以 .inc.php 结尾放在插件目录,模板是固定文件名、放在 template/ 子目录、与脚本同名。在后台模块里选「扩展项目 管理中心」,它会出现在后台插件栏目下。注意:即使模块上设了使用等级,程序内部仍需自行校验权限,外部模块只是引用你的程序,不会替你拦人。

X5.0:模板变量是同一套机制的另一张脸

X5.0 新增模板变量机制——模板自带后台配置页,不必再挂插件承载参数。它完全复刻插件变量机制,变量类型一致,只是入口在「模板 → 设计」而非「插件 → 详情」。

两处细节插件变量这边同样适用:新增的标题栏(给一组设置项加小标题,把长表单切成几段)和分组(多页切换;用了分组之后,显示顺序第一个项目必须是分组类型,否则表单错位)。还有一条:显示顺序设为负数的变量会被隐藏,站长看不到也改不了,适合放应用内部用的开关或版本标记。两边值得互相借鉴。

X5 的两个扩展:隐藏变量与设置项组件

配置在版块、用户组面板且变量名以 fields_ 开头的变量,值会存进 X5.0 新增的 JSON 类型 fields 字段,而不是散成一个个独立列。内置类型仍表达不了的,可写设置项组件:文件放在 source/plugin/{标识}/admin/component/,文件名以 component_ 开头,插件变量和模板变量里都能直接选用。到这一步,还坚持要自写管理模块的门槛已经很高了。