我们以友情链接插件为例讲解
首先我们看到上面引用及命名空间,不多介绍,照猫画虎就行。
### 接下来首先我们要写上插件的相关信息,放到info这个数组中
包括name【全部名称字母表示并且小写】,title【插件名称,可为中文】
description【插件描述】,status【一般为1,表示可用】,author【作者信息】
version【版本号】
### 接下来是$admin\_list
如果你在后台需要展示插件的数据,或者有相关的增删改查操作,则需要配置该数组,数组中配置需要显示的字段及对应名称。下面还可以设置如何排序,模型使用的是什么
### 接下来我们需要设置的就是
public $custom\_adminlist = 'adminlist.html';
表示后台显示用插件自身的模板,而不是系统提供的通用后台插件模板
adminlist.html这个文件也存在于插件目录,后面我们会说到这个文件。
现在我们就要写上安装和卸载方法了,默认在插件安装时,如果不需要安装数据库,可以直接return true;如果需要安装数据库,那么我们就需要按照友情链接插件的这种写法,并且在插件根目录放instal.sql文件。
#### **这时候需要特别强调一点:**
如果默认你的插件时没有钩子的,又不想去手动添加钩子,这时候我们需要填上一句话
> $this->getisHook('juan', $this->info\['name'\], $this->info\['description'\]);
可以看到第一个参数就是我们的钩子名称,后面的是我们的插件名称和描述。
如果钩子名称使用了“juan”,那么我们在安装和卸载插件后,必须要有个function juan()这个方法作为插件钩子方法来在前台调用。
**也就是hook('juan')**
**\### 强调的另外一个问题就是卸载方法。**
如果你想在卸载插件的时候就卸载插件的数据库,那么就在插件根目录放上一个uninstall.sql,里面放上sql语句,如``DROP TABLE IF EXISTS`ea_superlinks`;
如果你不想在卸载时删除插件已经存在的各类数据,毕竟数据不易。那么在卸载方法里直接填写return true 也是可以的。
我们现在重点说一下钩子方法的写法和重要性。
我们都知道,前台可以放钩子的地方很多,可以放在控制器里作为一种功能代码使用,也可以放在模板html的文件中做为一种展示使用。
如果是作为展示,那么我们就需要像友情插件这种,在钩子里最后写上 echo $this->tplfetch('widget'); 来调用插件模板,这个模板文件就存在view这个文件夹里。
widget表示文件名称。如果不需要展示,而是写在控制器和其他方法里调用,那么就无需写上这句话,直接处理相关的数据即可。
例如:$data=hook('forumattach',array('content'=>$data\['content'\],'id'=>$forum->id));
这就是说 ,我们可以在钩子forumattach这个方法中处理后面这个数组,然后再返回去$data。
~~~
namespace addons\superlinks;
use app\common\controller\Addon;
use Think\Db;
use Think\Config;
/**
* 合作单位插件
* @author 李二狗
*/
class superlinks extends Addon
{
public $info = array(
'name' => 'superlinks',
'title' => '友情链接',
'description' => '友情链接',
'status' => 1,
'author' => 'liergou',
'version' => '0.1'
);
public $admin_list = array(
'listKey' => array(
'title' => '站点名称',
'type' => '类型',
'status' => '显示状态',
'level' => '优先级',
'create_time' => '创建时间',
),
'model' => 'superlinks',
'order' => 'level desc,id asc'
);
public $custom_adminlist = 'adminlist.html';
public function install()
{
$db_config = array();
$db_config['prefix'] = Config::get('database.prefix');
$dirname=dirname(__FILE__);
$sqldata = file_get_contents($dirname. '/install.sql');
$sql_array=preg_split("/;[\r\n]+/", str_replace('ea_',$db_config['prefix'],$sqldata));
foreach ($sql_array as $k => $v) {
if (!empty($v)) {
Db::query($v);
}
}
return true;
}
public function uninstall()
{
$db_config = array();
$db_config['prefix'] = Config::get('database.prefix');
$dirname=dirname(__FILE__);
$sqldata = file_get_contents($dirname. '/uninstall.sql');
$sql_array=preg_split("/;[\r\n]+/", str_replace('ea_',$db_config['prefix'],$sqldata));
foreach ($sql_array as $k => $v) {
if (!empty($v)) {
Db::query($v);
}
}
return true;
}
//实现的pageFooter钩子方法
public function friendLink($param)
{
$list = Db::name('superlinks')->where('status = 1')->order('level desc,id asc')->select();
foreach($list as $key=>$val){
if($val['type'] == 1){//图片连接
$list[$key]['savepath'] = get_cover($val['cover_id'],'savepath');
}
}
$this->assign('list', $list);
$this->assign('link', $param);
echo $this->tplfetch('widget');
}
}
~~~