设为首页 收藏本站
查看: 1073|回复: 0

[经验分享] PHP – EasyUI DataGrid 资料存取标准化

[复制链接]
累计签到:6 天
连续签到:1 天
发表于 2015-8-23 09:26:10 | 显示全部楼层 |阅读模式
  延续上篇 PHP – EasyUI DataGrid 资料存的方式 ,本篇将上篇其中资料存取的 dal_user.php 予以标准化,藉由标准化的 dal 才能将知识传承下去并可将程式撰写的方式标准化下来。
  一般我们要将程式撰写的方式标准化,都会撰写程式撰写规范文件的方式,来告诉开发人员要如何来撰写程式。
  接下来,要来定义 DAL 的 interface,也就是设定 DAL 标准该有的介面有哪些(有关本文所讲述 DAL 的概念,读者 可参阅 PHP – 架構設計 Data Access Layer 篇,看过以后会更容易了解本文所说的概念),介面说明如下。
  首先,要能实现之前在 PHP – EasyUI DataGrid 资料存的方式 中 type 所定义的四个动作
add 新增
mod 修改
del 删除
data 取得资料
  这些 都要能有对应的资料处理介面,而这四个动作,也都跟业务逻辑没有关联,所以算是很单纯的资料存取,很容易就能写出,标准化介面如下所示:
  IDAL.php


DSC0000.gif DSC0001.gif View Code


1 <?php
2  
3 /**
4     * @file IDAL.php
5     * @brief 設定 DAL 標準該有的介面
6     * @author watson
7     * @version 1.0
8     * @date 2012-10-05
9  */
10 interface IDAL
11 {
12     /**
13         * @brief 設定要操作的資料庫
14         *
15         * @param $id    要操作的資料庫
16         *
17         * @return 無回傳值
18      */
19     public function setDB($fdb);
20      
21     /**
22         * @brief 藉由table 的唯一主 key 來刪除特定資料
23         *
24         * @param $id    要刪除資料的 key 值
25         *
26         * @return 成功回傳 'true', 失敗回傳 錯誤信息
27      */
28     public function delete($id);
29      
30     /**
31         * @brief 更新資料,資料從 $_REQUEST 取得,索引名稱需與 資料庫 table 的欄位名稱一致
32         *
33         * @return 成功回傳 'true', 失敗回傳 錯誤信息
34      */
35     public function update();
36      
37     /**
38         * @brief 新增資料,資料從 $_REQUEST 取得,索引名稱需與 資料庫 table 的欄位名稱一致
39         *
40         * @return 成功回傳 'true', 失敗回傳 錯誤信息
41      */
42     public function insert();
43      
44     /**
45         * @brief 取得目前資料的總筆數
46         *
47         * @return 回傳資料的總筆數
48      */
49     public function getTotalCount();
50      
51     /**
52         * @brief 藉由查詢條件 criValues 來取得資料
53         *
54         * @param $criValues 該網頁資料處理對應的 DAL
55         *
56         * @return 回傳資料集陣列
57      */
58     public function getData($criValues);
59 }
60  
61 ?>
  接下来,当然就是 要对上面定义的介面来实现 各个 table 对应的 DAL 来处理资料。
这部分的实现,并不复杂,但跟技术比较有关西,为了避免偏离原先要讲架购的主题,还请读者自行去实做,只要能实现上述界面所要功能就可以了。
  DAL 这部分用好后,在来就是思考,如何来应用在 UI 层了,这部分需要思考几个问题,第一,是希望程式的档案数要能减少,最好是一支程式就能完成。
第二,UI 层 牵涉到 DAL 的呼叫,也就是 MVC 中的控制部分,也要能标准化起来,如此后面每一支系统程式,就不用每一支都要来去控制 DAL 的呼叫,尽量把会重复使用的控制跟操作的方法,封装起来,藉此简化,后面应用时的复杂度,而能在应用时专心该系统要解决的问题上就好。
  在这,一條小龍 把控制 DAL 的程式码,封装成一个 DG_Page 的 class 来处理,如此, UI 层 就只需要在简单来呼叫使用即可。
这部分程式码,如下所示:
  DG_Page.php


View Code


  1 <?php
  2  
  3 /**
  4     * @file DG_Page.php
  5     * @brief 基本檔網頁的資料處理
  6     * @author watson
  7     * @version 1.0
  8     * @date 2012-10-05
  9  */
