PHPCMS V9 模組開發 二次開發例項 留言本
對於像我這樣的入門者希望先把上面這個文件仔細讀一遍再往下看!
宣告:我用的是GBK版本。
二次開發流程
- 建立資料庫和資料庫表(無資料庫操作可略過)
- 建立資料模型檔案
- 建立模組目錄
- 開發控制器和模板
- install和uninstall模組
一、建立資料庫表
具體需求請檢視上面的文件,不再贅述直接上SQL語句:
DROP TABLE IF EXISTS `guestbook`; CREATE TABLE IF NOT EXISTS `guestbook` (
`gid` smallint(5) NOT NULL AUTO_INCREMENT,
`siteid` smallint(5) NOT NULL,
`title` char(80) NOT NULL,
`content` text NOT NULL,
`reply` text NOT NULL,
`userid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`username` char(20) NOT NULL,
`passed` tinyint(1) unsigned NOT NULL DEFAULT '0',
`reply_status` tinyint(1) unsigned NOT NULL DEFAULT '0',
`addtime` int(10) unsigned NOT NULL DEFAULT '0',
`replyer` char(20) NOT NULL,
`replytime` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`gid`)
)DEFAULT CHARSET=utf8;
二、建立資料模型檔案
資料庫模型位於:phpcms/model/ 目錄下。資料模型檔案的命名規則建議為 '資料表名稱' + '_model.class.php' 。
這個模組中我們要使表“guestbook”,則資料庫模型檔名稱為'guestbook_model.class.php',程式如下:
<?php defined('IN_PHPCMS') or exit('No permission resources.'); pc_base::load_sys_class('model', '', 0); class guestbook_model extends model {public function __construct() { $this->db_config = pc_base::load_config('database'); $this->db_setting = 'default'; // 記得換成自己的表名 $this->table_name = 'guestbook'; parent::__construct(); } } ?>
說明:任何自定義模組的資料模型類,均繼承於model.class.php 資料模型基類。
在此基類中PHPCMS 系統已經把最常用的資料庫操作方法進行了封裝。 二次開發者不必關於如何操作資料庫,
只需要根據需要用到的,已定義操作方法的要求,傳遞引數即可。系統會自動對資料進行處理,並返回結果。
說白了就是對你自定義的資料表的包裝,更方便操作資料庫。
三、建立模組目錄
PHPCMS v9框架中的模組,位於phpcms/modules目錄中,每一個目錄稱之為一個模組。
如果要建立一個新模組,只要在 phpcms/modules 目錄下建立資料夾並放入你的控制器類就可以了。
當前我們要開發一個叫做guestbook的留言本模組,那麼首先在 phpcms/modules 目錄下建立資料夾,
並將其命名為guestbook。如下圖所示:
guestbook 模組的標準結構通常是這樣的,如下圖所示:
classes 為模組類資料夾
functions 為模組函式資料夾
templates 為模組模板資料夾,這裡通常放置含有許可權控制的控制器模板,也就是後臺模板!!!
如果您的模組有單獨的前臺模版,你需要在phpcms/templates/default下,
建立一個您的模組同名目錄來放置前臺模板(並進行配置,後面會說到),“default”為你的風格包名稱,我們預設適用default。
install和uninstall為模組安裝和解除安裝模組
四、開發控制器和模板
PHPCMS V9的控制器位於phpcms/modules/模組/目錄下面,不是classes目錄下。檔名是類名+.php,
例如一個名為guestbook的控制器,那麼他的命名為guestbook.php即可。控制器類預設繼承系統的函式庫,可以直接使用。
需要注意的是:控制器類的類名稱與控制器檔名必須相同。本留言本模組有以下二個控制器:
- 前臺index.php控制器開發
前臺控制器主要涉及前臺留言顯示、留言的提交處理等功能函式,以下為全部原始碼,程式碼如下所示:
<?php defined('IN_PHPCMS') or exit('No permission resources.'); class index { function __construct() { // 載入留言本的資料模型 $this->guestbook_db = pc_base::load_model('guestbook_model'); // 取得當前登入會員的會員名(username)和會員ID(userid) $this->_username = param::get_cookie('_username'); $this->_userid = param::get_cookie('_userid'); //定義站點ID常量,選擇模版使用 $siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : get_siteid(); define("SITEID", $siteid); //讀取配置 $setting = new_html_special_chars(getcache('guestbook', 'commons')); $this->set = $setting[SITEID]; } public function init() { //設定分頁條數 $pagesize = $this->set['pagesize']; $where = array('passed'=>1,'siteid'=>SITEID); $page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1; $infos = $this->guestbook_db->listinfo($where, 'gid DESC', $page, $pagesize); $infos = new_html_special_chars($infos); // 載入系統form類,用於前臺模組檔案中生成驗證碼 pc_base::load_sys_class('form', '', 0); // 載入前臺模板 include template('guestbook', 'index'); } /** * 線上留言 */ public function ly() { if(isset($_POST['dosubmit'])){ // 標題和內容不能為空 if (!(isset($_POST['ly']['title']) && trim($_POST['ly']['title']) && isset($_POST['ly']['content']) && trim($_POST['ly']['content']))) { showmessage(L('輸入不能為空'), "?m=guestbook&c=index&siteid=".SITEID); } // 驗證碼 if(isset($_POST['code'])){ /*V9驗證碼的數值是通過SESSION傳遞,故在這段程式碼中,首先載入配置檔案, 取出當前系統配置中SESSION的儲存方式。然後根據SESSION的儲存方式,來載入對應的系統類庫*/ $session_storage = 'session_'.pc_base::load_config('system','session_storage'); pc_base::load_sys_class($session_storage); if(!isset($_SESSION)) { session_start(); } $code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : showmessage(L('請輸入驗證碼'), HTTP_REFERER); if ($_SESSION['code'] != strtolower($code)) { showmessage(L('驗證碼錯誤'), HTTP_REFERER); } } $set = $this->set; $_POST['ly']['addtime'] = SYS_TIME; $_POST['ly']['userid'] = $this->_userid; $_POST['ly']['username'] = $this->_username; $_POST['ly']['siteid'] = SITEID; $_POST['ly']['passed'] = $set['check_pass']; $this->guestbook_db->insert($_POST['ly']); showmessage(L('新增成功'), "?m=guestbook&c=index&siteid=".SITEID); } else { echo '請通過正常的方式提交留言,謝謝'; } } } ?>
前臺模板
第三部分我們已經說了需要在phpcms/templates/default下建立一個'guestbook'目錄,在該目錄下再建立index.html檔案,其原始碼如下:
{if $this->set['guestbook_status']} <div class="box boxsbg cboxs"> <h5>我要留言 </h5> <div class="tag_a"> <form action="{APP_PATH}index.php?m=guestbook&c=index&a=ly&siteid={SITEID}" method="post" name="myform" id="myform"> <table cellspacing="1" cellpadding="0" class="table_form"> <tbody> <tr> <th>標題</th> <td><input type="text" value="" id="title" name="ly[title]" class="input-text"></td> </tr> <tr> <th>內容</th> <td> <textarea name="ly[content]" id="content" cols="5" rows="8" value="" style="width:400px;"></textarea> </td> </tr> {if $this->set['enablecheckcode']==1} <tr> <th>驗證碼:</th> <td> <input name="code" type="text" id="code"/>{form::checkcode('code_img','4','14',110,30)} </td> </tr> {/if} <tr> <th></th> <td> <input type="submit" value="提交" name="dosubmit" class="button"> <input type="reset" value=" 取消" name="reset" class="button"> </td> </tr> </tbody> </table> </form> </div> </div> <div style="height:5px;"></div> {/if} <?php if(is_array($infos)){ foreach($infos as $info){ ?> <div class="box boxsbg cboxs"> <h5>{$info['title']}</h5> <div class="tag_a"> {$info['content']} <br><br> {if $info['reply']}<font color=red>回覆內容:</font> <font style="color: #09F;">{$info['reply']}</font> {/if} </div> </div> <div style="height:5px;"></div> <?php }} ?>
開啟phpcms/templates/default/config.php , 進行以下兩處修改:
- 後臺guestbook.php控制器開發
後臺管理控制器含許可權控制,只有特定管理員才有許可權訪問,所以這個控制器需要載入admin 模組下的admin類,並繼承該類。程式碼如下:
<?php defined('IN_PHPCMS') or exit('No permission resources. - guestbook.php'); pc_base::load_app_class('admin', 'admin', 0); class guestbook extends admin { public function __construct() { parent::__construct();//繼承父類建構函式 $setting = new_html_special_chars(getcache('guestbook', 'commons'));//讀取留言本配置快取檔案 $this->set = $setting[$this->get_siteid()]; $this->guestbook_db = pc_base::load_model('guestbook_model');//載入留言本資料模型 } public function init() { $where = array('siteid'=>$this->get_siteid()); $page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1; $infos = $this->guestbook_db->listinfo($where, 'gid DESC', $page, '15'); /* 載入後臺管理模版 guestbook_list.tpl.php。 * 此檔案位於phpcms/modules/模組/templates/ * 由此即可明白,其它後臺管理模版亦位於此目錄*/ include $this->admin_tpl('guestbook_list'); } /* 未回覆列表 */ public function unreplylist() { $where = array('reply'=>'','siteid'=>$this->get_siteid()); $page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1; $infos = $this->guestbook_db->listinfo($where, 'gid DESC', $page, '15'); include $this->admin_tpl('guestbook_list'); } /** * 回覆留言 */ public function reply() { if(isset($_POST['dosubmit'])){ $gid = intval($_GET['gid']); if($gid < 1) return false; $_POST['reply']['replytime'] = SYS_TIME; $_POST['reply']['reply_status'] = '1'; $this->guestbook_db->update($_POST['reply'], array('gid'=>$gid)); showmessage(L('回覆成功'),'?m=guestbook&c=guestbook&a=init'); } else { $gid = intval($_GET['gid']); if($gid < 1) return false; $show_validator = $show_scroll = $show_header = true; $info = $this->guestbook_db->get_one(array('gid'=>$_GET['gid'])); if(!$info) showmessage(L('guestbook_exit'),'?m=guestbook&c=guestbook&a=init'); extract($info); // 載入後臺管理模版 guestbook_reply.tpl.php include $this->admin_tpl('guestbook_reply'); } } /** * 刪除留言 * @param intval $gid 留言ID,遞迴刪除 */ public function delete() { if((!isset($_GET['gid']) || empty($_GET['gid'])) && (!isset($_POST['gid']) || empty($_POST['gid']))) { showmessage(L('未選中'), HTTP_REFERER); } if(is_array($_POST['gid'])){ foreach($_POST['gid'] as $gid_arr) { $gid_arr = intval($gid_arr); $this->guestbook_db->delete(array('gid'=>$gid_arr)); } showmessage(L('刪除成功'),'?m=guestbook&c=guestbook'); }else{ $gid = intval($_GET['gid']); if($gid < 1) return false; $result = $this->guestbook_db->delete(array('gid'=>$gid)); if($result){ showmessage(L('刪除成功'),'?m=guestbook&c=guestbook'); }else { showmessage(L("刪除失敗"),'?m=guestbook&c=guestbook'); } } } /** * 留言本模組配置 */ public function setting() { //更新模型資料庫,重設setting 資料. $m_db = pc_base::load_model('module_model'); $set = $m_db->get_one(array('module'=>'guestbook')); $setting = string2array($set['setting']); $now_setting = $setting[$this->get_siteid()];//當前站點的配置 if(isset($_POST['dosubmit'])) { $setting[$this->get_siteid()] = $_POST['setting']; setcache('guestbook', $setting, 'commons'); $set = array2string($setting); $m_db->update(array('setting'=>$set), array('module'=>ROUTE_M)); showmessage('配置更新成功', '?m=guestbook&c=guestbook&a=init'); } else { extract($now_setting); // 載入後臺管理模版 setting.tpl.php include $this->admin_tpl('setting'); } } } ?>
上面涉及的後臺模板程式碼如下:
guestbook_list.tpl.php
<?php defined('IN_ADMIN') or exit('No permission resources. - guestbook_list.tpl.php'); $show_dialog = 1; include $this->admin_tpl('header', 'admin'); ?> <form action="?m=guestbook&c=guestbook&a=delete" method="post" name="myform" id="myform"> <table border="0" width="100%"> <tr>