Відображення записів
У нашому додатку запис може відображатися як окремо, так і серед інших
записів. Перше реалізується дією view
, друге - index
. У даному розділі
ми змінимо обидві дії для досягнення первинних вимог.
Зміна дії view
Дія view
реалізована у методі actionView()
контролера PostController
.
HTML, що віддається користувачеві, генерується із відображення view
, який знаходиться
у файлі /wwwroot/blog/protected/views/post/view.php
.
Нижче приведений код дії view
контролера PostController
:
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()
, який передає обʼєкт відображенню.
Підказка: 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
:
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
у тому випадку, коли користувач
буде запитувати записи із певним тегом.
if(!empty($_GET['tag'])): <h1>Записи із тегом <i><?php echo CHtml::encode($_GET['tag']); </i></h1> <?php endif; <?php $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{items}\n{pager}", ));
Варто відзначити, що для побудови списку записів ми використовуємо CListView.
Цей віджет використовує відображення для побудови кожного окремого запису.
Ми вказуємо відображення _view
, тобто файл
/wwwroot/blog/protected/views/post/_view.php
, у якому ми можемо
звертатися до запису через змінну $data
.