typecho插件编写教程7 - Helper类

此文本来发表于个人博客 老高的技术博客 ,欢迎和老高交流!php


Helper类为咱们封装了不少与插件有关的操做,而且所有是公共静态方法,好比获取系统配置、添加路由、添加面板等功能,是开发插件必不可少的工具。html

插件帮手将默认出如今全部的typecho发行版中.所以你能够放心使用它的功能, 以方便你的插件安装在用户的系统里.web

Helper类的注释已经写的很清楚了,老高在此仅挑几个经常使用的方法讲讲。ajax

获取配置

php# 获取系统配置
Helper::options();

# 获取指定插件配置
Helper::options()->plugin('BaiduSubmit');

# 获取当前插件配置
Helper::options()->plugin(str_replace('_Plugin','',__CLASS__));

路径安全

用于生成安全的URL,带有token验证,若是牵扯到action等核心操做时会用到。系统在验证请求是会用到$this->widget('Widget_Security')->protect()去验证来源token。安全

php$s = Helper::security();
echo $s->index('/');

# 输出相似 http://www.phpgao.com/?_=ce4a9617aa228bb85ba696c9ba9784be

强行删除某插件

此方法用于卸载插件失败时的替补方法,老高通常将此方法写入HELLO_WORLD插件的render方法里,这样刷新如下后台,出问题的插件就被卸载了。typecho

Helper::removePlugin('BaiduSubmit');

路由增删

若是你的插件须要给系统添加一个新的路由,那么此方法就能派上用场!工具

路由表保存在表 typecho_options 中的 routingTable中。post

好比老高的插件BaiduSubmit,就用此方法为系统添加了一个http://yourweb/baidu_sitemap.xml的路由。this

/**
 * 增长路由
 *
 * @access public
 * @param string $name 路由名称
 * @param string $url 路由路径
 * @param string $widget 组件名称
 * @param string $action 组件动做
 * @param string $after 在某个路由后面
 * @return integer
 */
Helper::addRoute('baidu_sitemap', '/baidu_sitemap.xml', 'BaiduSubmit_Action', 'sitemap');

不要忘记在卸载的时候调用Helper::removeRoute('baidu_sitemap');删除刚才添加的路由!url

Action

有心的同窗应该可以发现,后台发送文章的form表单的action地址为相似http://web/action/contents-post-edit?_=xxx,这个连接表示什么意思呢?请听老高分解!

Action是typecho中的一类操做,它对应一条特殊的路由/action/,也就是路由表中的$table[0]['do'],具体内容以下

php[do] => Array
(
        [url] => /action/[action:alpha]
        [widget] => Widget_Do
        [action] => action
        [regx] => |^/action/([_0-9a-zA-Z-]+)[/]?$|
        [format] => /action/%s
        [params] => Array
            (
                [0] => action
            )

    )

从路由表可以看出,下一步咱们须要找到类Widget_Do。咱们能在该类中找到系统默认的action对应关系!

phpprivate $_map = array(
        'ajax'                      =>  'Widget_Ajax',
        'login'                     =>  'Widget_Login',
        'logout'                    =>  'Widget_Logout',
        'register'                  =>  'Widget_Register',
        'upgrade'                   =>  'Widget_Upgrade',
        'upload'                    =>  'Widget_Upload',
        'service'                   =>  'Widget_Service',
        'xmlrpc'                    =>  'Widget_XmlRpc',
        'comments-edit'             =>  'Widget_Comments_Edit',
        'contents-page-edit'        =>  'Widget_Contents_Page_Edit',
        'contents-post-edit'        =>  'Widget_Contents_Post_Edit',
        'contents-attachment-edit'  =>  'Widget_Contents_Attachment_Edit',
        'metas-category-edit'       =>  'Widget_Metas_Category_Edit',
        'metas-tag-edit'            =>  'Widget_Metas_Tag_Edit',
        'options-discussion'        =>  'Widget_Options_Discussion',
        'options-general'           =>  'Widget_Options_General',
        'options-permalink'         =>  'Widget_Options_Permalink',
        'options-reading'           =>  'Widget_Options_Reading',
        'plugins-edit'              =>  'Widget_Plugins_Edit',
        'themes-edit'               =>  'Widget_Themes_Edit',
        'users-edit'                =>  'Widget_Users_Edit',
        'users-profile'             =>  'Widget_Users_Profile'
    );

由此映射关系咱们知道,当咱们须要发布文章的时候(contents-post-edit),就去调用Widget_Contents_Post_Edit的action方法便可。

当咱们要添加action对应关系的时候,就能够调用Helper:addAction()执行添加,系统就会添加一条'new_action' => 'some_action'

新增的动做保存在表 typecho_options 中的 actionTable中。

须要提醒的是,当咱们添加一条action后,须要让其实现类some_action实现Widget_Interface_Do的接口,即必须有实现public function action(),不然调回失败。

同route同样,在卸载插件时不要忘了移除action!

菜单 & 面板

这个很好理解,再也不赘述。

手动配置

当咱们须要更自由的配置功能时,能够在Plugin.php文件中添加public static function configHandle($config)方法,当后台保存插件设置的时候就会调用此方法而不是默认的简单保存配置。

phphelper::configPlugin('BaiduSubmit', $config);

完!