# 四、模塊開發教程
1.模塊的安裝卸載機制介紹
OC的模塊安裝機制目前來說比較簡單,暫時只支持本地模塊的安裝卸載。
如果要能夠被OC識別并允許安裝卸載。開發人員需要遵守以下約定。
目錄結構約定:
模塊文件放置在
/Application下
每一個模塊的目錄結構如下
以Issue(專輯)模塊為例
/Conf 配置文件 config.php 模塊配置文件
/Controller 控制器
IndexController 模塊入口控制器
IssueController 模塊管理后臺控制器
/Info 模塊信息
info.php 模塊信息
install.sql 模塊安裝sql
uninstall.sql 模塊卸載sql
/Model 業務模型
IssueModle.class.php Issue模塊
/Static 靜態資源存放
/css
/js
/View 模板文件
/defalut
/Index
index.html 模塊首頁模板
/Public
/Widget
ueditormini.html UeditorMini編輯器小部件模板
/Widget 小部件Widget
UeditorMiniWidget.class.php UeditorMini編輯器小部件控制器
模塊的生命周期:
1.安裝模塊
2.使用模塊
3.卸載模塊
安裝模塊
此步驟涉及到/Info/info.php
<?php
return array(
//模塊名
'name' => 'Issue',
//別名
'alias' => '專輯',
//版本號
'version' => '1.0.0',
//是否商業模塊,1是,0,否
'is_com' => 0,
//是否顯示在導航欄內? 1是,0否 暫時無效,保留項
'show_nav' => 1,
//模塊描述
'summary' => '專輯模塊,適用于精品內容展示',
//開發者
'developer' => '嘉興想天信息科技有限公司',
//開發者網站
'website' => 'http://www.ourstu.com',
//前臺入口,可用U函數
'entry' => 'Issue/index/index',
//后臺入口
'admin_entry' => 'Admin/Issue/contents',
//zui中的icon-xxx的小圖標,此處為icon-th
'icon' => 'th',
//是否允許卸載,核心模塊請設為0
'can_uninstall' => 1
);
上面代碼定義了專輯模塊的模塊信息,顯示在模塊管理中的內容為
可以點擊安裝按鈕執行安裝。
安裝的過程就是導入/Info/install.sql這個數據表。
安裝成功后,左側模塊列表中會多出一個模塊。圖標就是info.php中的th。鏈接地址就是Admin/Issue/contents
卸載模塊
同時可以通過卸載按鈕卸載文件。
卸載模塊其實就是執行了uninstall.sql這個操作。
2.模塊的開發
OC中多模塊的開發實際上和普通的TP模塊開發是一致的。這邊主要介紹一下OC中的一些機制,這些機制會大大降低開發成本。
<?php
namespace Admin\Controller;
use Admin\Builder\AdminConfigBuilder;
use Admin\Builder\AdminListBuilder;
use Admin\Builder\AdminTreeListBuilder;
class IssueController extends AdminController
{
protected $issueModel;
function _initialize()
{
$this->issueModel = D('Issue/Issue');
parent::_initialize();
}
public function config()
{
$admin_config = new AdminConfigBuilder();
$data = $admin_config->handleConfig();
$admin_config->title('專輯基本設置')
->keyBool('NEED_VERIFY', '投稿是否需要審核','默認無需審核')
->buttonSubmit('', '保存')->data($data);
$admin_config->display();
}
public function issue()
{
//顯示頁面
$builder = new AdminTreeListBuilder();
$attr['class'] = 'btn ajax-post';
$attr['target-form'] = 'ids';
$attr1 = $attr;
$attr1['url'] = $builder->addUrlParam(U('setWeiboTop'), array('top' => 1));
$attr0 = $attr;
$attr0['url'] = $builder->addUrlParam(U('setWeiboTop'), array('top' => 0));
$tree = D('Issue/Issue')->getTree(0, 'id,title,sort,pid,status');
$builder->title('專輯管理')
->buttonNew(U('Issue/add'))
->data($tree)
->display();
}
}
3.管理后臺菜單的創建
模塊在被安裝之后,會自動在左側菜單創建一個入口(要求模塊的配置信息中admin_entry不為空),這個入口是不需要菜單機制配合的。系統會自動添加。
但是,開發者在開發后臺管理界面的時候往往需要用到側欄菜單,這就需要開發者手動創建一些菜單來實現這個功能。為了兼容原生的菜單機制,我們采用了如下的變通方法來實現側欄菜單。
1.針對某個模塊創建一個隱藏的頂級菜單項,一般命名為模塊名稱。如Issue里,我們先要創建一個如圖所示的頂級菜單項(這一步必不可少)
創建菜單的入口為 用戶-》權限(分組)-》菜單-》新增
圖中鏈接是默認的一個地址,建議和模塊的后臺管理入口一致,是否隱藏設為是,如果不設為是,就會在頂部欄多出一個入口
2.創建頂級菜單項之后再創建二級菜單。
上述創建的菜單會在側欄菜單產生這么一個菜單項
在菜單管理的過程中,我們有以下兩點建議,也算是開發過程中的一些經驗總結。
1.對于有表單的頁面,強烈建議提交到當前頁面,再用IS_POST去判斷是表單提交還是普通的展示表單。
此建議好處在于可以少創建一個菜單來專門用于權限處理。不需要為展示表單和處理表單創建兩個權限節點。
2.對于一些ajax操作,必須為相應ajax操作的action創建對應的隱藏節點來處理權限。
因為OC中,后臺的權限默認是用菜單來實現綁定,所以一些隱藏的菜單項實際上就是一個權限節點的存在。
如果開發者不針對一些ajax請求訪問的action去創建隱藏菜單的話,很容易出現給了某些管理員的列表頁面的管理權限之后卻沒有操作的權限。
3.用AdminConfigBuilder創建一個配置頁面
在日常研發中,開發人員難以避免地要創建一些管理頁面,比較常見的就是配置頁面,這類頁面的創建,OC提供了一套簡單的方案。也就是很多OC開發達人一直在用的的AdminBuilder系列類庫。
這邊就不詳講這個類庫了,詳細的大家看手冊吧。我這邊就講一下一般的ConfigBuilder的用法。
考慮到Issue模塊的ConfigBuilder太過簡單,這邊我以OpenSNS的新版首頁模塊Home為例,講一個較為復雜的Config。
1).創建代碼文件
這邊涉及到一個知識點,就是模塊的AdminController的一個內部約定,遵守這個約定可以讓模塊的文件更加聚合,但如果你不遵守,同樣也能實現功能,缺點就是文件不聚合。
方法一、不遵守約定,我們首先要在Admin模塊的Controller里創建一個HomeController,這個Controller務必需要繼承AdminController,因為有很多東西要處理,AdminContoller會自動處理。
方法二、遵守約定,我們在Home模塊的Controller里創建一個HomeController,同樣繼承自AdminController。
知識點
方法一的定義和方法二的代碼文件必須一致。文件內容完全不受文件位置影響。
這邊再額外廢話一句,為什么放在不同的位置結果都是一樣的呢?因為OC做了一個重定向,方法一種,文件就在AdminController下,這是最符合后臺的機制的方式。但是,OC考慮到模塊文件的聚合,提出了方法二,方法二實現原理就是在Admin模塊的EmptyController的empty方法里,去做了檢測,如果發現訪問的頁面不存在,就會去實例對應模塊的對應Controller的對應action。
這邊以Home為例
index.php?s=/admin/home/config.html
上面這個Url按照傳統方式,定位點為Application/Admin/Controller/HomeController.class.php的config()方法
按照方法二的存放方式,系統會發現這個定位點不存在。接下來系統會嘗試去實例Application/Home/Controller/HomeController.class.php的config()方法,如果存在就調用。
實際上,方法二只是把文件移動到了Home模塊下,讓所有的文件都放到這個模塊里,增強模塊內聚。
文件創建好了之后,我們就需要寫內部實現代碼了。
2).書寫代碼
基本結構
namespace Admin\Controller;
use Admin\Builder\AdminConfigBuilder;
class HomeController extends AdminController{
public function config() {
}
}
命名空間采用Admin\Controller,原因上面講過了。
use只是為了引入AdminConfigBuilder下面備用。
接下來,我們實例化一個AdminConfigBuilder。
代碼
1 $builder = new AdminConfigBuilder();
定義管理頁面的標題,調用builder的title方法
1 $builder->title('首頁設置');
到這里。頁面基本框架已經構建好了。
直接訪問index.php?s=/admin/home/config.html顯示如圖
接下來,我們開始加入各種配置項。
通過加入這些代碼,我們能創建一個如圖所示的配置頁面
$builder->keySingleImage('LOGO', 'Logo圖標', '此處不同于網站信息內的LOGO,只在首頁顯示');
$builder->keyRadio('OPEN_LOGIN_PANEL', '開啟登陸面板', '關閉則不顯示登陸面板', array(1 => '開啟', 2 => '關閉'));
$builder->keyText('ENTER_URL', '隨便看看Url','不填則隱藏此按鈕,不留入口,支持形如weibo/index/index之類的tp寫法和http://等常規寫法');
$builder->keyEditor('SUMMARY', '導語', '頂部導語,用一句話來介紹你的網站');
$builder->group('內容設置', 'LOGO,SUMMARY,OPEN_LOGIN_PANEL,ENTER_URL');
首先,我們要明確,在builder里面,我們一般會用keyXXX的函數來創建頁面的表單元素。
1 $builder->keySingleImage('LOGO', 'Logo圖標', '此處不同于網站信息內的LOGO,只在首頁顯示');
上面這條代碼,是創建一個單圖上傳,第一個參數是表單元素的name,也就是提交到后臺的表單鍵名,第二個參數是在頁面中顯示的字段標題,第三個是輔助文字。
此類的方法有很多。這邊就不祥解了。著重提一提group()方法。
group()方法可以實現對配置項的分組,這個方法有兩種定義方式。
1 public function group($name,$list = array())
1 public function groups($list = array())
第一種,只能定義一個配置項分組
第二種能實現多個配置項分組的同時定義
如
1 $builder->group('內容設置', 'LOGO,SUMMARY,OPEN_LOGIN_PANEL,ENTER_URL');
就定義了一個配置項分組——內容設置,其下有LOGO,SUMMARY,OPEN_LOGIN_PANEL,ENTER_URL這幾個key。
以此類推。我們可以定義多個配置項分組。
代碼結構
$builder->keyXXX();
$builder->keyXXX();
$builder->group();
---------組1--------
$builder->keyXXX();
$builder->keyXXX();
$builder->group();
---------組2--------
$builder->keyXXX();
$builder->keyXXX();
$builder->group();
---------組3--------
最后,我們還需要加入一個保存按鈕。保存按鈕使用代碼創建就是
1 $builder->buttonSubmit();
最后的最后,我們還需要展示這個界面
1 $builder->display();
好了。大功告成。