# 三、插件開發
一、插件的安裝卸載機制介紹
OpenSNS的插件支持云市場在線安裝和本地安裝。
如果要能夠被OpenSNS識別并允許安裝卸載。開發人員需要遵守以下約定。
目錄結構約定:
插件文件放置在
/Addons 下
每一個插件的目錄結構如下
以CheckIn(簽到)插件為例
CheckIn
Controller //控制器目錄,有URL訪問的時候才需要,可選
CheckInController.class.php //插件控制器,名字可以不和插件名一樣
Model //插件的Model
CheckInModel.class.php
Static
images //放置插件所需用到的圖片
js // 插件js文件放置的文件夾
css //插件的css文件放置的文件夾
View //插件的模版文件
default
CheckIn
ranking.html
checkin.html //插件模板頁面,一般直接放在插件的目錄下。這里放在了View文件夾下。
rank.html
CheckInAddon.class.php //插件定義和實現的文件,必須有!!
config.php // 插件的配置文件
插件的生命周期:
1.安裝插件
2.使用插件
3.卸載插件
安裝插件
用管理員帳號打開網站后臺->云市場->插件管理->未安裝;從中找到《簽到》插件。
點擊安裝按鈕進行安裝。提示安裝成功則表示插件已經安裝成功,此時可以在已安裝的選項卡中找到《簽到》插件
安裝成功后,鉤子擺放的位子將會出現簽到的組件。如下:
卸載插件
用管理員帳號打開網站后臺->云市場->插件管理->已安裝;從中找到《簽到》插件。
點擊卸載按鈕提示“卸載成功”則表示插件已經成功卸載。如之后不再使用該插件可以刪除插件目錄下相關文件。
二、插件的開發----以簽到插件為例
1、設計插件,并創建鉤子。如“簽到”插件所需用到的鉤子有 checkIn、rank、handleAction
2、 在Addons下創建插件文件夾并命名插件名字為 CheckIn
3、創建插件的定義和實現文件,與插件名字同名,即CheckInAddon.class.php
4、編寫插件信息,以及安裝和卸載的方法。如下
<?php
namespace Addons\CheckIn;
use Common\Controller\Addon;
/**
簽到插件
@author 嘉興想天信息科技有限公司
*/
class CheckInAddon extends Addon
{
/**
插件的信息,必須。
*/
public $info = array(
'name' => 'CheckIn', //插件的英文名
'title' => '簽到', //插件的中文名
'description' => '簽到插件', //插件的描述
'status' => 1, //插件的狀態
'author' => 'xjw129xjt(肖駿濤)', //插件的作者
'version' => '0.1' //插件的版本號
);/**
插件的安裝方法。不需要創建任何表則直接return true;
*/
public function install()
{
$prefix = C("DB_PREFIX");
D()->execute("DROP TABLE IF EXISTS {$prefix}checkin ");
D()->execute(<<<SQL
CREATE TABLE IF NOT EXISTS {$prefix}checkin (
id int(11) NOT NULL AUTO_INCREMENT,
uid int(11) NOT NULL,
create_time int(11) NOT NULL,
PRIMARY KEY ( id )
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
SQL
);D()->execute(<<<SQL
ALTER TABLE {$prefix}member ADD con_check INT NOT NULL DEFAULT '0',
ADD total_check INT NOT NULL DEFAULT '0';
SQL
);return true;
}
/**
插件的卸載方法。不需刪除任何表則直接返回 true。
*/
public function uninstall()
{$prefix = C("DB_PREFIX");
D()->execute("DROP TABLE IF EXISTS {$prefix}checkin ");D()->execute(<<<SQL
ALTER TABLE {$prefix}member
DROP con_check ,
DROP total_check ;
SQL
);
return true;
}
// 接下去編寫鉤子的實現方法。
}
5、繼續編寫鉤子對應的實現方法。在CheckInAddon.class.php文件中。如下
public function checkIn($param)
{
$model = $this->checkInModel();
$uid = is_login();
$check = $model->getCheck($uid);
$this->assign('check', $check);
$this->assignDate();
$html = $this->rank('today');
$this->assign('html', $html);
$this->display('View/checkin');
}
private function checkInModel()
{
return D('Addons://CheckIn/CheckIn');
}
public function rank($type)
{
$time = get_some_day(0);
$rank = S('check_rank_' . $type . '_' . $time);
if (empty($rank)) {
$model = $this->checkInModel();
$rank = $model->getRank($type);
S('check_rank_' . $type . '_' . $time, $rank, 300);
}
$this->assign('rank', $rank);
$this->assign('type', $type);
$this->assign('type_ch', $type == 'con' ? '連簽' : '累簽');
$html = $this->fetch('View/rank');
return $html;
}
private function assignDate()
{
$week = date('w');
switch ($week) {
case '0':
$week = '周日';
break;
case '1':
$week = '周一';
break;
case '2':
$week = '周二';
break;
case '3':
$week = '周三';
break;
case '4':
$week = '周四';
break;
case '5':
$week = '周五';
break;
case '6':
$week = '周六';
break;
}
$this->assign('day', date('Y.m.d'));
$this->assign('week', $week);
}
public function doCheckIn()
{
$time = get_some_day(0);
$uid = is_login();
$model = $this->checkInModel();
$memberModel = D('Member');
$check = $model->getCheck($uid);
if (!$check) {
$model->addCheck($uid);
$memberModel->where(array('uid' => $uid))->setInc('total_check');
$model->checkYesterday($uid);
clean_query_user_cache($uid, array('con_check', 'total_check'));
S('check_rank_today_' . $time, null);
S('check_rank_con_' . $time, null);
S('check_rank_total_' . $time, null);
return true;
} else {
return false;
}
}
public function handleAction($param)
{
$config = $this->getConfig();
if (!empty($config['action'])) {
$action_info = M('Action')->getByName($config['action']);
if ($action_info['id'] == $param['action_id']) {
$res = $this->doCheckIn();
if ($res) {
$param['log_score'] .= '簽到成功!';
return $res;
}
}
}
return false;
}
6、編寫對應Controller、Model、和模版。與模塊相似。
與模塊不同的地方有:
(1)調用Controller:模塊中調用Controller用U()函數,在插件中用addons_url();
(2)調用Model:在插件中調用Model 需要在D()函數中寫明資源等信息,如: D('Addons://CheckIn/CheckIn');即為實例化Addons下的CheckIn插件中的CheckInModel;
(3)模版的渲染與模塊相同。
7、插件的配置文件的編寫
<?php
return array(
'action'=>array(
'title'=>'簽到綁定行為:',
'type'=>'select',
'options'=>get_option(),
)
);
/**
以下為調用函數。配置文件的主體為以上的數組
*/
function get_option(){
$opt = D('Action')->getActionOpt();
$return = array(0=>'不綁定');
foreach($opt as $v){
$return[$v['name']] = $v['title'];
}
return $return;
}
數組的每個鍵都對應一個form表單。鍵名就是配置里會顯示的表單名。title是字段前面的標識字。type是form標準的type。然后有多個選項的會有options鍵和值是相應選項的數組。值里每個鍵是選項的value后面的值是顯示的label文字。value字段是該表單項的默認值。 tip是表單項后面的提示文字。
支持Group分組 : 每個group里值options就是多個配置分組tab。然后分組顯示名是其title。然后options里是每個配置的復合數組。那個寫法和之前單獨的配置一樣。
用 同步登錄插件的配置文件做展示,如下:
<?php
return array(
'type'=>array(
'title'=>'開啟同步登陸:',
'type'=>'checkbox',
'options'=>array(
'Qq'=>'Qq',
'Sina'=>'Sina',
'Weixin'=>'Weixin',
),
),
'meta'=>array(//配置在表單中的鍵名 ,這個會是config[title]
'title'=>'接口驗證代碼:',//表單的文字
'type'=>'textarea', //表單的類型:text、textarea、checkbox、radio、select等
'value'=>'', //表單的默認值
'tip'=>'需要在Meta標簽中寫入驗證信息時,拷貝代碼到這里。'
),
'bind'=>array(//配置在表單中的鍵名 ,這個會是config[title]
'title'=>'是否開啟帳號綁定:',//表單的文字
'type'=>'radio', //表單的類型:text、textarea、checkbox、radio、select等
'options'=>array(
'1'=>'是',
'0'=>'否',
),
'value'=>'0',
'tip'=>'不開啟則跳過與本地帳號綁定過程,建議審核時關閉綁定。'
),
'group'=>array(
'type'=>'group',
'options'=>array(
'Qq'=>array(
'title'=>'QQ配置',
'options'=>array(
'QqKEY'=>array(
'title'=>'QQ互聯APP ID:',
'type'=>'text',
'value'=>'',
'tip'=>'申請地址:http://connect.qq.com',
),
'QqSecret'=>array(
'title'=>'QQ互聯APP KEY:',
'type'=>'text',
'value'=>'',
'tip'=>'申請地址:http://connect.qq.com',
)
),
),
'Sina'=>array(
'title'=>'新浪配置',
'options'=>array(
'SinaKEY'=>array(
'title'=>'新浪App Key:',
'type'=>'text',
'value'=>'',
'tip'=>'申請地址:http://open.weibo.com/',
),
'SinaSecret'=>array(
'title'=>'新浪App Sercet:',
'type'=>'text',
'value'=>'',
'tip'=>'申請地址:http://open.weibo.com/',
)
),
),
'Weixin'=>array(
'title'=>'微信配置',
'options'=>array(
'WeixinKEY'=>array(
'title'=>'微信App Key:',
'type'=>'text',
'value'=>'',
'tip'=>'申請地址:https://open.weixin.qq.com/',
),
'WeixinSecret'=>array(
'title'=>'微信App Sercet:',
'type'=>'text',
'value'=>'',
'tip'=>'申請地址:https://open.weixin.qq.com/',
)
),
)
)
)
);
8、插件到這里基本就算開發完成了。