0 follower

Administrowanie komentarzami

Administrowanie komentarzami zawiera aktualizowanie, usuwanie oraz zatwierdzanie komentarzy. Operacja te są zaimplementowane jako akcje w klasie kontrolera CommentController.

1. Aktualizowanie i usuwanie komentarzami

Kod wygenerowany przez narzędzie yiic do aktualizowania oraz usuwania komentarzy pozostaje w większej części niezmieniony. Ponieważ wspieramy podgląd komentarza podczas aktualizacji komentarza, musimy tylko zmienić metodę actionUpdate() kontrolera CommentController w następujący sposób:

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));
}

Kod ten jest bardzo podobny do tego z PostController`.

2. Zatwierdzanie komentarzy

Kiedy komentarz jest nowo utworzony, oczekuje on na zatwierdzenie i musi zostać zatwierdzony jeśli ma on być widoczny dla gości. Zatwierdzanie komentarza to przede wszystkim zmiana kolumny zawierającej status komentarza.

Utworzymy metodę actionApprove() w kontrolerze CommentController następująco:

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(400,'Invalid request...');
}

W powyższym kodzie, gdy akcja zatwierdzenia approve jest wywoływana poprzez żądanie POST, wywołujemy metodę approve() zdefiniowaną w modelu komentarza Comment aby zmienić status. Następnie przekierowujemy przeglądarkę użytkownika do strony wyświetlającej wiadomość, do której należy ten komentarz.

Modyfikujemy również metodę actionList() modelu komentarza Comment aby wyświetlała listę komentarzy, które czekają na zatwierdzenie.

public function actionList()
{
    $criteria=new CDbCriteria;
    $criteria->condition='Comment.status='.Comment::STATUS_PENDING;
 
    $pages=new CPagination(Comment::model()->count($criteria));
    $pages->pageSize=self::PAGE_SIZE;
    $pages->applyLimit($criteria);
 
    $comments=Comment::model()->with('post')->findAll($criteria);
 
    $this->render('list',array(
        'comments'=>$comments,
        'pages'=>$pages,
    ));
}

W widoku list wyświetlamy szczegóły każdego komentarza, który oczekuje na zatwierdzenie. W szczególności, pokazujemy link do zatwierdzenia approve w następujący sposób:

<?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; ?>

Używamy CHtml::linkButton() zamiast CHtml::link() ponieważ pierwsza powoduje wywołanie żądania POST, w odróżnieniu od drugiej, wywołującej żądanie GET. Zaleca się aby żądania GET nie modyfikowały danych na serwerze. W przeciwnym przypadku możemy mieć do czynienia z niebezpieczeństwem, że użytkownik nieumyślnie może zmienić
dane po stronie serwera parokrotnie jeśli będzie odświeżał stronę kilka razy.