Yii ブログシステム作成(12)

コメントの管理

コメントの管理に、コメントの更新・削除・承認がある。これらの操作は”CommentController”クラスの
アクションとして実装する。

見落としているのからなのかこの辺りから、省略が多くチュートリアルの説明がいい加減な気がする。

コメントの更新と削除

“CommentController”ファイルを修正する
コメント一覧ページには【http://localhost/blog/index.php?r=comment】でアクセス出来る。

・・・
  // 先頭付近に変数を宣言追加
  private $_model;

・・・

  /**
   * 
   * 操作権限
   * 修正:accessRules()
   * 
   **/
  public function accessRules()
  {
    return array(
      array(
        'allow',
        'users'=>array('@'),
      ),
      array(
        'deny',
        'users'=>array('*'),
      ),
    );
  }

・・・

  /**
   * 
   * コメント更新
   * 修正:actionUpdate()
   * 
   **/
  public function actionUpdate()
  {
    $model = $this->loadModel();
    
    // AJAXモードチェック
    if(isset($_POST['ajax']) && $_POST['ajax'] === 'comment-form')
    {
      echo CActiveForm::validate($model);
      Yii::app()->end();
    }
    
    if(isset($_POST['Comment']))
    {
      $model->attributes = $_POST['Comment'];
      
      if($model->save())
      {
        // データ保存後はコメント一覧画面に遷移
        $this->redirect(array('index'));
      }
    }
    
    // コメント更新ページにレンダリング
    $this->render(
      'update',
      array(
        'model'=>$model,
      )
    );
  }

・・・

  /**
   * 
   * コメント一覧
   * 修正: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,
      )
    );
  }

・・・

  /**
   * 
   * モデル読み込み
   * 修正:loadModel()
   * 
   **/
  public function loadModel()
  {
    if($this->_model === null)
    {
      if(isset($_GET['id']))
      {
        $this->_model = Comment::model()->findbyPk($_GET['id']);
      }
      
      if($this->_model === null)
      {
        throw new CHttpException(404, 'リクエストされたページは存在しません。');
      }
    }
    
    return $this->_model;
  }

上の部分を修正してコメントの更新・削除のロジックを修正、承認待ちのコメントが先頭にくるように修正。
デフォルトだとだれでもアクセス出来てしまうので管理者でないとアクセス出来ないように
権限の設定も同時に修正する。

コメントの管理

コメント承認が必要と設定されている場合、コメントが作成されたときコメントは承認待ちの状態になる。
ゲストユーザーが閲覧出来るようにするには承認が必要で、コメントの”status”カラムを更することで閲覧が出来る。

“CommentController”クラスにメソッドを追加

  /**
   * 
   * コメント承認
   * 
   **/
  public function actionApprove()
  {
    if(Yii::app()->request->isPostRequest)
    {
      $comment = $this->loadModel();
      $comment->approve();
      $this->redirect(array('index'));
    }
    else
    {
      throw new CHttpException(400, '無効なリクエスト');
    }
  }

“Comment”モデルにメソッドを追加

  /**
   * 
   * コメント承認処理
   * 
   **/
  public function approve()
  {
    $this->status = Comment::STATUS_APPROVED;
    $this->update(array('status'));
  }

“Comment”ビューファイルを修正

<?php
$deleteJS = <<<EOD
$('.container').on('click', '.time a.delete', function()
{
  var th = $(this),
    container = th.closest('div.comment'),
    id = container.attr('id').slice(1);
  
  if(confirm('コメントを削除します #'+id+'?'))
  {
    $.ajax(
    {
      url:th.attr('href'),
      type:'POST'
    }).done(function()
    {
      container.slideUp()
    });
  }
  
  return false;
});
EOD;

<pre>
上記コードでは、POSTリクエスト経由で"approve"アクションが呼ばれたときに、"Comment"モデルで
定義した"approve()"メソッドを呼んでステータスを変更する。
それから、このコメントが属する記事を表示するページにブラウザをリダイレクトする。
</pre>

Yii::app()->getClientScript()->registerScript('delete', $deleteJS);
?>

<div class="comment" id="c<?php echo $data->id; ?>">
  <?php
    echo CHtml::link("#{$data->id}", $data->url, array(
      'class'=>'cid',
      'title'=>'Permalink to this comment',
    ));
  ?>
  
  <div class="author">
    <?php echo $data->authorLink; ?> says on
    <?php echo CHtml::link(CHtml::encode($data->post->title), $data->post->url); ?>
  </div>
  
  <div class="time">
    <?php if($data->status == Comment::STATUS_PENDING): ?>
      <span class="pending">未承認</span> |
      <?php
        echo CHtml::linkButton(
          '承認',
          array(
            'submit'=>array('comment/approve', 'id'=>$data->id),
          )
        );
      ?> |
    <?php endif;?>
    <?php echo CHtml::link('更新', array('comment/update', 'id'=>$data->id)); ?> |
    <?php echo CHtml::link('削除', array('comment/delete', 'id'=>$data->id), array('class'=>'delete')); ?> |
    <?php echo date('F j, Y \a\t h:i a', $data->create_time); ?>
  </div>
  
  <div class="content">
    <?php echo nl2br(CHtml::encode($data->content)); ?>
  </div>
  <hr>
</div><!-- comment -->

■コメント一覧画面
yii046

■コメント承認
yii047

■コメント削除ポップアップ
yii048

■コメント削除後
yii049

参考サイト:
http://www.yiiframework.com/doc/blog/1.1/ja/comment.admin

Comments are closed.