yii框架入门学习笔记五 评论功能完善

       其实日志评论功能和日志本身很类似,不过评论功能是基于日志的,所以,评论的增删改查行为基本都基于日志发生的,由gii生成的curd改动不是很大。需要做的反而是在日志的增删改查或者列表页面上的入口的添加。

     首先是日志评论的显示。我并没有在数据库建立实际的外键关系,首先还是要在comment类里建立与日志的关联关系并定义评论的验证规则。

 1  public  function rules() {
 2          return  array(
 3              array('content,author,email', 'required'),
 4              array('content', 'length', 'max' => 255),
 5              array('author, email, url', 'length', 'max' => 50),
 6              array('email', 'email'),
 7              array('url', 'url'),
 8         );
 9     }
10      public  function relations() {
11          return  array(
12             'post' =>  array(self::BELONGS_TO, 'Post', 'post_id'),
13         );
14     }
和post里的一样,当新增一条评论记录时,需要自动插入创建时间。
1  public  function beforeSave() {
2          if (parent::beforeSave()) {
3              if ( $this->isNewRecord)
4                  $this->create_time =  date("Y-m-d H:i:s",  time());
5              return  true;
6         } else {
7              return  false;
8         }
9     }

 评论的显示是随着日志展现的。所以是在日志的视图里房子改日志的评论,同时加入评论的表单供用户可以实时创建评论。对日志的试图进行如下修改,添加如下内容。同时view/post/下需要行政评论的视图文件。

 1 <div id="comments">
 2     <?php  if( $model->commentCount >= 1):?>
 3     <h3>
 4         <?php  echo  $model->commentCount . "comment(s)";?>
 5     </h3>
 6     <?php  $this->renderPartial('_comments',  array(
 7        'post' =>  $model,
 8         'comments' =>  $model->comments,
 9     ));?>
10     <?php  endif;?>
11 </div>

 1 <?php  foreach ( $comments  as  $comment):?>
 2 <div  class="comment" id="c<?php echo  $comment->id; ?>">
 3     <?php  echo CHtml::link("#{ $comment->id}",  $comment->getUrl( $post),  array(
 4         'class' => 'cid',
 5         'title' => 'Permalink to this comment',
 6     ));?>
 7     <div  class="author">
 8         <?php  echo  $comment->authorLink;?>says:
 9     </div>
10     <div  class="time">
11         <?php  echo  $comment->create_time;?>
12     </div>
13     <div  class="content">
14         <?php  echo  nl2br(CHtml::encode( $comment->content));?>
15     </div>
16 </div>
17 <?php  endforeach;?>
评论的试图文件里使用了生成url连接等功能的小组件
 1  public  function getUrl( $post =  null) {
 2          if ( $post ===  null)
 3              $post =  $this->post;
 4          return  $post->url . '#c' .  $this->id;
 5     }
 6      public  function getAuthorLink() {
 7          if (! empty( $this->url))
 8              return CHtml::link(CHtml::encode( $this->author),  $this->url);
 9          else
10              return CHtml::encode( $this->author);
11     }

 然后就是要在查询日志记录时顺便查询日志的相关评论信息,对post控制器做如下修改

1 postcontroller
2  public  function actionView() {
3          $post =  $this->loadModel();
4          $comment =  $this->newComment( $post);
5          $this->render('view',  array(
6             'model' =>  $post,
7             'comment' =>  $comment,
8         ));
9     }
 1  protected  function newComment( $post){
 2          $comment =  new Comment;
 3          if( isset( $_POST['ajax']) &&  $_POST['ajax'] == 'comment-form'){
 4              echo CActiveForm::validate( $comment);
 5             Yii::app()-> end();
 6         }
 7          if( isset( $_POST['Comment'])){
 8              $comment->attributes =  $_POST['Comment'];
 9              if( $post->addComment( $comment)){
10                  if( $comment->status == Comment::STATUS_PENDING)
11                     Yii::app()->user->setFlash('commentSubmitted', 'thank you...');
12                  $this->refresh();
13             }
14         }
15          return  $comment;
16     }

 评论的添加是在日志相关评论的下方提供表单

