В нашем приложении запись может показываться как отдельно, так и среди других
записей. Первое реализуется действием 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 содержит виджет постраничной
разметки, который автоматически делает разбивку на несколько страниц, если
записей достаточно много.
Be the first person to leave a comment
Please login to leave your comment.