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