-------------------------------------------------------------------------------------
PHPCMS本身功能已經很完善,自帶的模塊可用可不用,松耦合特性使其非常適合企業的二次開發。
PC的默認路由在 phpcms/caches/configs/route.php 中定義,為content模塊下index控制器的init方法
一. PC所有模塊都在module目錄下,與數據表名字相同;
module目錄中文件就是控制器,控制器名與文件名相同;
前台控制器如index.php無須繼承任何類,用於前台操作;
後台控制器一般需要繼承admin模塊的admin類,一旦繼承admin就需要權限驗證(也可以不繼承)。
二. 總結開發後台模塊的步驟:
1. 後台訪問擴展的模塊:
擴展 - 菜單管理 - 添加菜單 - 上級:作為一級菜單(模塊名,文件名,方法名)
添加子菜單 - 上級:某個一級菜單(填不存在的模塊名,填不存在的文件名,填不存在的方法名)
擴展模塊後,需要在v9_module中注冊模塊!(相當於安裝)
2. 創建數據表:
create table v9_link(
.........
)engine=myisam default charset='utf8';
3. 建立後台的數據模型
<?php
defined('IN_PHPCMS') or exit('No permiss resources.'); pc_base::load_sys_class('model', '', 0); class link_model extends model { function __construct() { $this->db_config = pc_base::load_config('database'); $htis->db_setting = 'default'; $this->table_name = 'link'; parent::__construct(); } } /** * 幾點注意: * 1. PC的數據模型基本是雞肋,只是指定了數據庫設置和對應的表名,非徹底的MVC,直接復制一份修改即可。 * 2. 此模型一般在控制器構造方法調用。
*/
4. 建立後台控制器:
<?php
/**
* 後台友情鏈接,完整CURD
*/
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin', 'admin', 0);
class link extends admin {
private $db, $admin_db;
public $siteid;
function __construct() {
parent::__construct();
$this->M = new_html_special_chars(getcache('link', 'commons'));
$this->db = pc_base::load_model('link_model');
$this->db2 = pc_base::load_model('type_model');
}
/**
* 友情鏈接列表
*/
public function init() {
if($_GET['typeid'] != '') {
$where = array('typeid'=>intval($_GET['typeid']), 'siteid'=>$this->get_siteid());
} else {
$where = array('siteid'=>$this->get_siteid());
}
$page = (isset($_GET['page']) && intval($_GET['page'])) ? intval($_GET['page']) : 1;
$infos = $this->db->listinfo($where, $order = 'listorder DESC, linkid DESC', $page, $page = '9');
$pages = $this->db->pages;
$types = $this->db2->listinfo(array('module'=>ROUTE_M, 'siteid'=>$this->get_siteid()), $order = 'typeid DESC');
$types = new_html_special_chars($types);
$type_arr = array();
foreach($types as $typeid=>$type) {
$type_arr[$type['typeid']] = $type['name'];
}
$big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=link&c=link&a=add\', title:\''.L('link_add').'\', width:\'700\', height:\'450\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('link_add'));
include $this->admin_tpl('link_list');
}
/* 判斷標題重復和驗證 */
/* 添加分類時,驗證分類名是否已存在 */
/**
* 添加友情鏈接
*/
public function add() {
if(isset($_POST['dosubmit'])) {
$_POST['link']['addtime'] = SYS_TIME;
$_POST['link']['siteid'] = $this->get_siteid();
if(empty($_POST['link']['name'])) {
showmessage(L('sitename_noempey'), HTTP_REFERER);
} else {
$_POST['link']['name'] = safe_replace($_POST['link']['name']);
}
if($_POST['link']['logo']) {
$_POST['link']['logo'] = safe_replace($_POST['link']['logo']);
}
$data = new_addslashes($_POST['link']);
$linkid = $this->db->insert($data, true);
if( ! $linked) {
return false;
}
$siteid = $this->get_siteid();
//更新附件狀態
if(pc_base::load_config('system', 'attachment_stat') & $_POST['link']['logo']) {
$this->attachment_db = pc_base::load_model('attachment_model');
$this->attachment_db->api_update($_POST['link']['logo'], 'link-' . $linkid, 1);
}
showmessage(L('operation_success'), HTTP_REFERER, '', 'add');
} else {
$show_validator = $show_scroll = $show_header = true;
pc_base::load_sys_class('form', '', 0);
$siteid = $this->get_siteid();
$types = $this->db2->get_types($siteid);
include $this->admin_tpl('link_add');
}
}
/* 異步更新排序 */
/* 手動更新排序 */
/* 添加友情鏈接分類 */
/* 刪除分類 */
/* 分類管理 */
/**
* 修改友情鏈接分類
*/
public function edit_type() {
if(isset($_POST['dosubmit'])) {
$typeid = intval($_GET['typeid']);
if($typeid < 1) return false;
if( ! is_array($_POST['type']) || empty($_POST['type'])) return false;
if((!$_POST['type']['name']) || empty($_POST['type']['name'])) return false;
$this->db2->update($_POST['type'], array('typeid'=>$typeid));
showmessage(L('operation_success'),'?m=link&c=link&a=list_type','', 'edit');
} else {
$show_validator = $show_scroll = $show_header = true;
//查詢分類內容
$info = $this->db2->get_one(array('typeid'=>$_GET['typeid']));
if( ! $info) {
showmessage(L('linktype_exit'));
extract($info);
include $this->admin_tpl('link_type_edit');
}
}
}
/**
* 刪除友情鏈接
*/
public function delete() {
if( ! isset($_GET['linkid']) || (empty($_GET['linkid']) && ! isset($_POST['linkid'])) || empty($_POST['linkid'])) {
showmessage(L('illegal_parameters'), HTTP_REFERER);
} else {
if(is_array($_POST['linkid'])) {
foreach($_POST['linkid'] as $linkid_arr) {
//批量刪除友情鏈接
$this->db->delete(array('linkid'=>$linkid_arr));
//更新附件狀態
if(pc_base::load_config('system', 'attachment_stat')) {
$this->attachment_db = pc_base::load_model('attachment_model');
$this->attachment_db->api_delete('link - '. $linkid_arr);
}
}
showmessage(L('operation_success', '?m=link&c=link'));
} else {
$linkid = intval($_GET['linkid']);
if($linkid < 1) {
return false;
}
//刪除友情鏈接
$result = $this->db->delete(array('linkid'=>$linkid));
//更新附件狀態if(pc_base::load_config('system','attachment_stat')) {
$this->attachment_db = pc_base::load_model('attachment_model');
$this->attachment_db->api_delete('link-'.$linkid);
}
if($result){
showmessage(L('operation_success'),'?m=link&c=link');
}else {
showmessage(L("operation_failure"),'?m=link&c=link');
}
}
showmessage(L('operation_success'), HTTP_REFERER);
}
}
}
/**
* 幾點注意:
* 1. 作為一款產品,你可以感受到它程序的嚴謹性,照著做。
* 2. 操作數據類和其它系統類均在 libs/classes/ 中,數據模型基類model.class.php通過數據庫工廠類作為抽象層調用操作數據庫的方法。
* 3. 查詢所有為listinfo, 單條信息為get_one, 增加為insert, 修改為update。
* 4. 提示消息為系統公共函數showmessage(),在 libs/functions/global.func.php 中。
* 5. L()方法為語言處理函數,將讀入語言包,根據後台配置顯示英文/中文, 同樣是系統公共函數,
* 6. 加載後台模板 include $this->admin_tpl(""); 這是admin模塊下admin.class.php類的方法
* <www.Chenwei.ws>
*/
5. 建立後台模板文件
後台模板文件都在 modules/link/templates 下,文件名統一以“ .tpl.php”結尾
/**
* 後台模板局部
*/
<?php
defined('IN_ADMIN') or exit('No Permission resources.');
$show_dialog = 1;
include $this->admin_tpl('header', 'admin');
?>
<table width="100%" cellspacing="0" class="search-form">
<tbody>
<tr>
<td><div class="explain-col">
<?php echo L('all_linktype')?>: <a href="?m=link&c=link"><?php echo L('all')?></a>
<a href="?m=link&c=link&typeid=0">默認分類</a>
<?php
if(is_array($type_arr)){
foreach($type_arr as $typeid => $type){
?><a href="?m=link&c=link&typeid=<?php echo $typeid;?>"><?php echo $type;?></a>
<?php }}?>
</div>
</td>
</tr>
</tbody>
</table>
/**
* 幾點注意:
* 1. 後台模板是混編風格,由於在後台控制器中總是最後調用模板,所以系統庫和函數以及變量總是可用的。
* 2. 模板底部可以寫一些自己的JS操作函數。
*/
PHPCMS的模塊化設計非常人性化,更多有趣的地方等待大伙兒去發現,等待:[PC]PHPCMS二次開發指南(下)
Link:http://www.cnblogs.com/farwish/p/4249318.html
@黑眼詩人 <www.Chenwei.ws>