用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';
删除action
1.创建DeleteAction.php在protected/actions目录下,用于删除一条记录
<?php
class DeleteAction extends CAction
{
public $pk = 'id';
public $redirectTo = array('index');
public $modelClass;
public $deleteAttribute = array(); //$deleteAttribute = array('is_actived'=>0);
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, '系统查无数据');
$redirect = Yii::app()->request->urlReferrer;
if (empty($redirect)) {
$redirect = $this->redirectTo;
}
if (empty($this->deleteAttribute)) {//物理删除
if ($model->delete()) {
$this->getController()->redirect($redirect);
}
} else {
$attr = key($this->deleteAttribute);
$model->{$attr} = $this->deleteAttribute[$attr];
if ($model->save()) {
$this->getController()->redirect($redirect);
}
}
throw new CHttpException(500);
}
}
详情action
创建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));
}
}
修改action
创建UpdateAction.php在protected/actions目录下, 用于修改一条明细
<?php
class UpdateAction extends CAction
{
public $pk = 'id';
public $renderTo = 'update';
public $successRedirect = array('index');
public $modelClass;
function run()
{
$pk = Yii::app()->request->getParam($this->pk);
$refer = Yii::app()->request->getParam('refer');
if (empty($pk))
throw new CHttpException(404);
$model = CActiveRecord::model($this->modelClass)->findByPk($pk);
if (!$model)
throw new CHttpException(404);
$model->scenario = 'update';
if (isset($_POST[$this->modelClass])) {
$model->attributes = $_POST[$this->modelClass];
if ($model->save()) {
$model->unsetAttributes(); // clear any default values
$this->getController()->redirect($refer ? $refer : $this->successRedirect);
}
}
$this->getController()->render($this->renderTo, compact('model'));
}
}
新增action
创建CreateAction.php在protected/actions目录下, 用于新增一条记录
<?php
class CreateAction extends CAction
{
public $pk = 'id';
public $renderTo = 'create';
public $successRedirect = array('index');
public $modelClass;
function run()
{
$refer = Yii::app()->request->getParam('refer');
$model = new $this->modelClass;
//$model->scenario = 'save';
if (isset($_POST[$this->modelClass])) {
$model->attributes = $_POST[$this->modelClass];
if ($model->save()) {
$model->unsetAttributes(); // clear any default values
$this->getController()->redirect($refer ? $refer : $this->successRedirect);
}
}
$this->getController()->render($this->renderTo, array('model' => $model));
}
}
列表action
创建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