评论管理包括更新、删除和批准评论。这些操作在 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
。因此,我们在上面的代码中将 t
作为前缀添加到 status
和 create_time
列,以表示我们希望从主表 tbl_comment
中获取这些值。
与帖子索引视图类似,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...'); }
注册 注册 或 登录 以发表评论。