Відображення записів

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


Для чого реклама?