善用基类,加快程序开发节奏
thinkphp吧
全部回复
仅看楼主
level 2
逸海雲天 楼主
利用好基类,可以在很大程度上提高我们编码的速度和效率,下面我列出我的基类供大家修改指正,呵呵,多多提意见哦!
[目标]:加快开发速度,同时又不失灵活性,集成curd的大部分功能,并集成查找,数据验证等功能
[代码]: <?php
class BaseAction extends Action{
protected $dbname='';
protected function _initialize(){
      header("Content-Type:text/html; charset=UTF-8");
   $this->dbname=(''==$this->dbname)?$this->name:$this->dbname;
   }
   //下面定义预处理函数
   protected function _bf_index(){} //预执行函数-index;
//如果是用视图的话可以在_bf_index()函数中指明视图的名称即$this->dbname="高图";
   protected function _bf_add(){} //预执行函数-add
   protected function _bf_edit(&$vo){} //预执行函数-edit
   protected function _bf_insert(){} //预执行函数-insert
   protected function _af_insert($id=''){}//预执行函数-完成insert后执行
   protected function _bf_update(){} //预执行函数-update
   protected function _af_update(){} //预执行函数-完成update后执行
   protected function _bf_delete(){} //预执行函数-delete
   protected function _af_delete($ids=''){} //预执行函数-delete后续执行
   protected function _checkdata($method=0){} //预执行函数-数据校验
   protected function _filter(&$condition){} //预执行函数-变量过滤
   public function index(){
     $this->_bf_index();//执行预处理函数_bf_index
     $search=$condition=array();//初始化$search,$condition变量,$search为view模块的查询值,$condition为数据库的最终查询条件
    //处理查询参数,用户可以选择查件查询(支持分页查询,但有一bug,中文参数会乱码,哪位改改??)
     if(isset($_POST['my_search']))
       {$search=$_POST['my_search'];}
     else
       {$search=$_GET;$search['p']=$search['order']=$search['sort']=null;}
     $search=array_filter($search,'value_filter');//过滤无效的条件,以方便处理,值为负数,为空则不进行处理,节省处理开销
   if (count($search)==0)
   {$search=$condition=array();}
    else
    {    if (isset($search['data']))
    {$search['data']=urldecode($search['data']);}
    $condition = $search;
    $this->_filter($condition);//对一些较特殊的查询条件进行处理
    }
      $this->assign('my_search',$search);//将查询的条件传递给view中以供显示
     $model = D($this->dbname);
     if(!empty($model)) {$this->_list($model,$condition,$search);}

2010年06月11日 06点06分 1
level 2
逸海雲天 楼主

     $this->assign('my_search',$search);
     $this->display();
}
//这个函数还可以改一下,用于ajax处理,我这里就不详细列出了
//_list支持按字段排序
protected function _list($model,&$condition,&$search)
{
   $order =(isset($_REQUEST['order']))?$_REQUEST['order']:$model->getPk();//排序字段 默认为主键名
   $sort =($_REQUEST['sort'])?'asc':'desc';//如果定义了sort,或者sort为0的话则正序排列,否则倒序
         $count = $model->where($condition)->count();
   import("Think.Util.Page");
   $p = new Page($count,20,$search);//创建分页对象
   $voList      = $model->where($condition)->order($order.' '.$sort)->limit($p->firstRow.','.$p->listRows)->select();//分页查询数据
   $page        = $p->show();//分页显示
   $sort        = $sort == 'desc' ? 1:0;//排序方式
   //模板赋值显示
   $this->assign('list',$voList);
   $this->assign('sort',$sort);
   $this->assign('order',$order);
   $this->assign('page',$page);
}
public function add(){
      $this->_bf_add();
       $this->assign( 'met_opt', 'add' );
   $this->display('add');//我的add和edit视图是一个视图
}
public function edit(){
   $model = D($this->dbname);
   $pk = $model->getpk();
   $id      = $_REQUEST[$pk];
   $condition = (is_numeric($id))?"{$pk}=$id":"{$pk}='{$id}'";
   $vo = $model->where($condition)->find();
   if(false===$vo){$this->error('找不到指定的记录');}
   $this->_bf_edit($vo);
   $this->assign('data',$vo);
      $this->assign( 'met_opt', 'edit' );
   $this->display('add');
}
public function insert(){
   $this->_checkdata();//没有用TP的验证操作,自已用函数处理
   $model = D($this->dbname);
   $id = $model->add($_POST['data']);
   if($id) { //保存成功
    $this->_af_insert($id);
    $_POST['jump_url']=(!isset($_POST['jump_url']))?"__URL__/index":$_POST['jump_url'];
    $this->assign('jumpUrl',$_POST['jump_url']);
    $this->success("操作成功!");
   }else {
    $this->error("操作失败");//失败提示
   }
}
public function update(){
   $this->_bf_update();

2010年06月11日 06点06分 2
level 2
逸海雲天 楼主

   $this->_checkdata(1);
   $model = D($this->dbname);
   $pk = $model->getpk();
   $result = $model->save($_POST['data'],array(where=>array("{$pk}"=>$_POST['data']["{$pk}"])));
   if($result) {
             //成功提示
             $this->_af_update();
             $_POST['jump_url']=isset($_POST['jump_url'])?$_POST['jump_url']:"__URL__/index";
             $this->assign('jumpUrl',$_POST['jump_url']);
    $this->success('操作成功');
         }else {
               $this->error('操作失败');   //错误提示
         }
}
public function delete(){
   $model = D($this->dbname);
   $pk = $model->getpk();
   $ids = array_string($_REQUEST[$pk]);//将要删除的数组变成字符串
   $result = $model->where("{$pk} in ({$ids})")->delete();
   $this->_bf_delete();
   if($result) {
             //成功提示
             $this->_af_delete($ids);
             $_POST['jump_url']=isset($_POST['jump_url'])?$_POST['jump_url']:"__URL__";
             $this->assign('jumpUrl',$_POST['jump_url']);
             $this->success('操作成功');
         }else {
              $this->error('操作失败');            //错误提示
         }
}
//改变指定字段的状态
public function status($field='id',$method=0)
{
   $model = D($this->dbname);
   $pk = $model->getpk();
   if(!isset($_REQUEST[$pk])){$this->redirect('index');}
   $ids = array_string($_REQUEST[$pk]);
   $model->setfield($field,"{$method}","{$pk} in ({$ids})");
   $this->redirect();
}
}
?>
另外补充一点,在继承类中可以通过设置$this->dbname改变数据表,可以根据不同情况改变,比如主表是对user数据库进行操作,但只有index是读视图的,改变一下$thid->dbname的值就行了(在_bf_index()函数当中).
各位不要光看代码,多给点修改意见和好的想法.高手则指正一下缺点让我们一起完善!
2010年06月11日 06点06分 3
1