10 class DG_Page
11 {
12     var $db;
13     var $dal;
14      
15     /**
16         * @brief 建構式
17         *
18         * @param $fdal  該網頁資料處理對應的 DAL
19         *
20         * @return
21      */
22     public function __construct(IDAL $fdal)
23     {
24         require_once("..\..\db\DB_config.php");
25         require_once("..\..\db\DB_class.php");
26         
27         //if (!empty($fdal))
28         //{
29             //return die(get_class($this)."->".__FUNCTION__." => DAL not define");
30         //}
31         
32         $this->db = new DB();
33         $this->db->connect_db($_DB['host'], $_DB['username'], $_DB['password'], $_DB['dbname']);
34         
35         $this->dal = $fdal;
36         $this->dal->setDB($this->db);
37     }
38      
39     /**
40         * @brief 處理 Post 回來的資料,$_REQUEST['type'] 不能為空
41         *
42         * @return Type=Insert, Update 成功 回傳 array('success'=>true)
43         *   Type=Data 回傳 EasyUI 用的資料集
44         *   Type=Qry 回傳 JSON 資料集
45      */
46     public function dealPost()
47     {
48         $result = false;
49              
50         $type = $_REQUEST['type'];
51         $msg = "";
52         
53         if (!empty($_REQUEST["forKey"]))
54         {
55             $_REQUEST[$this->dal->Foreignkey] = $_REQUEST["forKey"];
56         }
57         
58         if($type == "del")
59         {
60             $id = $_REQUEST['id'];
61             $result = $this->dal->delete($id);
62         
63         }else if($type == "data"){
64              
65             $res = array();
66              
67             $res["total"] = $this->dal->getTotalCount();
68              
69             $items = $this->dal->getData($_REQUEST);
70  
71             $res["rows"] = $items;
72              
73             echo json_encode($res);
74         }else if($type == "qry"){
75  
76             $items = $this->dal->getData($_REQUEST);
77  
78             echo json_encode($items);
79      
80         }else{
81              
82             if (!empty($_REQUEST['id']) ) {
83                 $result = $this->dal->update();
84             }else{ // is add
85                 $result = $this->dal->insert();
86             }
87         }
88         
89         if($type != "data" && $type != "qry")
90         {
91             if ($result == "true"){
92                 echo json_encode(array('success'=>true));
93             } else {
94                  
95                 echo json_encode(array('msg'=>'had errors occured. ' . $result));
96             }
97         }
98     }
99 }
100 ?>
  由程式码,可以看到一條小龍,把 在 PHP – EasyUI DataGrid 资料存的方式 中 type 所定义的四个动作,DG_Page 在实做一次,跟 DAL 层不同的是这边重点,主要在把 DAL 取出的资料,予以处理,将其格式调整成 UI 控件,在这范例中,也就是 EasyUI DataGrid 能接受的资料格式。
  如此,后面需要更换 控件时,就只需改写 这个 class 即可,而且 DAL 的部分,它的功能也比在前篇的 dal_user class 更加明确,如此一来,本文的 dal 只单纯在做资料处理,应用范围就会更宽广。
  最后,为了应用,前面写的两支程式,需在改写 datagrid.php 这支程式,让其在后面应用上,EasyUI DataGrid 都只需要呼叫自己本身来处理即可,不需在像前篇PHP – EasyUI DataGrid 资料存的方式 中所述,还需要 呼叫另外一支 dal_user.php 的程式,如此一来,可大大 减少后须维护的程式相关档案的数量,不用为了维护一支程式要找好几支档案来处理。
  datagrid.php


View Code


  1 <?php
  2     require_once("..\..\db\DAL\STDAL.php");
  3  
  4     $prgName = "User";  
  5     $dal = DALFactory::getInstance($prgName);
  6      
  7     $LoginPath = "datagrid.php";
  8      
  9     if (!empty($_REQUEST['type']) )
