之前一直想要了解Typecho插件开发的相关知识,本文将就自己开发的Github小插件来介绍如何开发一款简单的插件。

本文会简单介绍插件实现原理相关的内容来帮助大家理解,但由于篇幅限制不会过于深入探究。如果后续有机会将逐步整理Typecho的插件机制的博文。

其实Typecho中本身就包含了一个基础的插件原型Hello World。这个插件的功能非常直观,就是在管理面板的导航栏中显示配置的一句话。程序开发当中最快的学习方法就是根据一个模板案例来修改,这次我们也是如此。

找到typecho代码树种的HelloWorld插件,插件文件夹目录是typecho/usr/plugins/HelloWorld

进入目录我们可以看到这个简单插件仅包含Plugin.php 单个源文件。这对我们来说是巨大的福音,只有一个文件,更加便于梳理结构。更让人高兴的是,这里面居然还只有一个类Plugins 实现了PluginInterface 接口。那么我们的阅读思路就很明确了,先看PluginInterface 中声明的接口,然后再看源码中的实现来了解插件的工作机制。

从下面的源代码可以看到接口中分别提供了activate, deactivate, config, personalConfig 等四个函数分别用于激活、禁用、管理面板配置和个人用户配置等功能。插件只需要实现说到的四个函数,其余的系统的插件机制会为我们管理。

/**
 * 插件接口
 *
 * @package Plugin
 * @abstract
 */
interface PluginInterface
{
    /**
     * 启用插件方法,如果启用失败,直接抛出异常
     *
     * @static
     * @access public
     * @return void
     */
    public static function activate();

    /**
     * 禁用插件方法,如果禁用失败,直接抛出异常
     *
     * @static
     * @access public
     * @return void
     */
    public static function deactivate();

    /**
     * 获取插件配置面板
     *
     * @param Form $form 配置面板
     */
    public static function config(Form $form);

    /**
     * 个人用户的配置面板
     *
     * @param Form $form
     */
    public static function personalConfig(Form $form);
}

再去看HelloWorld 这个插件的实现。由于这是个管理面板的插件,因此并没有实现个人用户的配置。我们后续写插件大概率也用不到,因为暂时只考虑单用户的博客。而禁用插件时也不需要做什么特殊操作,因此我们需要关注的仅有activateconfig 两个函数。

先来看activate函数,也非常的精炼,将类中的定义的render 函数注册到管理菜单的navBar 接口上。在插件启用后,渲染管理页面的菜单栏是就会调用插件中的render 函数。

紧接着我们就去看render 函数到底都做了些什么事情,不难发现这个函数里也只做了意见事情,就是向浏览器写入了一个<span> 标签。值得注意的是,这个标签显示的内容还是动态的,来自于Options::alloc()->plugin('HelloWorld')->word

那么这个word 是哪来的呢?还记得我们的config函数吗?在那里定义了一个插件的配置,而word 对象正与我们设置的文本输入框的名称对应。在插件机制中所有config 中配置的设置都会在加载调用插件前被加载到Options::alloc() 这个配置类中方便调用。

/**
 * Hello World
 *
 * @package HelloWorld
 * @author qining
 * @version 1.0.0
 * @link http://typecho.org
 */
class Plugin implements PluginInterface
{
    /**
     * 激活插件方法,如果激活失败,直接抛出异常
     */
    public static function activate()
    {
        \Typecho\Plugin::factory('admin/menu.php')->navBar = __CLASS__ . '::render';
    }

    /**
     * 禁用插件方法,如果禁用失败,直接抛出异常
     */
    public static function deactivate()
    {
    }

    /**
     * 获取插件配置面板
     *
     * @param Form $form 配置面板
     */
    public static function config(Form $form)
    {
        /** 分类名称 */
        $name = new Text('word', null, 'Hello World', _t('说点什么'));
        $form->addInput($name);
    }

    /**
     * 个人用户的配置面板
     *
     * @param Form $form
     */
    public static function personalConfig(Form $form)
    {
    }

    /**
     * 插件实现方法
     *
     * @access public
     * @return void
     */
    public static function render()
    {
        echo '<span class="message success">'
            . htmlspecialchars(Options::alloc()->plugin('HelloWorld')->word)
            . '</span>';
    }
}

总结

开发一个Typecho 插件的基本要素

  1. 实现PluginInterface 中的接口
  2. 在插件的激活函数中,将功能函数绑定到对应的句柄回调上,可以使用的功能见:Typecho插件接口及功能列表
  3. 实现在功能函数中使用到的必要配置参数设置表单

参考链接

Typecho插件接口及功能列表