[color="#8B0000"][size="3"]CRUD操作の簡略化[/size][/color]
それぞれのコントローラで
同じようなCRUDアクションを書くのに退屈しないために
まず、createと、updateはほぼ同じなので、components/actions/Save.phpにまとめます
<?php
class Save extends CAction {
public function run($id=null)
{
$c = $this->getController(); // $cは各コントローラ内で使う$thisと同じ
$m = ucfirst($c->getId()); // $mは各コントローラ内で使うモデル名
$model = $id===null ? new $m : $m::model()->load($id); // GET['id']がnullならcreate処理, そうでないならupdate処理
if (isset($_POST['confirm']))
{
$model->attributes = $_POST[$m];
if ($model->validate())
{
$c->setPageState('x', $model->attributes);
$c->render('confirm', array('model'=>$model));
return;
}
}
else if (isset($_POST['back']))
$model->attributes = $c->getPageState('x');
else if (isset($_POST['finish']))
{
$model->attributes = $c->getPageState('x');
if ($model->save())
$c->redirect(array('index'));
}
$c->render('save', array('model'=>$model)); // create, updateともにsave.php(view)でまとめています
}
}
確認画面処理も追加しています。確認画面の操作はこちらなどを参考にしてください
続いて、components/actions/Delete.php:
<?php
class Delete extends CAction {
public function run($id=null)
{
$c = $this->getController();
$m = ucfirst($c->getId());
$m::model()->load($id)->delete();
$c->redirect(array('index'));
}
}
$m::model()->load($id)はモデル内で次のように書いています
public function load($id)
{
$model = $this->findByPk((int)$id);
if ($model===null)
throw new CHttpException(404,'データがありません');
return $model;
}
create, update, deleteアクションの骨格はできたので
次に、components/Controller.phpに以下のコードを足します
public function actions()
{
return array(
'save'=>array(
'class'=>'application.components.actions.Save',
),
'delete'=>array(
'class'=>'application.components.actions.Delete',
),
);
}
あとは、Controller.phpを継承して各コントローラを書けば
自動的にcreate, update, deleteのアクションが作られるようになります
[color="#8B0000"]ttp://www.example.com/index.php?r=hoge/save[/color] にアクセスするとcreate処理
[color="#8B0000"]ttp://www.example.com/index.php?r=hoge/save&id=777[/color] にアクセスするとupdate処理
[color="#8B0000"]ttp://www.example.com/index.php?r=hoge/delete&id=777[/color] にアクセスするとdelete処理になります
( readも同じような流れだと思うので省きました )
補足:
Viewについてですが、create, updateの処理をviews/hoge/save.phpにまとめる形になるので
$model->isNewRecordなどを使って、少し表示に工夫が必要になるかもしれません
関連リンク
[Wiki] Actions code reuse with CAction
[Guide] コントローラ - 3.アクション