评论的管理包括修改、删除和发布。这些操作由CommentController类中的actions实现。

修改和删除评论

yiic生成的更新和删除代码并不用怎么修改。因为我们支持评论在更新前进行预览,我们只需要如下修改CommentController的actionUpdate()方法。

 
  1. public function actionUpdate()
  2. {
  3.     $comment=$this->loadComment();
  4.  
  5.     if(isset($_POST['Comment']))
  6.     {
  7.         $comment->attributes=$_POST['Comment'];
  8.         if(isset($_POST['previewComment']))
  9.             $comment->validate('update');
  10.         else if(isset($_POST['submitComment']) && $comment->save())
  11.             $this->redirect(array('post/show',
  12.                 'id'=>$comment->postId,
  13.                 '#'=>'c'.$comment->id));
  14.     }
  15.  
  16.     $this->render('update',array('comment'=>$comment));
  17. }

这和PostController中的处理非常类似

发布评论

当添加一条评论时,他们是未发布状态,需要发布后才能被访客浏览。发布一条评论主要是修改comment的状态(status)字段。

在CommentController中我们如下添加actionApprove()方法。

 
  1. public function actionApprove()
  2. {
  3.     if(Yii::app()->request->isPostRequest)
  4.     {
  5.         $comment=$this->loadComment();
  6.         $comment->approve();
  7.         $this->redirect(array('post/show',
  8.             'id'=>$comment->postId,
  9.             '#'=>'c'.$comment->id));
  10.     }
  11.     else
  12.         throw new CHttpException(500,'Invalid request...');
  13. }

在上面的代码中,当approve方法被POST请求调用时,我们调用在Comment模块中定义的approve()方法来改变状态。然后跳转到显示这个评论所属的文章界面。

我们同时修改了Comment的actionList()方法,让它只列出未经发布的评论

 
  1. public function actionList()
  2. {
  3.     $criteria=new CDbCriteria;
  4.     $criteria->condition='Comment.status='.Comment::STATUS_PENDING;
  5.  
  6.     $pages=new CPagination(Comment::model()->count());
  7.     $pages->pageSize=self::PAGE_SIZE;
  8.     $pages->applyLimit($criteria);
  9.  
  10.     $comments=Comment::model()->with('post')->findAll($criteria);
  11.  
  12.     $this->render('list',array(
  13.         'comments'=>$comments,
  14.         'pages'=>$pages,
  15.     ));
  16. }

 

在列表的视图中,我们显示每条未发布的评论的详细内容,在底部显示显示了发布的链接。

 
  1. <?php if($comment->status==Comment::STATUS_PENDING): ?>
  2.     <span class="pending">Pending approval</span> |
  3.     <?php echo CHtml::linkButton('Approve'array(
  4.         'submit'=>array('comment/approve','id'=>$comment->id),
  5.     )); ?> |
  6. <?php endif; ?>

 

我们使用了CHtml::linkButton()而没有使用CHtml::link()是因为前者发送一个POST请求,而后者是个GET求情,GET请求并不会弹出警告信息。否则的话,我们就将会面临用户刷新页面时重发多次请求的危险。