В нашем приложении запись может показываться как отдельно, так и среди других
записей. Первое реализуется действием show, второе — list. В данном разделе
мы изменим оба действия для достижения первоначальных требований.
show ¶Действие show реализовано в методе actionShow() контроллера PostController.
Отдаваемый пользователю HTML генерируется из отображения show, находящегося
в файле /wwwroot/blog/protected/views/post/show.php.
Ниже приведён код действия show контроллера PostController:
public function actionShow()
{
$this->render('show',array(
'post'=>$this->loadPost(),
));
}
private $_post;
protected function loadPost($id=null)
{
if($this->_post===null)
{
if($id!==null || isset($_GET['id']))
$this->_post=Post::model()->findbyPk($id!==null ? $id : $_GET['id']);
if($this->_post===null || Yii::app()->user->isGuest &&
$this->_post->status!=Post::STATUS_PUBLISHED)
throw new CHttpException(404,'Кто здесь?!');
}
return $this->_post;
}Наши изменения в основном коснулись метода loadPost(). В нём мы получаем запись
из таблицы Post, используя параметр id из GET. Если запись не найдена или
не опубликована (при этом пользователь является гостем) — показываем ошибку 404.
Иначе возвращаем объект записи методу actionShow(), который передаёт объект
отображению show.
Подсказка: Yii перехватывает исключения HTTP (экземпляры класса CHttpException) и отображает их на страницах ошибок с соответствующими предопределёнными шаблонами. Процесс изменения этих шаблонов в вашем приложении будет описан в конце данного руководства.
Изменения в отображении show в основном затрагивают форматирование и стили
отображения записи, поэтому на нём мы останавливаться не будем.
list ¶Как и в действии show, мы будем изменять действие list в двух местах:
метод actionList() контроллера PostController и отображение
/wwwroot/blog/protected/views/post/list.php. Требуется добавить поддержку
отображения записей с определённым тегом.
Ниже приведён изменённый метод actionList() контроллера PostController:
public function actionList()
{
$criteria=new CDbCriteria;
$criteria->condition='status='.Post::STATUS_PUBLISHED;
$criteria->order='createTime DESC';
$withOption=array('author');
if(!empty($_GET['tag']))
{
$withOption['tagFilter']['params'][':tag']=$_GET['tag'];
$postCount=Post::model()->with($withOption)->count($criteria);
}
else
$postCount=Post::model()->count($criteria);
$pages=new CPagination($postCount);
$pages->applyLimit($criteria);
$posts=Post::model()->with($withOption)->findAll($criteria);
$this->render('list',array(
'posts'=>$posts,
'pages'=>$pages,
));
}Мы создаём критерий запроса, ограничивающий отображаемые записи опубликованными и
сортирующий их в обратном порядке в соответствии с временем их создания. После
этого мы подсчитываем общее число записей, подходящих под критерий. Это количество
используется в компоненте постраничной разбивки для определения общего количества
страниц, необходимых для отображения записей. Далее мы получаем из БД сами данные
и передаём их в отображение list.
Стоит отметить, что при заданном GET параметре tag мы делаем запрос используя
tagFilter и передавая ему значение параметра. Включение tagFilter в запрос
позволит нам сделать единственный JOIN запрос для получения записей с определённым
тегом. Без этого Yii разобьёт запрос на два (для достижения большей эффективности)
и вернёт неправильный результат.
Отображению list передаются два параметра: $posts и $pages. Первый является
списком записей, которые необходимо отобразить. Второй содержит информацию для
постраничной разбивки (такую, как общее кол-во страниц или текущая страница).
Отображение list содержит виджет постраничной
разметки, который автоматически делает разбивку на несколько страниц, если
записей достаточно много.
Signup or Login in order to comment.