Yii ブログシステム作成(9)

記事の管理

管理用ページ”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, '');
  }

変更前
yii040

変更後
yii041

参考サイト:
http://www.yiiframework.com/doc/blog/1.1/ja/post.admin

Comments are closed.