5.6. 插件配置

大多数插件都需要或多或少的配置信息从而可以工作,比如系统自带的 支付宝、财付通 支付插件,需要你配置相应的 parterId, partnerKey 才能正常工作。关于设置信息,我们有 2 个问题需要关心,第一这些配置信息保存在哪里? 第二我们如何修改这些配置信息?这一章节就是向你展示 bzfshop 是如何支持插件的配置信息的。

这一章节的例子程序 Example3 在这里 下载

5.6.1. 代码结构

照例我们还是展示一下 Example3 的代码结构,这样你能比较清晰的看出整个代码的框架结构。

图 5.5. 插件Example3目录结构

插件Example3目录结构

从上面的图可以看出,主要代码分成了 2 部分,分别在 manage 和 shop 目录下,这表明这两部分代码分别是提供给 manage 系统和 shop 系统使用的。

5.6.2. 配置信息

插件的 config.php 文件里面包含了插件所用到的所有配置信息,这里我们可以看到增加了一个插件自定义的配置 "header_notice_message" 用于设置一个提示信息,这个提示信息将会用于显示在页面上。

<?php

/**
 * @author QiangYu
 *
 * 这里我们返回插件缺省配置
 *
 */
return array(

    // 插件基本信息
    'version'               => '1.0.0',
    'display_name'          => 'Example3',
    'description'           => <<<DESC
<p>开发商:棒主妇开源</p>
<p>主&nbsp;&nbsp;页:<a href="http://www.bzfshop.net" target="_blank">www.bzfshop.net</a></p>
<p>适用系统:shop</p>
<p>这是一个插件例子,我们实现了插件的配置信息,用户可以通过插件管理来配置这些信息</p>
<p>前台 Shop 扩充了一个访问地址</p>
<ul>
<li>/Example/Goods/View?goods_id=42107</li>
</ul>
DESC
,
    // 这里是插件自定义的配置信息
    'header_notice_message' => '这里是配置的提示消息',
);

现在请你安装好这个插件,然后访问 http://…/Example/Goods/View?goods_id=42107 这里你应该能看到插件输出的页面,头部多了一段我们配置的信息。

图 5.6. 插件Example3输出页面

插件Example3输出页面

上图显示的头部信息就是我们配置的信息,来自于配置 header_notice_message

bzfshop 安装插件 的时候会把 config.php 中的信息写入到数据库中(bzf_meta 表),之后插件运行的时候使用的其实是数据库中保存的值,不再是 config.php 中的值了。所以你可以配置修改数据库中的值而不需要去动 config.php。你现在可以用 phpmyadmin 执行 SQL 语句select * from bzf_meta where meta_key like '%header_notice_message%'; 你就能看到数据库中的记录了。

在数据库中你看到的是 6f8d77b2ff7f814b357adafd5409f6ab_header_notice_message ,为什么会是这么奇怪的名字呢? bzfshop 可能有很多的插件,或许另外有一个插件也有一个配置选项叫做 "header_notice_message",这样两个插件的的配置信息都保存到数据库里面,名字岂不是冲突了? bzfshop 考虑到了这一点,所以每个插件都要定义自己的 protected static $pluginUniqueId = '61D3ECD6-69C1-4954-A44A-241E0C19CC14'; ,而 bzfshop 会根据这个 $pluginUniqueId 来生成一个前缀加在每个配置选项前面保证它们不会冲突。

[注意]

config.php 中的配置信息会在 "插件安装的时候" 被写入到数据库中,之后我们使用的都是数据库中的配置,不再是 config.php 中的值了。

5.6.3. 修改配置

插件主题 → 插件管理 里面你应该已经看到了插件的配置按钮,如下图:

图 5.7. 插件Example3配置进入

插件Example3配置进入

点击配置你就能进入配置界面修改 "header_notice_message" 的值了。

这个配置的插件实现在 plugin_load.php 文件中,注意下面的代码:

        public function pluginGetConfigureUrl($system)
        {
            // manage 后台 插件配置的 URL
            return RouteHelper::makeUrl('/Example/Example3/Configure');
        }


        public function pluginAction($system)
        {
            // 为 manage 系统加载运行环境
            if (PluginHelper::SYSTEM_MANAGE === $system) {
                return $this->doManageAction();
            }

            // 为 shop 系统加载运行环境
            if (PluginHelper::SYSTEM_SHOP === $system) {
                return $this->doShopAction();
            }

            return false;
        }


        /**
         * 为 manage 系统设置插件运行环境
         */
        private function doManageAction()
        {
            // 获取当前插件的根地址
            $currentPluginBasePath = dirname(__FILE__);

            // code 目录加入到 auto load 的路径中,这样系统就能自动做 class 加载
            SystemHelper::addAutoloadPath($currentPluginBasePath . '/manage/Code');

            // 增加 smarty 的搜索路径,这样才能找到我们的模板
            global $smarty;
            $smarty->addTemplateDir($currentPluginBasePath . '/manage/Tpl/');

            // 设置路由,这样就能访问到我们的代码了
            SystemHelper::addRouteMap(
                '/Example/Example3/Configure',
                'Controller\Example\Example3\Configure'
            );

            return true;

            return true;
        }

首先注意到 pluginAction() 中我们对 PluginHelper::SYSTEM_MANAGE === $system manage 系统做了特别的配置。看 doManageAction() 里面,非常类似对 shop 的设置,也是 设置代码路径、设置 smarty 模板,增加 URL 映射,不同的是我们指向的代码是 Plugin/Example3/manage/Code 下的代码。所以目录结构中你看到的 manage 目录下面保存的其实就是配置系统的代码。

另外注意到 public function pluginGetConfigureUrl($system) 返回了配置程序的 URL,这样 bzfshop 才知道当前插件提供了配置功能,可以通过这个 URL 进入配置程序。

总结一下插件提供配置功能:

  • 插件在 pluginAction() 中为 manage 设置好运行环境
  • 插件在 pluginGetConfigureUrl() 中返回配置程序 URL
  • bzfshop 根据上面的信息就会展示插件的配置功能了