У нашому додатку запис може відображатися як окремо, так і серед інших
записів. Перше реалізується дією 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
у тому випадку, коли користувач
буде запитувати записи із певним тегом.
<?php 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
.