Відображення записів ==================== У нашому додатку запис може відображатися як окремо, так і серед інших записів. Перше реалізується дією `view`, друге - `index`. У даному розділі ми змінимо обидві дії для досягнення первинних вимог. Зміна дії `view` ---------------- Дія `view` реалізована у методі `actionView()` контролера `PostController`. HTML, що віддається користувачеві, генерується із відображення `view`, який знаходиться у файлі `/wwwroot/blog/protected/views/post/view.php`. Нижче приведений код дії `view` контролера `PostController`: ~~~ [php] public function actionView() { $post=$this->loadModel(); $this->render('view',array( 'model'=>$post, )); } private $_model; public function loadModel() { if($this->_model===null) { if(isset($_GET['id'])) { if(Yii::app()->user->isGuest) $condition='status='.Post::STATUS_PUBLISHED .' OR status='.Post::STATUS_ARCHIVED; else $condition=''; $this->_model=Post::model()->findByPk($_GET['id'], $condition); } if($this->_model===null) throw new CHttpException(404,'Запитувана сторінка не існує.'); } return $this->_model; } ~~~ Наші зміни в основному торкнулися методу `loadModel()`. У ньому ми отримуємо запис із таблиці `Post`, використовуючи параметр `id` із GET. Якщо запис не знайдено, не опублікована або знаходиться у архіві, і при цьому користувач є гостем - відображаємо помилку 404. Інакше повертаємо обʼєкт запису методу `actionView()`, який передає обʼєкт відображенню. > Tip|Підказка: Yii перехоплює виключення HTTP (екземпляри класу [CHttpException]) і відображає їх, використовуючи або зумовлені, або власні шаблони. Каркас, згенерований `yiic` вже містить свій шаблон для помилок у файлі `/wwwroot/blog/protected/views/site/error.php`. При необхідності ми можемо змінити цей файл. Зміни у відображенні `view` в основному торкаються форматування та стилю відображення запису, тому на ньому ми зупинятися не будемо. Зацікавлені читачі можуть звернутися до файла `/wwwroot/blog/protected/views/post/view.php`. Зміна дії `index` ----------------- Як і в дії `view`, ми будемо змінювати дію `index` у двох місцях: метод `actionIndex()` контролера `PostController` і відображення `/wwwroot/blog/protected/views/post/index.php`. Потрібно додати підтримку відображення записів з певним тегом. Нижче наведено змінений метод `actionIndex()` контролера `PostController`: ~~~ [php] public function actionIndex() { $criteria=new CDbCriteria(array( 'condition'=>'status='.Post::STATUS_PUBLISHED, 'order'=>'update_time DESC', 'with'=>'commentCount', )); if(isset($_GET['tag'])) $criteria->addSearchCondition('tags',$_GET['tag']); $dataProvider=new CActiveDataProvider('Post', array( 'pagination'=>array( 'pageSize'=>5, ), 'criteria'=>$criteria, )); $this->render('index',array( 'dataProvider'=>$dataProvider, )); } ~~~ Спочатку ми створюємо критерій запиту для отримання списку записів. Критерій включає обмеження на одержання тільки опублікованих записів і сортування по часу їх оновлення у зворотному порядку. Так як при відображенні запису в списку ми також хочемо показувати кількість коментарів, у критерії вказується необхідність одержання звʼязку `commentCount`, описаного у `Post::relations()`. У тому випадку, коли користувач хоче отримати записи з певним тегом, ми додаємо у критерій умову пошуку тега. Використовуючи критерій ми створюємо провайдер даних, потрібний для трьох цілей. По-перше, він займається розбивкою даних на сторінки. Ми задаємо кількість результатів на сторінку рівним 5. По-друге, дані сортуються відповідно до запиту користувача. І, нарешті, провайдер віддає розбиті на сторінки відсортовані дані віджетам або відображенню. Після того, як ми закінчили із `actionIndex()`, ми змінюємо відображення `index` як показано нижче. Будемо відображати заголовок `h1` у тому випадку, коли користувач буде запитувати записи із певним тегом. ~~~ [php]

Записи із тегом

widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{items}\n{pager}", )); ?> ~~~ Варто відзначити, що для побудови списку записів ми використовуємо [CListView]. Цей віджет використовує відображення для побудови кожного окремого запису. Ми вказуємо відображення `_view`, тобто файл `/wwwroot/blog/protected/views/post/_view.php`, у якому ми можемо звертатися до запису через змінну `$data`.