CURD创建向导

Source:phpbone.com  Author:IT柏拉图
2013-11-25

    phpbone的CURD的实现,是居于cls_lurd_control这个类,实际上,它并不是普通orm类那样,把表映射成一个对象,然后执行xxx操作,那样还是得开发人员处理一大堆东西,lurd_control直接生成后台的数据列表模板、数据录入、编辑模板,用户只需简单的按自己的需求修改这些模板和调整程序,即可生成这个表的简单的数据管理后台,为了便于操作,系统提供了CURD创建向导来生成这个类,同时也支持生成一个前台数据模型类作为辅助。
    CURD创建向导界面如下:

上面需要注意的是控制器标识和模型类类名,这两个是必须符合变量命名规则的,最好用纯小写英文字母。
拿友情链接管理为例子,生成的后台控制器类大概如下:

  1. if( !defined('PHPBONE') ) exit('Request Error!'); 
  2. /** 
  3.  * 友情连接管理 
  4.  */ 
  5. class ctl_friendlink 
  6.     private $table = 'bone_friendlinks'
  7.  
  8.     public function index() 
  9.     { 
  10.         $even = request('even''list'); 
  11.          
  12.         //排序不使用lurd处理 
  13.         if$even=='up_sort' ) { 
  14.             return $this->up_sort(); 
  15.         } 
  16.          
  17.         $tb = cls_lurd_control::factory($this->table); 
  18.         $tb->form_url = '?ct=friendlink'
  19.         $tb->set_order_query("order by `sortrank` desc"); 
  20.         $reqs['keyword'] = request('keyword'''); 
  21.         $reqs['type'] = request('type', 0, 'int'); 

  22.         //这两个搜索条件,是后面完善的代码
  23. if( !empty($reqs['keyword']) ) 
  24.         { 
  25.             $tb->add_search_condition(" LOCATE('{$reqs['keyword']}', `webname`) > 0 "); 
  26.             $tb->form_url .= "&keyword=".urlencode($reqs['keyword']); 
  27.         } 
  28.         if( !empty($reqs['type']) ) 
  29.         { 
  30.             $tb->add_search_condition(" `type` = '{$reqs['type']}' "); 
  31.             $tb->form_url .= "&type=".urlencode($reqs['type']); 
  32.         }
  33.  
  34.         tpl::assign('reqs'$reqs); 
  35.         $lurd_hooks = array('saveadd_start' => '_friendlink_add''saveadd_end' => '_friendlink_add'
  36.                             'saveedit_start' => '_friendlink_edit''saveedit_end' => '_friendlink_edit'
  37.                             'delete_start' => '_friendlink_delete''delete_end' => '_friendlink_delete'
  38.                             ); 
  39.         $tb->bind_hooks($this$lurd_hooks); 
  40.         $tb->set_tplfiles('friendlink.index.tpl''friendlink.add.tpl''friendlink.edit.tpl'); 
  41.         $tb->listen(req::$forms); 
  42.     } 
  43.      
  44.     //保存增加模型数据后的处理 
  45.     public function _friendlink_add($hookname, &$data$insert_id
  46.     { 
  47.         if$hookname=='saveadd_start' ) 
  48.         { 
  49.             //lurd操作前处理 
  50.         } 
  51.         else 
  52.         { 
  53.             cls_msgbox::show('系统提示''成功增加友情连接'"javascript:parent.tb_remove();"); 
  54.             exit(); 
  55.         } 
  56.     } 
  57.      
  58.     //lurd保存修改数据后的处理 
  59.     public function _friendlink_edit($hookname, &$data
  60.     { 
  61.         if$hookname=='saveedit_start' ) 
  62.         { 
  63.             //lurd操作前处理 
  64.         } 
  65.         else 
  66.         { 
  67.             cls_msgbox::show('系统提示''成功修改友情连接'"javascript:parent.tb_remove();"); 
  68.             exit(); 
  69.         } 
  70.     } 
  71.      
  72.     //lurd删除数据hooks 
  73.     public function _friendlink_delete($hookname, &$data, &$add_data
  74.     { 
  75.         if$hookname=='delete_start' ) 
  76.         { 
  77.             //lurd操作前处理 
  78.         } 
  79.         else 
  80.         { 
  81.             cls_msgbox::show('系统提示''成功删除指定的友情连接数据'$tb->form_url); 
  82.             exit(); 
  83.         } 
  84.     } 
  85.  
  86.    /** 
  87.     * 更新排序 
  88.     */ 
  89.     public function up_sort() 
  90.     { 
  91.         $sortrank = request('sortrank'); 
  92.         $old_sortrank = request('old_sortrank'); 
  93.         if( !emptyempty($sortrank) ) 
  94.         { 
  95.             foreach($sortrank as $id => $val) { 
  96.                 if$old_sortrank[$id] != $val ) { 
  97.                     db::query("UPDATE `{$this->table}` SET `sortrank`='{$val}' WHERE `id`='{$id}' LIMIT 1"); 
  98.                 } 
  99.             } 
  100.         } 
  101.         cls_msgbox::show('系统提示''更新排序成功''?ct=friendlink', 1000); 
  102.     } 