1 post.php
2  public  function addComment( $comment){
3          if(Yii::app()->params['commentNeedApproval'])
4              $comment->status = Comment::STATUS_PENDING;
5          else
6              $comment->status = Comment::STATUS_APPROVED;
7          $comment->post_id =  $this->id;
8          return  $comment->save();
9     }

 然后再次对comment的视图文件进行修改,加上ajax提交的效果

 1 <h3>发表新留言</h3>
 2     <?php  if(Yii::app()->user->hasFlash('commentSubmitted')):?>
 3     <div  class="flash-success">
 4         <?php  echo Yii::app()->user->getFlash('commentSubmitted');?>
 5     </div>
 6     <?php  else:?>
 7     <?php  $this->renderPartial('/comment/_form',  array(
 8         'model' =>  $comment,
 9     ));?>
10     <?php  endif;?>

 这样,基于日志的评论的增改和现实就完成了。

日志的评论应该有审核的功能,这样就需要开设评论的审核页面。并且不应该任何人都可以审核评论,我设计了只有admin账号可以审核评论的权限控制访问。评论的管理页就是按创建时间降序列出所有评论,同时未审核的评论放在前面,并提供审核的按钮,同时还有删除,修改的操作按钮。

 1  public  function actionIndex() {
 2          $dataProvider =  new CActiveDataProvider('Comment',  array(
 3                     'criteria' =>  array(
 4                         'with' => 'post',
 5                         'order' => 't.status,t.create_time DESC',
 6                     ),
 7                 ));
 8          $this->render('index',  array(
 9             'dataProvider' =>  $dataProvider,
10         ));
11     }

 在关系查询中,我们使用t作为主表的别名。审核的动作如下。

1  public  function actionApprove() {
2          if (Yii::app()->request->isPostRequest) {
3              $comment =  $this->loadModel( $_GET['id']);
4              $comment->approve();
5              $this->redirect( array('index'));
6         }  else {
7              throw  new CHttpException(400, '非法访问');
8         }
9     }

 审核功能其实就是把状态重置一下。

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

 然后是列表视图

 1 <div  class="comment" id="c<?php echo  $data->id; ?>">
 2 
 3     <?php
 4      echo CHtml::link("#link{ $data->id}",  $data->url,  array(
 5         'class' => 'cid',
 6         'title' => 'Permalink to this comment',
 7     ));
 8     ?>
 9 
10     <div  class="author">
11         <?php  echo  $data->authorLink;?>says on
12         <?php  echo CHtml::link(CHtml::encode( $data->post->title),  $data->post->url);?>
13     </div>
14     
15     <div  class="time">
16         <?php  if( $data->status == Comment::STATUS_PENDING):?>
17         <span  class="pending">Pending approval</span>|
18         <?php  echo CHtml::linkButton('Approve',  array(
19             'submit' =>  array('comment/approve', 'id' =>  $data->id),
20         ))?>|
21         <?php  endif;?>
22         <?php  echo CHtml::link('Update',  array('comment/update', 'id' =>  $data->id));?>
23         <?php  echo CHtml::linkButton('Delete',  array(
24             'submit' =>  array('comment/delete', 'id' =>  $data->id),
25             'confirm' => "你确定删除此条评论#{ $data->id}?",
26         ));?>|
27         <?php  echo  $data->create_time;?>
28     </div>
29     
30     <div  class="content">
31         <?php  echo  nl2br(CHtml::encode( $data->content));?>
32     </div>
33 
34 </div>

 至此,blog系统的架子也基本完成了。

 

转载于:https://www.cnblogs.com/listenRain/archive/2013/04/26/yii_study5.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值