コメント管理には、コメントの更新、削除、承認が含まれます。これらの操作は、CommentController
クラスのアクションとして実装されます。
コメントの更新と削除のためにGii
によって生成されたコードは、ほぼ変更されていません。
コメントが新しく作成されると、承認待ちの状態になり、ゲストユーザーに表示されるためには承認が必要です。コメントの承認は主にコメントのステータスカラムを変更することです。
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'));
}
ここでは、Comment
クラスのステータス定数で定義されているように、コメントのステータスプロパティをapproved
に設定しています
class Comment extends CActiveRecord
{
...
const STATUS_PENDING=1;
const STATUS_APPROVED=2;
..
}
その後、update()
メソッドを呼び出して、この新しく設定されたプロパティをデータベースに保存します。
また、すべてのコメントを表示するためにCommentController
のactionIndex()
メソッドを変更します。承認待ちのコメントが最初に表示されるようにします。
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_post
とtbl_comment
の両方にstatus
とcreate_time
カラムがあるため、対応するカラム参照をテーブルエイリアス名を付加して明確にする必要があることに注意してください。ガイドに記載されているように、リレーショナルクエリのプライマリテーブルのエイリアスは常にt
です。したがって、上記のコードでは、プライマリテーブルであるtbl_comment
から取得する値を指定するために、t
をstatus
とcreate_time
カラムに付加しています。
投稿インデックスビューと同様に、CommentController
のindex
ビューは、コメントリストを表示するためにCListViewを使用し、さらに個々のコメントの詳細を表示するためにパーシャルビュー/wwwroot/blog/protected/views/comment/_view.php
を使用します。詳細についてはここでは説明しません。興味のある読者は、ブログデモの対応するファイル/wwwroot/yii/demos/blog/protected/views/comment/_view.php
を参照してください。
誤字を発見しましたか?または、このページを改善する必要があると思いますか?
githubで編集 !
approve() メソッド
approve() メソッドは次のようになるはずです。
public function approve() { $this->status = Comment::STATUS_APPROVED; $this->save(); }
CommentController
この時点でコメントを承認しようとすると、エラー403が発生します。
修正するには
1 - 認証済みユーザーからの更新を許可するように、accessRules()メソッドを編集します。
public function accessRules() { return array( array('allow', // allow authenticated users to access all actions 'users'=>array('@'), ), array('deny', // deny all users 'users'=>array('*'), ), ); }
2 - 最後に、actionApproveメソッドを次のように修正します。
public function actionApprove($id) { if(Yii::app()->request->isPostRequest) { $comment=$this->loadModel($id); $comment->approve(); $this->redirect(array('index')); } else throw new CHttpException(400,'Invalid request...'); }
コメントするには、サインアップまたはログインしてください。