W części tej, utworzymy nasz pierwszy, konkretny portlet - portlet menu użytkownika,
który wyświetla listę pozycji w menu, które są dostępne tylko dla uwierzytelnionych
użytkowników. Menu zawiera cztery pozycje:
UserMenu ¶Tworzymy klasę UserMenu opisującą część logiczną portletu menu użytkownika.
Klasa ta jest zachowana w pliku /wwwroot/blog/protected/components/UserMenu.php,
który posiada następującą zawartość:
class UserMenu extends Portlet { public function init() { $this->title=CHtml::encode(Yii::app()->user->name); parent::init(); } protected function renderContent() { $this->render('userMenu'); } }
Klasa UserMenu dziedziczy z klasy Portlet, którą wcześniej utworzyliśmy.
Nadpisuje zarówno metodę init() jak i metodę renderContent() z klasy Portlet.
Pierwsza metoda ustawia tytuł jako nazwę aktualnego użytkownika; druga generuje
zawartość ciała portletu poprzez wygenerowanie widoku o nazwie userMenu.
Wskazówka: Zauważ, że nie dołączamy jawnie klasy portletu
Portlet, nawet jeśli odnosimy się do niej w kodzie. W poprzednich częściach opisaliśmy już przyczynę tego, dlaczego tak się dzieje.
userMenu ¶Następnie, tworzymy widok userMenu, który jest zapisany w pliku
/wwwroot/blog/protected/components/views/userMenu.php:
<ul> <li> echo CHtml::link('Approve Comments', array('comment/list')) . ' (' . Comment::model()->pendingCommentCount . ')'; </li> <li> echo CHtml::link('Create New Post',array('post/create')); </li> <li> echo CHtml::link('Manage Posts',array('post/admin')); </li> <li> echo CHtml::linkButton('Logout',array( 'submit'=>'', 'params'=>array('command'=>'logout'), )); </li> </ul>
Info: Domyślnie, pliki widoku dla widżetu powinny się znajdować w podkatalogu
viewskatalogu zawierającego klasę widżetu. Nazwa pliku powinna być taka sam jak
nazwa widoku.
W widoku wywołujemy metodę CHtml::link aby utworzyć potrzebne hiperłącza;
wołamy również metodę CHtml::linkButton aby utworzyć łącze będące przyciskiem,
które zadziała tak jak zwykły przycisk. Gdy przycisk jest klikany, przesyła on
niejawnie formularz do aktualnej strony wraz z parametrem command o wartości logout.
W celu odpowiedzi na kliknięcie hiperłącza logout, potrzebujemy zmodyfikować
metodę init() dla UserMenu` w następujący sposób:
public function init()
{
if(isset($_POST['command']) && $_POST['command']==='logout')
{
Yii::app()->user->logout();
$this->controller->redirect(Yii::app()->homeUrl);
}
$this->title=CHtml::encode(Yii::app()->user->name);
parent::init();
}W metodzie init(), sprawdzamy czy istnieje zmienna command w POST, której wartością
jest logout. Jeśli tak, wylogowujemy aktualnego użytkownika i przekierowujemy jego
przeglądarkę na stronę główną aplikacji. Zauważ, że metoda redirect() pośrednio zakończy
działanie aktualnej aplikacji.
UserMenu ¶Nadszedł już czas, aby użyć nasz nowo ukończony portlet UserMenu. Zmienimy
plik widoku układu /wwwroot/blog/protected/views/layouts/main.php następująco:
...... <div id="sidebar"> $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); </div> ......
W powyższym kodzie wołamy metodę widget() w celu wygenerowania i wywołania instancji
klasy UserMenu. Ponieważ portlet powinien być wyświetlany tylko dla uwierzytelnionych
użytkowników, ustawimy jej właściwość visible odpowiednio do wartości właściwości isGuest
dla aktualnego użytkownika.
UserMenu ¶Przetestujmy to co dotychczas mamy.
http://www.example.com/blog/index.php.
Upewnij się, że nic nie wyświetla się na pasku bocznym tej strony.Login i wypełnij formularz logowania. Jeśli zakończy się
to sukcesem, sprawdź czy portlet UserMenu pojawił się na pasku bocznym i czy jego
tytuł zawiera nazwę użytkownika.UserMenu. Sprawdź czy akcja wylogowania
powiodła się i portlet UserMenu portlet zniknął.To co stworzyliśmy to portlet, który można wielokrotnie, ponownie używać. Możemy
do w prosty sposób użyć ponownie w innych projektach z drobnymi lub bez żadnych
modyfikacji. Więcej, zaprojektowanie tego portletu zgadza się ściśle z filozofią
mówiącą, że warstwa logiczna i prezentacyjna powinny być rozdzielone. Chociaż
nie zwróciliśmy na to uwagi w poprzednich częsciach, praktyka taka ma miejsce
niemal wszędzie w typowych aplikacjach opartych na Yii.
Signup or Login in order to comment.