通過前面五講的系列教程,我們完成了一個簡單模塊的前端發布、列表展示、詳情展示。實際生產環境中,所有前台的數據都會有對應的后台操作進行統籌管理。我們稱之為后台管理系統。
今天,我們開始《10天學會phpWeChat》的第六講:實現新聞的后台管理。
1、后台管理的代碼在哪里編輯?
在第一天和第二天,我們大致了解了,對於一個功能模塊來講,后台管理和前台的控制器和視圖都分為兩大部分,前端控制器就是對應模塊文件夾下的index.php,前端視圖文件都在模塊根目錄的template/default/目錄下;后台控制器就是對應模塊admin目錄下的*.inc.php(此處為hello.inc.php)文件,后台視圖文件在admin目錄下的template目錄下。如圖:
hello world模塊目錄結構
如上所述,后台管理的控制器和視圖文件在對應模塊的admin目錄下編輯。
小貼士:后端和前端共用模型目錄和模型文件,均在對應模塊目錄的include目錄下,*.class.php為模型文件,*.func.php為輔助函數。
2、指定管理菜單
管理菜單是指登錄后台后,對應模塊的左側菜單欄需要呈現的菜單項,假如我們需要一個[文章管理]功能,我們在哪里配置呢?
我們現在來回答這個問題。
首先進入后台——頂部系統設置——左側模塊管理,找到要管理的模塊,點擊[配置模塊]進入模塊配置頁面(請確保您的phpWeChat核心框架版本為1.0.8+,框架下載:http://bbs.phpwechat.com/thread-189-1-1.html)。如下圖出現類似的配置界面:
點擊配置模塊,如下圖:
如上圖所示:我們點擊[增加菜單項]增加一項菜單,菜單圖標、菜單名稱、菜單action都是可以選擇修改的。
菜單圖標:即后台模塊左側菜單的ICO圖標;
菜單名稱:即后台模塊左側菜單顯示的名稱;
菜單action:用來給控制器指明操作路由。
如上圖所示,提交后,我們就添加了一個[文章管理]菜單。如圖:
此時點擊文章管理菜單,右側出現空白頁,因為我們還沒有編寫相應的控制器邏輯和視圖文件。
3、編寫后台管理控制器
打開hello world模塊的后台控制器文件:admin/hello.inc.php ,由於前面我們定義了路由叫manage,所以我們需要寫一個case 'manage':方法。
1 <?php 2 3 /** 4 * 本文件是 hello 模塊的后端控制器 5 * 6 * 您可以通過 switch 的 case 分支來實現不同的業務邏輯 7 */ 8 9 use wechat\Hello\Hello; 10 use phpWeChat\Area; 11 use phpWeChat\CaChe; 12 use phpWeChat\Config; 13 use phpWeChat\Member; 14 use phpWeChat\Module; 15 use phpWeChat\MySql; 16 use phpWeChat\Order; 17 use phpWeChat\Upload; 18 19 !defined('IN_MANAGE') && exit('Access Denied!'); 20 21 $mod=@return_edefualt(str_callback_w($_GET['mod']),'hello'); 22 $file=@return_edefualt(str_callback_w($_GET['file']),'hello'); 23 $action=@return_edefualt(str_callback_w($_GET['action']),'config'); 24 25 $_parent=Module::getModuleByKey(Module::getModule($mod,'parentkey')); 26 $_mod=$_parent['folder'].'/'.$mod.'/'; 27 28 switch($action) 29 { 30 31 // case 'config' 是系統默認自帶操作,用於進行模塊選項配置的操作 32 case 'config': 33 if(isset($dosubmit)) 34 { 35 Config::setConfig($_mod,$config); 36 operation_tips('操作成功!','?mod=hello&file=hello&action=config'); 37 } 38 include_once parse_admin_tlp($file.'-'.$action,$mod); 39 break; 40 case 'manage': 41 echo '這里將呈現文章列表和對應的管理'; 42 break; 43 44 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 45 //case 'manage': 46 //在此寫 phpwechat.php?mod=hello&file=hello&action=manage 時的邏輯 47 //break; 48 //case 'add': 49 //在此寫 phpwechat.php?mod=hello&file=hello&action=add 時的邏輯 50 //break; 51 //以此類推... 52 //case '...': 53 //在此寫 phpwechat.php?mod=hello&file=hello&action=... 時的邏輯 54 //break; 55 default: 56 break; 57 } 58 ?>
此時后台呈現如下效果:
以上的步驟是為了展示控制器的效果,實際上,我們需要將數據從數據讀出,然后呈現給視圖。
與前端不一樣的是,后台需要顯式加載視圖文件代碼為:
1 include_once parse_admin_tlp($file.'-'.$action,$mod);
這樣我們重新定義控制器如下:
1 <?php 2 3 /** 4 * 本文件是 hello 模塊的后端控制器 5 * 6 * 您可以通過 switch 的 case 分支來實現不同的業務邏輯 7 */ 8 9 use wechat\Hello\Hello; 10 use phpWeChat\Area; 11 use phpWeChat\CaChe; 12 use phpWeChat\Config; 13 use phpWeChat\Member; 14 use phpWeChat\Module; 15 use phpWeChat\MySql; 16 use phpWeChat\Order; 17 use phpWeChat\Upload; 18 19 !defined('IN_MANAGE') && exit('Access Denied!'); 20 21 $mod=@return_edefualt(str_callback_w($_GET['mod']),'hello'); 22 $file=@return_edefualt(str_callback_w($_GET['file']),'hello'); 23 $action=@return_edefualt(str_callback_w($_GET['action']),'config'); 24 25 $_parent=Module::getModuleByKey(Module::getModule($mod,'parentkey')); 26 $_mod=$_parent['folder'].'/'.$mod.'/'; 27 28 switch($action) 29 { 30 31 // case 'config' 是系統默認自帶操作,用於進行模塊選項配置的操作 32 case 'config': 33 if(isset($dosubmit)) 34 { 35 Config::setConfig($_mod,$config); 36 operation_tips('操作成功!','?mod=hello&file=hello&action=config'); 37 } 38 include_once parse_admin_tlp($file.'-'.$action,$mod); 39 break; 40 case 'manage': 41 //echo '這里將呈現文章列表和對應的管理'; 42 $data=Hello::dataList(); 43 include_once parse_admin_tlp($file.'-'.$action,$mod); 44 break; 45 46 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 47 //case 'manage': 48 //在此寫 phpwechat.php?mod=hello&file=hello&action=manage 時的邏輯 49 //break; 50 //case 'add': 51 //在此寫 phpwechat.php?mod=hello&file=hello&action=add 時的邏輯 52 //break; 53 //以此類推... 54 //case '...': 55 //在此寫 phpwechat.php?mod=hello&file=hello&action=... 時的邏輯 56 //break; 57 default: 58 break; 59 } 60 ?>
4、建立后台操作視圖文件
此時,后台刷新,提示視圖文件不存在:
我們需要在admin/template/下建立hello-manage.tlp.php視圖文件。
具體代碼:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>文章管理</title> 6 </head> 7 8 <body> 9 <ul> 10 {loop $data $r} 11 <li>{$r['title']} <a href="?mod=hello&file=hello&action=delete&id={$r['id']}">刪除</a></li> 12 {/loop} 13 </ul> 14 </body> 15 </html>
在上面的視圖文件中,我們定義了一個刪除操作,並指明了路由規則action為delete。效果如下圖:
5、定義刪除模型操作方法和控制器路由
由於沒定義delete的路由,所以現在點擊是空白頁。此時我們需要在模型里增加刪除方法和后端控制器里增加case 'delete':路由規則:
模型文件include/hello.class.php
1 <?php 2 // +---------------------------------------------------------------------- 3 // | phpWeChat hello 操作類 Last modified 2016-12-28 00:02:22 4 // +---------------------------------------------------------------------- 5 // | Copyright (c) 2009-2016 phpWeChat http://www.phpwechat.com All rights reserved. 6 // +---------------------------------------------------------------------- 7 // | Author: 騎馬的少年 <phpwechat@126.com> <http://www.phpwechat.com> 8 // +---------------------------------------------------------------------- 9 namespace wechat\Hello; 10 11 use phpWeChat\Area; 12 use phpWeChat\CaChe; 13 use phpWeChat\Config; 14 use phpWeChat\DataInput; 15 use phpWeChat\DataList; 16 use phpWeChat\Member; 17 use phpWeChat\Module; 18 use phpWeChat\MySql; 19 use phpWeChat\Order; 20 use phpWeChat\Upload; 21 22 class Hello 23 { 24 public static $mPageString=''; // 這個靜態成員是系統自帶,請勿刪除 25 private static $mArticleTable='wechat_hello_article'; 26 27 static public function dataList() 28 { 29 //DB_PRE常量是phpWeChat自帶常量,指數據表前綴。 30 31 $data=MySql::fetchAll("SELECT * FROM `".DB_PRE.self::$mArticleTable."` ORDER BY `id` DESC"); 32 33 return $data; 34 } 35 36 static public function dataGet($id) 37 { 38 //DB_PRE常量是phpWeChat自帶常量,指數據表前綴。 39 40 $id=intval($id); 41 42 $data=MySql::fetchOne("SELECT * FROM `".DB_PRE.self::$mArticleTable."` WHERE `id` =".$id); 43 44 return $data; 45 } 46 47 static public function dataDelete($id) 48 { 49 //DB_PRE常量是phpWeChat自帶常量,指數據表前綴。 50 51 $id=intval($id); 52 53 return MySql::mysqlDelete(DB_PRE.self::$mArticleTable,$id); 54 } 55 56 static function dataInsert($data) 57 { 58 return MySql::insert(DB_PRE.self::$mArticleTable,$data); 59 } 60 } 61 ?>
后端控制器(admin/hello.inc.php):
1 <?php 2 3 /** 4 * 本文件是 hello 模塊的后端控制器 5 * 6 * 您可以通過 switch 的 case 分支來實現不同的業務邏輯 7 */ 8 9 use wechat\Hello\Hello; 10 use phpWeChat\Area; 11 use phpWeChat\CaChe; 12 use phpWeChat\Config; 13 use phpWeChat\Member; 14 use phpWeChat\Module; 15 use phpWeChat\MySql; 16 use phpWeChat\Order; 17 use phpWeChat\Upload; 18 19 !defined('IN_MANAGE') && exit('Access Denied!'); 20 21 $mod=@return_edefualt(str_callback_w($_GET['mod']),'hello'); 22 $file=@return_edefualt(str_callback_w($_GET['file']),'hello'); 23 $action=@return_edefualt(str_callback_w($_GET['action']),'config'); 24 25 $_parent=Module::getModuleByKey(Module::getModule($mod,'parentkey')); 26 $_mod=$_parent['folder'].'/'.$mod.'/'; 27 28 switch($action) 29 { 30 31 // case 'config' 是系統默認自帶操作,用於進行模塊選項配置的操作 32 case 'config': 33 if(isset($dosubmit)) 34 { 35 Config::setConfig($_mod,$config); 36 operation_tips('操作成功!','?mod=hello&file=hello&action=config'); 37 } 38 include_once parse_admin_tlp($file.'-'.$action,$mod); 39 break; 40 case 'manage': 41 //echo '這里將呈現文章列表和對應的管理'; 42 $data=Hello::dataList(); 43 include_once parse_admin_tlp($file.'-'.$action,$mod); 44 break; 45 case 'delete': 46 $op=Hello::dataDelete($id); 47 if($op) 48 { 49 exit('刪除成功'); 50 } 51 else 52 { 53 exit('刪除失敗'); 54 } 55 break; 56 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 57 //case 'manage': 58 //在此寫 phpwechat.php?mod=hello&file=hello&action=manage 時的邏輯 59 //break; 60 //case 'add': 61 //在此寫 phpwechat.php?mod=hello&file=hello&action=add 時的邏輯 62 //break; 63 //以此類推... 64 //case '...': 65 //在此寫 phpwechat.php?mod=hello&file=hello&action=... 時的邏輯 66 //break; 67 default: 68 break; 69 } 70 ?>
此時點擊刪除操作,則提示刪除成功,至此后台刪除功能完成。
至此,一個小型的后台管理功能完成了,在這里我們只做了一個刪除操作,當然您也可以拓展下想象力,增加諸如編輯等操作,相信您一定能夠完成。