YII 通用CURD外部Action 适合单表

简介:

用YII创建表的时候出现没主键的表,你可以在AR primaryKey()函数里手工声明主键 。

Java代码   收藏代码
  1. 主键:CActiveRecord::model($modelClass)->tableSchema->primaryKey;  
  2. 库名:CActiveRecord::model($modelClass)->tableSchema->schemaName;  
  3. 表名:CActiveRecord::model($modelClass)->tableSchema->name;  

保存后得到主键值

Java代码   收藏代码
  1. Yii::app()->db->getLastInsertID();  
  2. $model->save();  
  3. $model->id;   

为什么用外部Action,可以提高业务的重用性 。如DeleteAction可以同时处理post,user,...删除。

制器通常有一个默认的动作。当用户的请求未指定要执行的动作时,默认动作将被执行。默认情况下,默认的动作名为index, 它可以通过设置 CController::defaultAction 修改。

Java代码   收藏代码
  1. public $defaultAction='index';  

 

1.创建DeleteAction.php在protected/actions目录下,用于删除一条记录

Java代码   收藏代码
  1. <?php  
  2. class DeleteAction extends CAction{  
  3.     public $param = 'id';  
  4.     public $modelClass;  
  5.     public $redirectTo = array('index');      
  6.     public $deleteAttribute = array();  //$deleteAttribute = array('is_actived'=>1);  
  7.     function run(){  
  8.         $pk = Yii::app()->request->getParam($this->param);  
  9.         if(empty($pk))  
  10.             throw new CHttpException(404);  
  11.         $model = CActiveRecord::model($this->modelClass)->findByPk($pk);  
  12.         if(!$model)  
  13.             throw new CHttpException(404);  
  14.               
  15.         if (empty($this->deleteAttribute)) {//物理删除  
  16.             if($model->delete())  
  17.                 $this->getController()->redirect($this->redirectTo);             
  18.         }else{  
  19.             $attr = key($this->deleteAttribute);  
  20.             $model->{$attr} = $this->deleteAttribute[$attr];  
  21.             if($model->save())  
  22.                 $this->getController()->redirect($this->redirectTo);         
  23.         }  
  24.         throw new CHttpException(500);  
  25.     }  
  26. }  

创建ViewAction.php在protected/actions目录下, 用于显示一条明细

Java代码   收藏代码
  1. <?php  
  2. class ViewAction extends CAction{  
  3.     public $param = 'id';  
  4.     public $renderTo = 'view';  
  5.     public $modelClass;  
  6.     function run(){  
  7.         $pk = Yii::app()->request->getParam($this->param);  
  8.         if(empty($pk))    
  9.             throw new CHttpException(404);    
  10.               
  11.         $model = CActiveRecord::model($this->modelClass)->findByPk($pk);    
  12.         if(!$model)    
  13.             throw new CHttpException(404);   
  14.                
  15.         $this->getController()->render($this->renderTo, array('model'=>$model));  
  16.     }  
  17. }  

创建UpdateAction.php在protected/actions目录下, 用于修改一条明细

Java代码   收藏代码
  1. <?php  
  2. class UpdateAction extends CAction{  
  3.     public $param = 'id';  
  4.     public $renderTo = 'update';  
  5.     public $successRedirect = 'view';     
  6.     public $modelClass;  
  7.     function run(){  
  8.         $pk = Yii::app()->request->getParam($this->param);  
  9.         if(empty($pk))    
  10.             throw new CHttpException(404);    
  11.               
  12.         $model = CActiveRecord::model($this->modelClass)->findByPk($pk);    
  13.         if(!$model)    
  14.             throw new CHttpException(404);   
  15.         $model->scenario = 'update';  
  16.                          
  17.         if(isset($_POST[$this->modelClass]))  
  18.         {  
  19.             $model->attributes=$_POST[$this->modelClass];  
  20.             if($model->save())  
  21.                 $this->getController()->redirect( array($this->successRedirect, 'id'=>$model->{$model->tableSchema->primaryKey}) );  
  22.         }  
  23.           
  24.         $this->getController()->render($this->renderTo, array('model'=>$model));          
  25.     }  
  26. }  

