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']}&nbsp;<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 ?>

此时点击删除操作,则提示删除成功,至此后台删除功能完成。

 

至此,一个小型的后台管理功能完成了,在这里我们只做了一个删除操作,当然您也可以拓展下想象力,增加诸如编辑等操作,相信您一定能够完成。

 

《10天学会phpWeChat》系列教程传送门:

posted @ 2016-12-30 23:01 phpWeChat开发教程 阅读(...) 评论(...) 编辑 收藏
可直接生成文档的API调试、管理工具 phpWeChat官网 phpWeChat应用市场 phpWeChat使用文档