Typecho 文档:如何获取插件中 personalConfig 的表单值?

03月04日

适用程序:Typecho
程序版本:1.2.1
文档作者:Lopwon
作者博客:Lopwon.com
发布页面:Lopwon.com/attachment/3946/
许可方式:CC BY-NC-SA

注意:此文档源于作者在博客改造中的一些经验总结,转载还请署名。

敬告:此文档操作涉及程序核心文件的修改,作者不对你在使用中产生的任何问题造成的不良后果,承担责任。

文档说明

在制作 Typecho 插件时,文件 Plugin.php 有一项标记为「个人用户的配置面板」的 personalConfig 静态方法,极少或甚至从未被用来实现功能需求,本文档尝试将其用起来。


使用方法

在 Plugin.php 中 personalConfigconfig 一样,也是通过新增表单将数据添加到数据库中,以默认插件 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=Snapicuid=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'];

需要注意的是,如果禁用插件,会导致所有用户个人设置中所新增表单的数据,全部丢失!请先备份!

Snapic Plus v5 Lopwon Hub