記事の管理
管理用ページ”admin”の一覧と記事の削除”delete”について
記事の一覧表示
“admin”操作により、全てのステータスの記事が表示される。
この画面ではソートとページングをサポートしている。
public function actionAdmin()
{
$model=new Post('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Post']))
$model->attributes=$_GET['Post'];
$this->render('admin',array(
'model'=>$model,
));
}
上記のコードは【Gii】ツールで生成されたものであり、どこも修正していない。 最初に"Post"モデルを"search"シナリオにより作成する。 このモデルを使って、ユーザが指定した検索条件を集める。 次にユーザが指定したデータがあればモデルに割り当てる。 最後にこのモデルを使って"admin"ビューを表示する。
ビューの編集
<?php
$this->widget(
'zii.widgets.grid.CGridView',
array(
'dataProvider'=>$model->search(),
'filter'=>$model,
// 表示項目を設定
'columns'=>array(
// 記事タイトル
array(
'name'=>'title',
'type'=>'raw',
'value'=>'CHtml::link(CHtml::encode($data->title), $data->url)',
),
// 記事状態
array(
'name'=>'status',
'value'=>'Lookup::item("PostStatus", $data->status)',
'filter'=>Lookup::items('PostStatus'),
),
// 作成日
array(
'name'=>'create_time',
'type'=>'datetime',
'filter'=>false,
),
// 制御ボタン
array(
'class'=>'CButtonColumn',
),
),
)
);
?>
記事の表示のために"CGridView"を利用する。これを使うとカラムでソートしたり、記事が多くて1ページで表示 しきれないときにページング処理をしたりできる。 ビューの編集内容はカラムの表示で記事タイトル、記事の状態、作成日を変更 記事のタイトル:CSSを防ぐためHTMLエンティティをエンコードして出力 記事の状態:"tbl_lookup"より記事の状態を文字列で取得して出力
記事の削除
public function actionDelete($id)
{
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
上記のコードは【Gii】ツールにより生成されたものであり、どこも修正していない。 ・$_GET['ajax']について "CGridView"ウィジェットの機能に、初期設定では、ソート・ページング・削除の操作がAJAXモードで 実行されている。つまり、このような操作をしてもページの再読み込みが発生しない。 ただし、AJAXではないモードでウィジェットが動作する場合もある。(ウィジェットのajaxUpdateプロパティを "false"に設定した場合、またはクライアントのJavaScriptが無効になっている場合)deleteアクションでは この2つのシナリオを区別する必要がある。 すなわち、削除要求がAJAX経由で来る場合はブラウザをリダイレクトせず、そうでない場合はリダイレクトする。
記事を削除する際は、記事についたコメントも全て削除する必要ある。
加えて、削除した記事で使っていたタグも”tbl_tag”テーブルを更新しなければならない。
これらのタスクは両方とも”Post”モデルクラスの”afterDelete”メソッドを編集することで対応する。
/**
*
* 記事に紐づくコメントの削除、タグテーブルの更新
*
**/
protected function afterDelete()
{
parent::afterDelete();
// コメントの削除
Comment::model()->deleteAll('post_id='.$this->id);
// タグテーブル(tbl_tag)の更新
Tag::model()->updateFrequency($this->tags, '');
}
参考サイト:
http://www.yiiframework.com/doc/blog/1.1/ja/post.admin

