Управление комментариями ======================== Управление комментариями включает обновление, удаление и одобрение комментариев. Эти операции реализованы как действия класса `CommentController`. Обновление и удаление комментариев ---------------------------------- Код, сгенерированный утилитой `Gii` для обновления и удаления комментариев, остается, в основном, неизменным. Одобрение комментариев ---------------------- Недавно созданные комментарии находятся в статусе ожидающих одобрения и должны быть одобрены, чтобы стать видимыми для гостевого пользователя. Одобрение комментария — это, главным образом, изменение столбца состояния комментария. Мы создаем метод `actionApprove()` в классе `CommentController` следующим образом, ~~~ [php] public function actionApprove() { if(Yii::app()->request->isPostRequest) { $comment=$this->loadModel(); $comment->approve(); $this->redirect(array('index')); } else throw new CHttpException(400,'Invalid request...'); } ~~~ Выше, когда действие `approve` вызывается через запрос POST, мы вызываем метод `approve()`, определенный в модели `Comment`, для изменения статуса. Затем мы переадресовываем браузер пользователя к странице, отображающей запись, к которой относится этот комментарий. Естественно, потребуется создать и сам метод `approve` в модели `Comment`: ~~~ [php] public function approve() { $this->status=Comment::STATUS_APPROVED; $this->update(array('status')); } ~~~ Здесь мы просто выставляем свойство `status` комментария в `approved` согласно значению соответсвующей константы класса `Comment`: ~~~ [php] class Comment extends CActiveRecord { ... const STATUS_PENDING=1; const STATUS_APPROVED=2; .. } ~~~ Затем мы вызываем метод `update()` для того, чтобы сохранить выставленное свойство в БД. Мы также изменяем метод `actionIndex()` контроллера `CommentController`, чтобы показать все комментарии и вывести ожидающие одобрения первыми. ~~~ [php] 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, )); } ~~~ Стоит отметить, что в коде выше необходимо разрешить конфликт имён столбцов указав, что нам необходимы значения из основной таблицы `tbl_comment`. Сам конфликт возникает так как и в `tbl_post` и в `tbl_comment` есть столбцы `status` и `create_time`. Сделать это можно путём использования псевдонимов таблиц. Как описано [в руководстве](/doc/guide/ru/database.arr#disambiguating-column-names), псевдоним главной таблицы реляционного запроса всегда равен `t`. Поэтому, мы добавляем `t` к полям `status` и `create_time`. Как и отображение записей, отображение `index` контроллера `CommentController` использует [CListView] для вывода списка комментариев, который, в свою очередь, использует `/wwwroot/blog/protected/views/comment/_view.php` для вывода каждого отдельного комментария. Мы не будем детально рассматривать данный механизм. Заинтересованные читатели могут изучить соответствующий файл демонстрационного приложения: `/wwwroot/yii/demos/blog/protected/views/comment/_view.php`.