概要

有时候我们需要一些功能而Typecho中没有我们想要的功能,但Typecho提供了插件化这个功能在源码中的usr/plugins目录中我们就可以通过编写Typecho插件来达到自己想要的功能。下面我们来从零开始编写我们的第一个Typecho插件吧!

一、文件结构和代码构造

首先编写插件需了解插件的文件结构和代码构造
编写一个插件只需要一个Plugin.php文件即可并没有文件结构,文件结构是我们自己定义的编写一个插件的时候如果所有代码都放在一起会感觉到很杂乱所以这时候我们就可以新建一个PHP文件来帮助我们把代码友好化。

二、HelloWorld源码分析

官方给了一个HelloWorld的插件样板我们来分析一下这个插件的构造在这个插件中只有一个Plugin.php没有其他的东西我们来打开这个文件进行分析
打开文件后有很多注释这是Typecho为了让我们看懂而编写的注释我们就按照他的注释来分析,印入眼帘的是下面这段代码

1
2
3
4
5
6
7
8
9
if (!defined('__TYPECHO_ROOT_DIR__')) exit; //这是判断目录是否定义固定就好
/**
* Hello World 插件的描述
*
* @package HelloWorld 插件的名称
* @author qining 发者名称
* @version 1.0.0 版本号
* @link http://typecho.org 开发者的网站,在插件点击开发者名称的时候会跳转至该网页
*/

其次是下面这段代码

1
class HelloWorld_Plugin implements Typecho_Plugin_Interface

这是编写的一个类这里注意的是类名必须是“插件名称_Plugin的格式来命名”这个类实现了Typecho_Plugin_Interface接口这个是插件接口
这个接口里面有几个我们需要实现的函数分别是

1
2
3
4
5
6
7
8
9
10
11


activate() //插件激活/开启的时候会调用此方法,在此方法中可以像后台添加自己的管理页面等服务
deactivate() //插件禁用/关闭的时候会调用,在此方法中可以添加移除面板等操作
config($form) //插件的配置页
personalConfig($form) //个人配置页
//以上的函数再开启插件或关闭插件的时候会自动调用,且所有函数必须都是静态的

//在active函数中有这段代码
Typecho_Plugin::factory('admin/menu.php')->navBar = array('HelloWorld_Plugin', 'render');
//这段代码的意思是当调用admin/menu中的navBar函数执行之前调用HelloWorld_Plugin类中的render即该类的render方法

接下来是config函数,这个函数与前面两个函数不一样的是他多了一个参数,因为是配置页面我们肯定得输入自己的配置信息嘛那么在哪里输入是关键好在有这么个参数可以让我们添加编辑框和按钮等控件才让我们顺利的填写了自己的配置信息。知道了他的用处该怎么用呢这里得说到Typecho_Widget_Helper_Form_Element这个类所有的控件都基于这个类而这个类也基于其他类这里我就不讲了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在typecho中提供了9个控件已经够我们所需了这九个控件分别是
Typecho_Widget_Helper_Form_Element_Checkbox //多选框
Typecho_Widget_Helper_Form_Element_Fake //虚拟域,暂不知道用处
Typecho_Widget_Helper_Form_Element_Hidden //隐藏域,有时候我们需要隐藏一些表单可以使用这个
Typecho_Widget_Helper_Form_Element_Password //密码框
Typecho_Widget_Helper_Form_Element_Radio //单选框
Typecho_Widget_Helper_Form_Element_Select //下拉选择框
Typecho_Widget_Helper_Form_Element_Submit //提交按钮
Typecho_Widget_Helper_Form_Element_Text //文本框
Typecho_Widget_Helper_Form_Element_Textarea //文本域

//我们可以通过new 来实例化一个控件如HelloWorld插件中的

$name = new Typecho_Widget_Helper_Form_Element_Text('word',
NULL, 'Hello World', _t('说点什么'));
$form->addInput($name);
//word是控件的id,NULL是选择项,Hello World是默认值,_t('说点什么')是表单的标题,还有一个参数是description 表单描述因为这些控件中实例化对象可以一个参数都不填或者只填几个参数不填默认是NULL
//$form是config的一个参数调用了addInput把该控件添加到页面上

还有一个render函数是自己写的一个输出能容的函数,这里主要讲一下下面这段代码

1
2
Typecho_Widget::widget('Widget_Options')->plugin('HelloWorld')->word
//首先Typecho_Widget::widget函数是用于获取组件类他有四个参数但这里我只讲第一个参数,除了第一个参数其他三个都是可选的,第一个参数是组件的别名根据别名获取组件上面代码中就是根据Widget_Options别名获取到对应的组件,在该组件中有一个plugin用于获取插件“HelloWorld”中所有的参数而word就是在前面active函数中word的id

HelloWorld插件的源码就分析到这了