Управління коментарями
======================

Управління коментарями включає оновлення, видалення та схвалення коментарів.
Ці операції реалізовані як дії класу `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,'Невірний запит...');
}
~~~

Вище, коли дія `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/uk/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`.
