0 follower

コメントの管理

コメントの管理には、コメントの更新・削除・承認があります。これらの操作は CommentController クラスのアクションとして実装します。

1. コメントの更新と削除

Gii で生成したコードの、コメント更新・削除の部分はほとんど変更せずに使います。

2. コメントの承認

コメントが新しく作成されたとき、コメントは承認待ちの状態になります。ゲストユーザに見えるようにするためには承認が必要です。コメントの承認は、基本的にコメントの status カラムを変更するだけです。

CommentController に以下のような actionApprove() メソッドを作成します。

public function actionApprove()
{
    if(Yii::app()->request->isPostRequest)
    {
        $comment=$this->loadModel();
        $comment->approve();
        $this->redirect(array('index'));
    }
    else
        throw new CHttpException(400,'Invalid request...');
}

上記コードでは、POST リクエスト経由で approve アクションが呼ばれたときに、Comment モデルで定義した approve() メソッドを呼んでステータスを変更します。それから、このコメントが属する記事を表示するページに、ブラウザをリダイレクトします。

もちろん、上記に加えて、Comment モデルに approve() メソッドを作成する必要もあります。以下のようにします。

public function approve()
{
    $this->status=Comment::STATUS_APPROVED;
    $this->update(array('status'));
}

していることは単純なことです。まず、コメントの status プロパティに Comment クラスで定義されている 承認済み 状態を示す定数をセットします。

class Comment extends CActiveRecord
{
    ...
 
    const STATUS_PENDING=1;
    const STATUS_APPROVED=2;
 
    ..
}

そして、次に、update() メソッドを呼んで新しくセットされたプロパティをデータベースに保存します。

さらに、すべてのコメントを表示するために CommentControlleractionIndex() メソッドを修正します。承認待ちのコメントを先頭に表示するようにします。

public function actionIndex()
{
    $dataProvider=new CActiveDataProvider('Comment', array(
        'criteria'=>array(
            'with'=>'post',
            'order'=>'t.status, t.create_time DESC',
        ),
    ));
 
    $this->render('index',array(
        'dataProvider'=>$dataProvider,
    ));
}

上記コードでは、tbl_posttbl_comment の両方に statuscreate_time というカラムがあるので、曖昧さを無くすためにテーブルのエイリアス名を接頭辞として付ける必要があります。ガイド に記述されているように、リレーショナルなクエリーでは、プライマリテーブルのエイリアスは常に t です。そのため上記コードでは、status カラムと create_time カラムに接頭辞 t を付けて、それらの値をプライマリテーブル (tbl_comment) から取得すべきことを示しています。

記事の index ビューのように、CommentControllerindex ビューでも CListView を使ってコメント一覧を表示します。部分的ビューとして /wwwroot/blog/protected/views/comment/_view.php を使って、個々のコメントの詳細を表示します。ここでは詳細には立ち入りません。興味のある方はブログデモの対応するファイル /wwwroot/yii/demos/blog/protected/views/comment/_view.php を参照してください。

Found a typo or you think this page needs improvement?
Edit it on github !