YII 通用CURD外部Action 适合单表

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

主键:CActiveRecord::model($modelClass)->tableSchema->primaryKey;
库名:CActiveRecord::model($modelClass)->tableSchema->schemaName;
表名:CActiveRecord::model($modelClass)->tableSchema->name;

保存后得到主键值

Yii::app()->db->getLastInsertID();
$model->save();
$model->id; 

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

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

public $defaultAction='index';

 

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

<?php

class DeleteAction extends CAction
{
    public $pk = 'id';
    public $redirectTo = array('index');
    public $modelClass;
    function run() {
        $pk = Yii::app()->request->getParam($this->pk);
        if (empty($pk))
            throw new CHttpException(404);
        $model = CActiveRecord::model($this->modelClass)->findByPk($pk);
        if (!$model)
            throw new CHttpException(404);

        if ($model->delete()) {
            $this->getController()->redirect($this->redirectTo);
        }

        throw new CHttpException(500);
    }
}

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

<?php
class ViewAction extends CAction{
	public $param = 'id';
	public $renderTo = 'view';
	public $modelClass;
	function run(){
		$pk = Yii::app()->request->getParam($this->param);
        if(empty($pk))  
            throw new CHttpException(404);  
            
        $model = CActiveRecord::model($this->modelClass)->findByPk($pk);  
        if(!$model)  
            throw new CHttpException(404); 
             
		$this->getController()->render($this->renderTo, array('model'=>$model));
	}
}

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

<?php

class UpdateAction extends CAction
{
    public $param = 'id';
    public $renderTo = 'update';
    public $successRedirect = 'view';
    public $updateArr = [];
    public $modelClass;

    function run() {
        $pk = Yii::app()->request->getParam($this->param);
        if (empty($pk))
            throw new CHttpException(404);

        $model = CActiveRecord::model($this->modelClass)->findByPk($pk);
        if (!$model)
            throw new CHttpException(404);
        $model->scenario = 'update';

        if (!empty($this->updateArr)) {
            $model->attributes = $this->updateArr;
        }
        if (isset($_POST[$this->modelClass])) {
            $model->attributes = $_POST[$this->modelClass];
            if ($model->save())
                $this->getController()->redirect(array($this->successRedirect, 'id' => $model->{$model->tableSchema->primaryKey}));
        }

        $this->getController()->render($this->renderTo, array('model' => $model));
    }
}

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

<?php
class CreateAction extends CAction{
	public $renderTo = 'create';
	public $successRedirect = 'view';
	public $modelClass;
	function run(){
        $model = new $this->modelClass;
        $model->scenario = 'new';   
		if(isset($_POST[$this->modelClass]))
		{
			$model->attributes=$_POST[$this->modelClass];
			if($model->save())
				$this->getController()->redirect( array($this->successRedirect, 'id'=>$model->{$model->tableSchema->primaryKey}) );
		}
		
		$this->getController()->render($this->renderTo, array('model'=>$model));		
	}
}

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

<?php

class ListAction extends CAction
{
    public $renderTo = 'list';
    public $modelClass;
    public $renderArr = array();
    public $searchArr = array();

    function run() {
        $model = new $this->modelClass('search');
        $model->unsetAttributes(); // clear any default values
        #查询初始化条件
        if (!empty($this->searchArr)) {
            $model->attributes = $this->searchArr;
        }
        if (isset($_REQUEST[$this->modelClass])) { //点击搜索按钮后的查询条件
            $model->attributes = $_REQUEST[$this->modelClass];
            array_map("trim", $model->attributes);
        }
        $params = array_merge(['model' => $model], $this->paramsArr);
        $this->getController()->render($this->renderTo, $params);
    }
}

 

2.PostController.php

<?php
class PostController extends Controller
{
	function actions(){
		return array(
			'create' => array(
				'class'		 => 'application.actions.CreateAction',
				'modelClass' => 'Post',
			),
			'view' => array(
				'class'		 => 'application.actions.ViewAction',
				'param'		 => 'Postid', //getParam('param');
				'modelClass' => 'Post',
			),
			'update' => array(
				'class'		 => 'application.actions.UpdateAction',
				'modelClass' => 'Post',
			),
			'delete' => array(
				'class'		 => 'application.actions.DeleteAction',
				'modelClass' => 'Post',
			),
			'index' => array(
				'class'		 => 'application.actions.ListAction',
				'modelClass' => 'Post',
			),
		);
	}
}

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

index.php?r=post/remove?Post_id=1

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

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值