記事の管理
管理用ページ”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