Administrowanie wiadomościami przede wszystkim odnosi się do wylistowania wiadomości
w widoku administratora oraz usuwania wiadomości. Są one wykonywane odpowiednio przez operację
admin
oraz operację usuwania delete
. Kod wygenerowany przez narzędzie yiic
nie
wymaga zbytniej modyfikacji. Poniżej wyjaśniamy przede wszystkim jak te dwie operacje
zostały zaimplementowane.
Operacja admin
wyświetla wszystkie wiadomości (włączając zarówno opublikowane jak i nieopublikowane)
w widoku tabelarycznym. Widok wspiera wielokolumnowe sortowanie oraz stronicowanie. Poniżej
znajduje się metoda actionAdmin()
kontrolera PostController
:
public function actionAdmin()
{
$criteria=new CDbCriteria;
$pages=new CPagination(Post::model()->count());
$pages->applyLimit($criteria);
$sort=new CSort('Post');
$sort->defaultOrder='status ASC, createTime DESC';
$sort->applyOrder($criteria);
$posts=Post::model()->findAll($criteria);
$this->render('admin',array(
'posts'=>$posts,
'pages'=>$pages,
'sort'=>$sort,
));
}
Powyższy kod jest bardzo podobny do tego z akcji actionList()
. Główna różnica to, że
tutaj używamy obiektu CSort do reprezentowania informacji o sortowaniu (np. która
kolumna będzie posortowana i w jakim kierunku). Obiekt CSort jest używany przez
widok admin
w celu generowania odpowiednich odnośników w komórkach nagłówkowych tabelki.
Klikanie na tych linkach spowoduje, że aktualna strona zostanie odświeżona a dane
zostaną posortowane przy użyciu tej kolumny.
Poniżej znajduje się kod dla widoku admin
:
<h2>Manage Posts</h2> <table class="dataGrid"> <tr> <th> echo $sort->link('status'); </th> <th> echo $sort->link('title'); </th> <th> echo $sort->link('createTime'); </th> <th> echo $sort->link('updateTime'); </th> </tr> foreach($posts as $n=>$post): <tr class=" echo $n%2?'even':'odd';"> <td> echo CHtml::encode($post->statusText); </td> <td> echo CHtml::link(CHtml::encode($post->title), array('show','id'=>$post->id)); </td> <td> echo date('F j, Y',$post->createTime); </td> <td> echo date('F j, Y',$post->updateTime); </td> </tr> endforeach; </table> <br/> $this->widget('CLinkPager',array('pages'=>$pages));
Kod ten jest bardzo prosty. Iterujemy listę wiadomości i wyświetlamy je w postaci tabelki. W komórkach nagłówkowych tabelki używamy obiektu CSort do wygenerowania odnośników w celu sortowania. Na końcu, osadzamy widżet CLinkPager aby wyświetlał przyciski stronicowania jeśli zajdzie taka potrzeba.
Wskazówka: Podczas wyświetlania tekstu wołamy metodę CHtml::encode() do zakodowania znajdujących się w nim wpisów HTML. Chroni to przed atakami XSS.
Podczas gdy wiadomość jest wyświetlana przy użyciu operacji show
, pokazujemy link
delete
jeśli aktualny użytkownik jest właścicielem systemu. Kliknięcie na tym przycisku
spowoduje usunięcie wiadomości. Ze względu na to, że usunięcie wiadomości zmienia dane
po stronie serwera, używamy żądania POST aby wywołać usuwanie. Zatem, używamy następującego
kodu do wygenerowania przycisku usuwania delete
:
echo CHtml::linkButton('Delete',array( 'submit'=>array('post/delete','id'=>$post->id), 'confirm'=>"Are you sure to delete this post?", ));
Metoda CHtml::linkButton() generuje przycisk łącza (ang. link button), który
tak jak zwykły przycisk. Kliknięcie na ten link spowoduje przesłanie zakodowanego
formularza HTML w postaci metody POST. Tutaj określamy, że formularz powinien zostać
przesłany do URLa wygenerowane zgodnie z array('post/delete','id'=>$post->id)
.
W naszej aplikacji bloga wygenerowany URL będzie miał następującą postać
/blog/index.php?r=post/delete&id=1
, która odpowiada akcji delete
w kontrolerze PostController
.
Określiliśmy również, że okno zawierające potwierdzeniem powinno wyskoczyć w momencie
kliknięcia na ten link. Daje to użytkownikowi szansę na ponowne rozpatrzenie swojego
żądania usunięcia.
Kod dla operacji delete
jest oczywisty. Nie będziemy do wyjaśniać tutaj.
public function actionDelete()
{
if(Yii::app()->request->isPostRequest)
{
// we only allow deletion via POST request
$this->loadPost()->delete();
$this->redirect(array('list'));
}
else
throw new CHttpException(400,'Invalid request...');
}
Signup or Login in order to comment.