/
post.display.txt
141 lines (115 loc) · 6.97 KB
/
post.display.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
Отображение записей
===================
В нашем приложении запись может показываться как отдельно, так и среди других
записей. Первое реализуется действием `view`, второе — `index`. В данном разделе
мы изменим оба действия для достижения первоначальных требований.
Изменение действия `view`
-------------------------
Действие `view` реализовано в методе `actionView()` контроллера `PostController`.
Отдаваемый пользователю HTML генерируется из отображения `view`, находящегося
в файле `/wwwroot/blog/protected/views/post/view.php`.
Ниже приведён код действия `view` контроллера `PostController`:
~~~
[php]
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()`,
который передаёт объект отображению.
> Tip|Подсказка: 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`:
~~~
[php]
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]
<?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`.
<div class="revision">$Id: post.display.txt 2121 2010-05-10 01:31:30Z qiang.xue $</div>