/
comment.admin.txt
113 lines (90 loc) · 3.54 KB
/
comment.admin.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
Administrowanie komentarzami
=================
Administrowanie komentarzami zawiera aktualizowanie, usuwanie oraz zatwierdzanie komentarzy.
Operacja te są zaimplementowane jako akcje w klasie kontrolera `CommentController`.
Aktualizowanie i usuwanie komentarzami
------------------------------
Kod wygenerowany przez narzędzie `yiic` do aktualizowania oraz usuwania komentarzy
pozostaje w większej części niezmieniony. Ponieważ wspieramy podgląd komentarza
podczas aktualizacji komentarza, musimy tylko zmienić metodę `actionUpdate()`
kontrolera `CommentController` w następujący sposób:
~~~
[php]
public function actionUpdate()
{
$comment=$this->loadComment();
if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
if(isset($_POST['previewComment']))
$comment->validate('update');
else if(isset($_POST['submitComment']) && $comment->save())
$this->redirect(array('post/show',
'id'=>$comment->postId,
'#'=>'c'.$comment->id));
}
$this->render('update',array('comment'=>$comment));
}
~~~
Kod ten jest bardzo podobny do tego z PostController`.
Zatwierdzanie komentarzy
------------------
Kiedy komentarz jest nowo utworzony, oczekuje on na zatwierdzenie i musi zostać zatwierdzony
jeśli ma on być widoczny dla gości. Zatwierdzanie komentarza to przede wszystkim zmiana
kolumny zawierającej status komentarza.
Utworzymy metodę `actionApprove()` w kontrolerze `CommentController` następująco:
~~~
[php]
public function actionApprove()
{
if(Yii::app()->request->isPostRequest)
{
$comment=$this->loadComment();
$comment->approve();
$this->redirect(array('post/show',
'id'=>$comment->postId,
'#'=>'c'.$comment->id));
}
else
throw new CHttpException(400,'Invalid request...');
}
~~~
W powyższym kodzie, gdy akcja zatwierdzenia `approve` jest wywoływana poprzez żądanie
POST, wywołujemy metodę `approve()` zdefiniowaną w modelu komentarza `Comment` aby zmienić
status. Następnie przekierowujemy przeglądarkę użytkownika do strony wyświetlającej wiadomość,
do której należy ten komentarz.
Modyfikujemy również metodę `actionList()` modelu komentarza `Comment` aby
wyświetlała listę komentarzy, które czekają na zatwierdzenie.
~~~
[php]
public function actionList()
{
$criteria=new CDbCriteria;
$criteria->condition='Comment.status='.Comment::STATUS_PENDING;
$pages=new CPagination(Comment::model()->count($criteria));
$pages->pageSize=self::PAGE_SIZE;
$pages->applyLimit($criteria);
$comments=Comment::model()->with('post')->findAll($criteria);
$this->render('list',array(
'comments'=>$comments,
'pages'=>$pages,
));
}
~~~
W widoku `list` wyświetlamy szczegóły każdego komentarza, który oczekuje na zatwierdzenie.
W szczególności, pokazujemy link do zatwierdzenia `approve` w następujący sposób:
~~~
[php]
<?php if($comment->status==Comment::STATUS_PENDING): ?>
<span class="pending">Pending approval</span> |
<?php echo CHtml::linkButton('Approve', array(
'submit'=>array('comment/approve','id'=>$comment->id),
)); ?> |
<?php endif; ?>
~~~
Używamy [CHtml::linkButton()] zamiast [CHtml::link()] ponieważ pierwsza powoduje wywołanie
żądania POST, w odróżnieniu od drugiej, wywołującej żądanie GET.
Zaleca się aby żądania GET nie modyfikowały danych na serwerze. W przeciwnym przypadku
możemy mieć do czynienia z niebezpieczeństwem, że użytkownik nieumyślnie może zmienić
dane po stronie serwera parokrotnie jeśli będzie odświeżał stronę kilka razy.
<div class="revision">$Id: comment.admin.txt 1335 2009-08-15 20:34:36Z qiang.xue $</div>