<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 三、插件開發 一、插件的安裝卸載機制介紹 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、插件到這里基本就算開發完成了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看