创建CreateAction.php在protected/actions目录下, 用于新增一条记录

Java代码   收藏代码
  1. <?php  
  2. class CreateAction extends CAction{  
  3.     public $renderTo = 'create';  
  4.     public $successRedirect = 'view';  
  5.     public $modelClass;  
  6.     function run(){  
  7.         $model = new $this->modelClass;  
  8.         $model->scenario = 'new';     
  9.         if(isset($_POST[$this->modelClass]))  
  10.         {  
  11.             $model->attributes=$_POST[$this->modelClass];  
  12.             if($model->save())  
  13.                 $this->getController()->redirect( array($this->successRedirect, 'id'=>$model->{$model->tableSchema->primaryKey}) );  
  14.         }  
  15.           
  16.         $this->getController()->render($this->renderTo, array('model'=>$model));          
  17.     }  
  18. }  

创建ListAction.php在protected/actions目录下,用于查询列表管理

Java代码   收藏代码
  1. <?php  
  2. class ListAction extends CAction{  
  3.     public $renderTo = 'admin';  
  4.     public $modelClass;  
  5.     public $paramsArr = array();      
  6.     function run(){   
  7.         $model = new $this->modelClass('search');  
  8.         $model->unsetAttributes();  // clear any default values  
  9.         if(isset($_GET[$this->modelClass]))  
  10.             $model->attributes=$_GET[$this->modelClass];        
  11.         $params = array('model'=>$model);      
  12.               
  13.         if(!empty($this->paramsArr)){  
  14.             $params = array_merge($params, $this->paramsArr);  
  15.         }  
  16.         $this->getController()->render($this->renderTo, $params);        
  17.     }  
  18. }  

 

2.PostController.php

Java代码   收藏代码
  1. <?php  
  2. class PostController extends Controller  
  3. {  
  4.     function actions(){  
  5.         return array(  
  6.             'create' => array(  
  7.                 'class'      => 'application.actions.CreateAction',  
  8.                 'modelClass' => 'Post',  
  9.             ),  
  10.             'view' => array(  
  11.                 'class'      => 'application.actions.ViewAction',  
  12.                 'param'      => 'Postid'//getParam('param');  
  13.                 'modelClass' => 'Post',  
  14.             ),  
  15.             'update' => array(  
  16.                 'class'      => 'application.actions.UpdateAction',  
  17.                 'modelClass' => 'Post',  
  18.             ),  
  19.             'delete' => array(  
  20.                 'class'      => 'application.actions.DeleteAction',  
  21.                 'modelClass' => 'Post',  
  22.             ),  
  23.             'index' => array(  
  24.                 'class'      => 'application.actions.ListAction',  
  25.                 'modelClass' => 'Post',  
  26.             ),  
  27.         );  
  28.     }  
  29. }  

其中class是DeleteAction的路径,pk主键(默认id,可以不写),只需要修改actions,其他的model就可以共用DeleteAction.php,访问时

Java代码   收藏代码
  1. index.php?r=post/remove?Post_id=1  

修改系统gii的Crud Generator模板,可以快速的构建项目 http://hudeyong926.iteye.com/blog/1273561

 

相关文章
|
2天前
|
云安全 监控 安全
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
879 5
|
12天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1083 41
|
9天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
650 37
|
12天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
719 62
大厂CIO独家分享:AI如何重塑开发者未来十年
|
8天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
453 29
|
16天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
928 59
Meta SAM3开源:让图像分割,听懂你的话
|
5天前
|
弹性计算 网络协议 Linux
阿里云ECS云服务器详细新手购买流程步骤(图文详解)
新手怎么购买阿里云服务器ECS?今天出一期阿里云服务器ECS自定义购买流程:图文全解析,阿里云服务器ECS购买流程图解,自定义购买ECS的设置选项是最复杂的,以自定义购买云服务器ECS为例,包括付费类型、地域、网络及可用区、实例、镜像、系统盘、数据盘、公网IP、安全组及登录凭证详细设置教程:
204 114