zoukankan      html  css  js  c++  java
  • 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系统的架子也基本完成了。

  • 相关阅读:
    yaml文件执行后常见错误解决
    动态存储管理实战:GlusterFS
    Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)
    Kubernetes 存储系统 Storage 介绍:PV,PVC,SC
    在容器中管理数据的两种方式
    k8s 如何关联pvc到特定的pv
    Mysqldump 的 的 6 大使用场景的导出命令
    Docker 容器日志管理
    k8s中节点级别的日志
    k8s中pod的容器日志查看命令
  • 原文地址:https://www.cnblogs.com/listenRain/p/yii_study5.html
Copyright © 2011-2022 走看看