經過前面五講的系列教程,咱們完成了一個簡單模塊的前端發佈、列表展現、詳情展現。實際生產環境中,全部前臺的數據都會有對應的後臺操做進行統籌管理。咱們稱之爲後臺管理系統。php
今天,咱們開始《10天學會phpWeChat》的第六講:實現新聞的後臺管理。html
一、後臺管理的代碼在哪裏編輯?前端
在第一天和次日,咱們大體瞭解了,對於一個功能模塊來說,後臺管理和前臺的控制器和視圖都分爲兩大部分,前端控制器就是對應模塊文件夾下的index.php,前端視圖文件都在模塊根目錄的template/default/目錄下;後臺控制器就是對應模塊admin目錄下的*.inc.php(此處爲hello.inc.php)文件,後臺視圖文件在admin目錄下的template目錄下。如圖:mysql
hello world模塊目錄結構sql
如上所述,後臺管理的控制器和視圖文件在對應模塊的admin目錄下編輯。數據庫
小貼士:後端和前端共用模型目錄和模型文件,均在對應模塊目錄的include目錄下,*.class.php爲模型文件,*.func.php爲輔助函數。後端
二、指定管理菜單微信
管理菜單是指登陸後臺後,對應模塊的左側菜單欄須要呈現的菜單項,假如咱們須要一個[文章管理]功能,咱們在哪裏配置呢?框架
咱們如今來回答這個問題。函數
首先進入後臺——頂部系統設置——左側模塊管理,找到要管理的模塊,點擊[配置模塊]進入模塊配置頁面(請確保您的phpWeChat核心框架版本爲1.0.8+,框架下載:http://bbs.phpwechat.com/thread-189-1-1.html)。以下圖出現相似的配置界面:
點擊配置模塊,以下圖:
如上圖所示:咱們點擊[增長菜單項]增長一項菜單,菜單圖標、菜單名稱、菜單action都是能夠選擇修改的。
菜單圖標:即後臺模塊左側菜單的ICO圖標;
菜單名稱:即後臺模塊左側菜單顯示的名稱;
菜單action:用來給控制器指明操做路由。
如上圖所示,提交後,咱們就添加了一個[文章管理]菜單。如圖:
此時點擊文章管理菜單,右側出現空白頁,由於咱們尚未編寫相應的控制器邏輯和視圖文件。
三、編寫後臺管理控制器
打開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 ?>
四、創建後臺操做視圖文件
此時,後臺刷新,提示視圖文件不存在:
咱們須要在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。效果以下圖:
五、定義刪除模型操做方法和控制器路由
因爲沒定義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 ?>
此時點擊刪除操做,則提示刪除成功,至此後臺刪除功能完成。
至此,一個小型的後臺管理功能完成了,在這裏咱們只作了一個刪除操做,固然您也能夠拓展下想象力,增長諸如編輯等操做,相信您必定可以完成。