Administrowanie komentarzami zawiera aktualizowanie, usuwanie oraz zatwierdzanie komentarzy.
Operacja te są zaimplementowane jako akcje w klasie kontrolera CommentController
.
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`.
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:
if($comment->status==Comment::STATUS_PENDING): <span class="pending">Pending approval</span> | echo CHtml::linkButton('Approve', array( 'submit'=>array('comment/approve','id'=>$comment->id), )); | 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.
Signup or Login in order to comment.