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
views
katalogu 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.