经过前面五讲的系列教程,咱们完成了一个简单模块的前端发布、列表展现、详情展现。实际生产环境中,全部前台的数据都会有对应的后台操做进行统筹管理。咱们称之为后台管理系统。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 ?>
此时点击删除操做,则提示删除成功,至此后台删除功能完成。
至此,一个小型的后台管理功能完成了,在这里咱们只作了一个删除操做,固然您也能够拓展下想象力,增长诸如编辑等操做,相信您必定可以完成。