Typecho 文档:如何获取插件中 personalConfig 的表单值?
适用程序:Typecho
程序版本:1.2.1
文档作者:Lopwon
作者博客:Lopwon.com
发布页面:Lopwon.com/attachment/3946/
许可方式:CC BY-NC-SA
注意:此文档源于作者在博客改造中的一些经验总结,转载还请署名。
敬告:此文档操作涉及程序核心文件的修改,作者不对你在使用中产生的任何问题造成的不良后果,承担责任。
文档说明
在制作 Typecho 插件时,文件 Plugin.php 有一项标记为「个人用户的配置面板」的 personalConfig
静态方法,极少或甚至从未被用来实现功能需求,本文档尝试将其用起来。
使用方法
在 Plugin.php 中 personalConfig
和 config
一样,也是通过新增表单将数据添加到数据库中,以默认插件 HelloWorld 为例,在 personalConfig
新增表单:
public static function personalConfig(Form $form)
{
$name = new Text('word', null, 'Hello World', _t('说点什么'));
$form->addInput($name);
}
当启用插件后,后台》控制台》个人设置,在最下方会新增以上所添加的表单项,同时,数据库表 *_options
会添加两行新数据:
// 第一条
name: plugin:HelloWorld
user: 0
value: a:1:{s:4:"word";s:11:"Hello World";}
// 第二条
name: _plugin:HelloWorld
user: 0
value: a:1:{s:4:"word";s:11:"Hello World";}
其中,名称 name 为 plugin:HelloWorld 即是与 config 中的表单相关的数据;而名称 name 有前缀下划线的 _plugin:HelloWorld 即是与 personalConfig 中的表单相关的数据。
其中,用户 user 为 0 表示角色为(管理员)的(含博主和用户)可操作该插件,比如启用、禁用,以及插件配置。
其中,值 value 为序列化后的表单数据,表单名 word 及表单值 Hello World
当博主新增用户(或开启用户注册),且有用户(如 name=Snapic
且 uid=2
)进入个人设置面板,重新编辑保存该表单后(如:将默认值 Hello World
修改为 Hello Snapic
),数据库表 *_options
会添加一行新数据:
// 第三条
name: _plugin:HelloWorld
user: 2
value: a:1:{s:4:"word";s:12:"Hello Snapic";}
其中,用户 user 为 2 即是该用户的 uid 值,如果是博主编辑保存表单后,则会新增 user 为 1 的行数据。
其中,值 value 中的 Hello Snapic 即是该用户重新编辑保存的表单值。
也就是说,不同用户编辑保存了各自的个人设置面板的表单后,会在数据库中添加属于自己的数据信息。那么,可以将此功能应用在多用户博客的展示个人资料的场景中。
返回主题,如何获取 personalConfig
的表单值,以便在前端输出呢?
获取 config
的表单值通常为:
use Utils\Helper;
echo Helper::options()->plugin('HelloWorld')->word;
或
use Widget\Options;
echo Options::alloc()->plugin('HelloWorld')->word;
而获取 personalConfig
的表单值,似乎不能使用以上的方式。作者在另一篇文档中,曾经介绍过如何「判断插件是否有设置项」,所以,可以使用相同的方式获取:
use Utils\Helper;
$value = Helper::options()->{ '_plugin:HelloWorld' }; // 获取到的是序列化后的数据,注意 plugin 有前缀下划线
或
use Utils\Helper;
$value = Helper::options()->__get('_plugin:HelloWorld'); // 获取到的是序列化后的数据,注意 plugin 有前缀下划线
反序列化后取值
$value = unserialize($value);
echo $value['word'];
需要注意的是,如果禁用插件,会导致所有用户个人设置中所新增表单的数据,全部丢失!请先备份!