[size="3"][color="#8B0000"]簡単なCRUDの例
[/color][/size]
英単語帳みたいなサンプルアプリケーションを作ります
左に英単語、右にその日本語訳、みたいなのです ( 例: yes - はい )
wordテーブルのモデルだけGiiを使って生成し
Controller, Viewを、自前で実装していきます。まず、少しだけWord.phpの修正
<?php
class Word extends CActiveRecord
{
...
public function rules()
{
return array(
array('eng', 'unique'), // 追加
array('eng, jpn', 'required'),
array('eng, jpn', 'length', 'max'=>50),
);
}
public function attributeLabels()
{
return array(
'id' => 'ID',
'eng' => '英単語', // 修正
'jpn' => '日本語訳', // 修正
);
}
}
登録した英単語が重複しないようにuniqueを追加
また、attributesLabelsをわかりやすい名前に修正
次に、WordController.phpを作っていきます
<?php
class WordController extends Controller {
public function actionIndex()
{
$c = CDbCriteria();
$c->order = 't.id DESC';
$models = Word::model()->findAll($c);
$this->render('index', compact('models'));
}
public function actionCreate()
{
$model = new Word;
$this->save($model);
}
public function actionView($id)
{
$model = $this->loadModel($id);
$this->render('view', compact('model'));
}
public function actionUpdate($id)
{
$model = $this->loadModel($id);
$this->save($model);
}
public function actionDelete($id)
{
$this->loadModel($id)->delete();
$this->redirect(array('somewhere'));
}
protected function save($model)
{
if (isset($_POST['Word']))
{
$model->attributes = $_POST['Word'];
if ($model->save())
$this->redirect(array('somewhere'));
}
$this->render('_form', compact('model'));
}
protected function loadModel($id)
{
$model = Word::model()->findByPk($id);
if ($model === null)
throw new CHttpException(404, 'データがありません');
return $model;
}
}
[color="#8B0000"]actionIndex()[/color]
wordテーブルのすべてのデータを、並び順をidのDESCにして、views/words/index.phpに渡しています
[color="#8B0000"]actionCreate()[/color]
まずWordのインスタンスを作成し、$modelに代入します
次の$this->save()は自作のメソッドで
「POSTリクエストがあった場合、データを保存し、保存が完了すればsomewhereページへリダイレクトする」
という基本的なものですが、actionUpdate()でも同様のことをするのでまとめています
また
// これと
$model->attributes = $_POST['Word']
// これは
$model->eng = $_POST['Word']['eng'];
$model->jpn = $_POST['Word']['jpn'];
同等のことをやっています
[color="#8B0000"]actionView($id)[/color]
まず、$this->loadModel($id)ですが、これも自作のメソッドで
$_GET[‘id’]の値を取得して、wordテーブルから1件データを取得するメソッドです
actionView($id), actionUpdate($id), actionDelete($id)で利用するのでまとめています
また、データがない場合は、例外を投げて「データがありません」と表示させています
[color="#8B0000"]actionUpdate($id)[/color]
これはactionCreate()とactionView($id)を混ぜたものと考えてください
INSERTとUPDATEの違いは、「new」してるものはINSERT、find系を使っているものはUPDATEです
[color="#8B0000"]actionDelete($id)[/color]
$_GET[‘id’]の値を取得して、wordテーブルから1件データを取得し、それを削除しています
次にViewを作っていきます
ファイルはとりあえず3つ用意しました。_form.phpは共通で使うものです
-
_form.php
-
index.php
-
view.php
[color="#8B0000"]_form.php[/color] ( actionCreate, actionUpdateで使用 )
フォームを作っています
errorSummaryはバリデーションエラーをまとめて表示させるものです
<h1><?php echo $this->action->id; ?></h1>
<?php echo CHtml::form(); ?>
<?php echo CHtml::errorSummary($model); ?>
<?php echo CHtml::activeTextField($model, 'eng', array('maxlength' => 64)); ?>
<?php echo CHtml::activeTextField($model, 'jpn', array('maxlength' => 64)); ?>
<?php echo CHtml::submitButton($model->isNewRecord?'追加する':'更新する'); ?>
</form>
[color="#8B0000"]index.php[/color]
<h1><?php echo $this->action->id; ?></h1>
<p><?php echo CHtml::link('追加', array('create')); ?></p>
<?php foreach ($models as $model): ?>
<?php echo CHtml::encode($model->eng); ?>
<?php echo CHtml::encode($model->jpn); ?>
<?php echo CHtml::link('表示', array('view', 'id' => $model->id)); ?>
<?php echo CHtml::link('編集', array('update', 'id' => $model->id)); ?>
<?php echo CHtml::link('削除', array('delete', 'id' => $model->id), array('confirm' => '削除してもよろしいですか?')); ?>
<br />
<?php endforeach; ?>
[color="#8B0000"]view.php[/color]
<h1><?php echo $this->action->id; ?></h1>
<?php echo CHtml::encode($model->eng); ?>
<?php echo CHtml::encode($model->jpn); ?>
こまかな部分は省いていますが、だいたいこんな感じです
MVCで共通しているところは、重複するものはまとめることと ( まとめ過ぎも危ういかもですが… )
今回の例ではデータの取得がシンプルだったのでControllerでやっていますが
ModelでやれるべきことはModelでやったほうがControllerの見通しもよくなります
何をどこに書くかはこちらやこちらを参考にしてください
また、自分も初心者なので、ここはこうしたほうが良いというものがあれば、是非言ってください