В этом разделе мы разработаем свой первый конкретный портлет - портлет пользовательского меню, который отображает список пунктов меню, которые доступны только аутентифицированным пользователям. Меню содержит четыре элемента:
UserMenu
¶Мы создаем класс UserMenu
для представления логической части портлета
пользовательского меню. Класс хранится в файле
/wwwroot/blog/protected/components/UserMenu.php
, имеющим следующий код:
class UserMenu extends Portlet { public function init() { $this->title=CHtml::encode(Yii::app()->user->name); parent::init(); } protected function renderContent() { $this->render('userMenu'); } }
Класс UserMenu
наследует от класса Portlet
, созданного нами ранее. Он
переопределяет методы init()
и renderContent()
класса Portlet
. Первый
устанавливает имя текущего пользователя в качестве заголовка портлета, а второй
генерирует содержимое портлета, рендерингом представления userMenu
.
Подсказка: Заметим, что мы не включаем явно файл класса для класса
Portlet
даже учитывая, что мы ссылаемся на него в коде. Это происходит по причине, которую мы объяснили в предыдущем разделе.
userMenu
¶Затем мы создаем представление userMenu
, сохраненное в файле
/wwwroot/blog/protected/components/views/userMenu.php
:
<ul> <li> echo CHtml::link('Одобрение комментариев', array('comment/list')) . ' (' . Comment::model()->pendingCommentCount . ')'; </li> <li> echo CHtml::link('Создать новую запись',array('post/create')); </li> <li> echo CHtml::link('Управление записями',array('post/admin')); </li> <li> echo CHtml::linkButton('Выход',array( 'submit'=>'', 'params'=>array('command'=>'logout'), )); </li> </ul>
Информация: По умолчанию файлы представления виджета должны помещаться в поддиректории
views
директории, содержащей файл класса виджета. Имя файла должно быть таким же как название представления.
В представлении мы вызываем метод CHtml::link для создания необходимых
гиперссылок; мы также вызываем метод CHtml::linkButton для создания
кнопки-ссылки, которая работает как обычная кнопка. Когда нажимается кнопка,
она отправляет текущей странице неявную форму с параметром command
, значение
которого — logout
.
Для обработки щелчка по ссылке logout
, мы должны изменить метод init()
класса UserMenu
следующим образом:
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();
}
В методе init()
мы проверяем, существует ли POST-переменная command
,
значение которой - logout
. Если существует, то текущий пользователь выходит
из системы и браузер перенаправляется на домашнюю страницу приложения. Отметим,
что метод redirect()
, неявно заканчивает выполнение текущего приложения.
UserMenu
¶Пришло вермя использовать наш новый портлет UserMenu
. Мы изменяем файл макета
/wwwroot/blog/protected/views/layouts/main.php
следующим образом:
...... <div id="sidebar"> $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); </div> ......
В коде выше мы называем метод widget()
для генерации и выполнения экземпляра
класса UserMenu
. Поскольку портлет должен отображаться только
аутентифицированным пользователям, мы переключаем его свойство visible
согласно свойству isGuest
текущего пользователя.
UserMenu
¶Давайте протестируем то, что у нас получилось.
http://www.example.com/blog/index.php
. Проверим, что ничего не отображается в сайдбаре страницы.Войти
и заполним регистрационную форму для входа. В случае успеха, проверим, что портлет UserMenu
появился в сайдбаре и у него в заголовке выведено имя пользователя.Выйти
в портлете UserMenu
. Проверим, что действие выхода из системы прошло успешно, и портлет UserMenu
исчез.Мы создали портлет, который легко повторно использовать. Мы можем легко снова использовать его в другом проекте, незначительно изменив или даже без модификаций. Кроме того, дизайн портлета следует философии о разделении представления и логики. Хотя мы и не указывали на это в предыдущих разделах, такая практика используется почти всюду в типичном приложении Yii.
Signup or Login in order to comment.