10     {
11         require_once("..\..\util\DG_Page.php");
12         
13         $myPage = new DG_Page($dal);
14         
15         $myPage->dealPost();
16     }else{
17 ?>
18 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
19 <html>
20 <head>
21     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
22     <title>一條小龍 easyUI datagrid</title>
23      
24  
25     <link rel="stylesheet" type="text/css" href="http://www.iyunv.com/JS/EasyUI/themes/default/easyui.css">
26     <link rel="stylesheet" type="text/css" href="http://www.iyunv.com/JS/EasyUI/themes/icon.css">
27      
28     <script type="text/javascript" src="http://www.iyunv.com/JS/jquery.js"></script>
29     <script type="text/javascript" src="http://www.iyunv.com/JS/EasyUI/jquery.easyui.min.js"></script>
30     <script type="text/javascript" src="http://www.iyunv.com/JS/EasyUI/easyui-lang-zh_CN.js"></script>
31      
32     <style type="text/css">
33         #fm{
34             margin:0;
35             padding:10px 30px;
36         }
37         .ftitle{
38             font-size:14px;
39             font-weight:bold;
40             color:#666;
41             padding:5px 0;
42             margin-bottom:10px;
43             border-bottom:1px solid #ccc;
44         }
45         .fitem{
46             margin-bottom:5px;
47         }
48         .fitem label{
49             display:inline-block;
50             width:80px;
51         }
52     </style>
53      
54     <script type="text/javascript">
55         <?php
56             echo "post_prg = '$LoginPath';";
57             echo "primay_key = '$dal->PrimaryKey';";
58         ?>
59         var url;
60         
61         $(function(){
62             furl = post_prg+ '?type=data';
63             $('#myDG').datagrid({
64                 url:furl
65             });
66         });
67  
68         function newUser(){
69             $('#dlg').dialog('open').dialog('setTitle','New User');
70             $('#fm').form('clear');
71             url = post_prg + '?type=add';
72         }
73         function editUser(){
74             var row = $('#myDG').datagrid('getSelected');
75             if (row){
76                  
77                 if(typeof(row.UNum) !== 'undefined')
78                 {
79                     $('#dlg').dialog('open').dialog('setTitle','Edit User');
80                     $('#fm').form('load',row);
81                     url = post_prg + '?type=mod&id='+row.UNum;
82                 }else{
83                     alert("undefined");
84                 }
85             }
86         }
87         function saveUser(){
88             $('#fm').form('submit',{
89                 url: url,
90                 onSubmit: function(){
91                     //alert('sub :'+ url);
92                     return $(this).form('validate');
93                 },
94                 success: function(result){
95                     var result = eval('('+result+')');
96                     //alert(result.success);
97                     if (result.success){
98                         $('#dlg').dialog('close');      // close the dialog
99                         $('#myDG').datagrid('reload');  // reload the user data
100                     } else {
101                         $.messager.show({
102                             title: 'Error',
103                             msg: result.msg
104                         });
105                     }
106                 }
107             });
108         }
109         function removeUser(){
110             var row = $('#myDG').datagrid('getSelected');
111             if (row){
112                 $.messager.confirm('Confirm','Are you sure you want to remove this user?',function(r){
113                     if (r){
114                         //alert(row.UNum);
115                         $.post(post_prg, {type:'del', id:row.UNum}, function(result){
116                             if (result.success){
117                                 $('#myDG').datagrid('reload');  // reload the user data
118                             } else {
119                                 $.messager.show({   // show error message
120                                     title: 'Error',
121                                     msg: result.msg
122                                 });
123                             }
124                         },'json');
125                     }
126                 });
127             }
128         }
129     </script>
130 </head>
131 <body>
132     <h2>一條小龍 easyUI datagrid url 存取測試2</h2>
133      
134     <table id="myDG" class="easyui-datagrid"
135             toolbar="#toolbar"
136             title="Load Data" iconCls="icon-save" pagination="true"
137             toolbar="#toolbar" rownumbers="true" fitColumns="true" singleSelect="true">
138         <thead>
139             <tr>
140                 <th field="STUID" width="120">User ID</th>
141                 <th field="Password" width="80" align="right">Password</th>
142                 <th field="Birthday" width="80" align="right">Birthday</th>
143                 <th field="Nickname" width="200">Nickname</th>
144                 <th field="DBSTS" width="60" align="center">DBSTS</th>
145             </tr>
146         </thead>
147     </table>
148     <div id="toolbar">
149         <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true">New User</a>
150         <a href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true">Edit User</a>
151         <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true">Remove User</a>
152     </div>
153      
154     <div id="dlg" class="easyui-dialog"
155             closed="true" buttons="#dlg-buttons">
156         <div class="ftitle">User Information</div>
157         <form id="fm" method="post" novalidate>
158             <div class="fitem">
159                 <label>User ID:</label>
160                 <input name="STUID" class="easyui-validatebox" required="true">
161             </div>
162             <div class="fitem">
163                 <label>Password:</label>
164                 <input name="Password" class="easyui-validatebox" required="true">
165             </div>
166             <div class="fitem">
167                 <label>Nickname:</label>
168                 <input name="Nickname">
169             </div>
170             <div class="fitem">
171                 <label>Birthday:</label>
172                 <input name="Birthday" class="easyui-validatebox" validType="email">
173             </div>
174         </form>
175     </div>
176     <div id="dlg-buttons">
177         <a href="#" class="easyui-linkbutton" iconCls="icon-ok">Save</a>
178         <a href="#" class="easyui-linkbutton" iconCls="icon-cancel">Cancel</a>
179     </div>
180      
181 </body>
182 </html>
183  
184 <?php
185  
186     }
187      
188 ?>
  在这支程式中,UI 层还可以在用一个 Layout 来处理,把 整各画面的排版方式,用一支 Layout 的 php or html 档,来描述好再给这支程式来呼叫使用即可,如此就可让 程式人员减少接触太多的 HTML,并把 Layout 可以给专业网页开发人员来处理,来达到前后台分离开发的目的。
  结果画面,如下所示:
DSC0002.jpg
DSC0003.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102847-1-1.html 上篇帖子: Jexus 支持PHP的三种方式 下篇帖子: php java net 开发比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表