cls_lurd_control通过

$tb->set_tplfiles('friendlink.index.tpl''friendlink.add.tpl''friendlink.edit.tpl'); 

指定模板,当这些模板不存在时,会分析表结构,自动创建,正是居于分析表结构这一特性,还能在表的注解里,定义字段一些特殊的属性,主要是下面几种:
1、@soft@  指定字段为附件类型
2、@image@  指定字段为图片类型
3、@catalog-分类模型id@  指定字段为特定分类模型的分类
其实1/2的发布表单,会被处理成如下图的样式:

分类模型的表单则是一个select表单

    关于生成模板这一块,可以自己按需要,修改 cls_lurd_control->build_tamplate_edit 里的程序实现更多的功能,下面重点说明一下,关于 $lurd_hooks。
    由于数据的增删改查,完全都被lurd_control所控制,对于很多情况下,我们进行某些操作,肯定不会只是操作单个数据表那么简单的,$lurd_hooks就是提供了lurd_control每进行一个动作前后,允许用户在当前控制器使用hooks接口干扰后续操作。

    •  $lurd_hooks = array('saveadd_start' => '_friendlink_add''saveadd_end' => '_friendlink_add'
    •                             'saveedit_start' => '_friendlink_edit''saveedit_end' => '_friendlink_edit'
    •                             'delete_start' => '_friendlink_delete''delete_end' => '_friendlink_delete'
    •                             ); 
    •  $tb->bind_hooks($this$lurd_hooks);

上面基本是完全包含了所有的hooks接口,接口函数由三个参数组成
$hookname     hookname 即是 saveadd_start...这些名称
&$data             回传数据(一般是$request_array, edit_start时回传的是读取到的当前记录数据,
                         delete_start/delete_end回传的是$request_array[$primary_key])
$add_data        回传数据二(一般为空,saveadd_end会回传insert_id、delete_start/delete_end回传$request_array)
可以在cls_lurd_control.php 搜索 "$this->bindHooks[" 看一下,是如何进行操作的。

如果完全不使用hooks接口,一个最基本的lurd_control操作只需如下几行代码:

  1. public function index() 
  2.     $tb = cls_lurd_control::factory('bone_friendlinks'); 
  3.     $tb->end_return_url = $tb->form_url = '?ct=friendlink'
  4.     $tb->set_tplfiles('friendlink.index.tpl''friendlink.add.tpl''friendlink.edit.tpl'); 
  5.     $tb->listen(req::$forms); 

只需上述几行简单的代码,即可完成对数据表的增删改查任务,前提是不嫌模板丑。

最后以框架的简易文档管理模块的edit_start、saveedit_end的hooks接口为示例,会更容易理解hooks的作用。

  1. public function _doc_edit($hookname, &$data$add_data=''
  2.     { 
  3.         if$hookname=='edit_start' ) 
  4.         { 
  5.             //读取副表数据 
  6.             $adddata = mod_doc::get_body( $data['doc_id'], $data['cid']); 
  7.             foreach($adddata as $k => $v) { 
  8.                 if( !isset($data[$k]) ) { 
  9.                     $data[$k]  = $v
  10.                 } 
  11.             } 
  12.         } 
  13.         else if$hookname=='saveedit_end'
  14.         { 
  15.             //更新副表数据 
  16.             $update_data = array('doc_id' => $data['doc_id'], 'cid' => $data['cid'], 'body' => $data['body'] ); 
  17.             if( !emptyempty($data['doc_id']) ) { 
  18.                 db::update($this->table.'_body'$update_data'', 1); 
  19.             } 
  20.             mod_doc::cache_del($data['doc_id']); 
  21.             cls_msgbox::show('系统提示''成功修改文档'$this->base_url."&cid={$data['cid']}", 1000); 
  22.         } 
  23.     } 

 

分享到: