评论的管理包括修改、删除和发布。这些操作由CommentController类中的actions实现。
修改和删除评论
yiic生成的更新和删除代码并不用怎么修改。因为我们支持评论在更新前进行预览,我们只需要如下修改CommentController的actionUpdate()方法。
- public function actionUpdate()
- {
- $comment=$this->loadComment();
- if(isset($_POST['Comment']))
- {
- $comment->attributes=$_POST['Comment'];
- if(isset($_POST['previewComment']))
- $comment->validate('update');
- else if(isset($_POST['submitComment']) && $comment->save())
- $this->redirect(array('post/show',
- 'id'=>$comment->postId,
- '#'=>'c'.$comment->id));
- }
- $this->render('update',array('comment'=>$comment));
- }
这和PostController中的处理非常类似
发布评论
当添加一条评论时,他们是未发布状态,需要发布后才能被访客浏览。发布一条评论主要是修改comment的状态(status)字段。
在CommentController中我们如下添加actionApprove()方法。
- public function actionApprove()
- {
- if(Yii::app()->request->isPostRequest)
- {
- $comment=$this->loadComment();
- $comment->approve();
- $this->redirect(array('post/show',
- 'id'=>$comment->postId,
- '#'=>'c'.$comment->id));
- }
- else
- throw new CHttpException(500,'Invalid request...');
- }
在上面的代码中,当approve方法被POST请求调用时,我们调用在Comment模块中定义的approve()方法来改变状态。然后跳转到显示这个评论所属的文章界面。
我们同时修改了Comment的actionList()方法,让它只列出未经发布的评论
- public function actionList()
- {
- $criteria=new CDbCriteria;
- $criteria->condition='Comment.status='.Comment::STATUS_PENDING;
- $pages=new CPagination(Comment::model()->count());
- $pages->pageSize=self::PAGE_SIZE;
- $pages->applyLimit($criteria);
- $comments=Comment::model()->with('post')->findAll($criteria);
- $this->render('list',array(
- 'comments'=>$comments,
- 'pages'=>$pages,
- ));
- }
在列表的视图中,我们显示每条未发布的评论的详细内容,在底部显示显示了发布的链接。
- <?php if($comment->status==Comment::STATUS_PENDING): ?>
- <span class="pending">Pending approval</span> |
- <?php echo CHtml::linkButton('Approve', array(
- 'submit'=>array('comment/approve','id'=>$comment->id),
- )); ?> |
- <?php endif; ?>
我们使用了CHtml::linkButton()而没有使用CHtml::link()是因为前者发送一个POST请求,而后者是个GET求情,GET请求并不会弹出警告信息。否则的话,我们就将会面临用户刷新页面时重发多次请求的危险。