Создание портлета пользовательского меню
Основываясь на анализе требований, нам необходимы три портлета: «пользовательское меню», «облако тегов» и «последние комментарии». Мы реализуем их, расширив виджет CPortlet, входящий в состав Yii.
В этом разделе мы разработаем свой первый портлет — портлет пользовательского меню, который отображает список пунктов меню, доступных только аутентифицированным пользователям. Меню содержит четыре элемента:
- Одобрить комментарий: гиперссылка, ведущая к списку комментариев, ожидающих одобрения;
- Создать новую запись: гиперссылка, ведущая к странице создания записи;
- Управление записями: гиперссылка, ведущая к странице управления записями;
- Выход из системы: кнопка, при нажатии на которую текущий пользователь выходит из системы.
Создание класса UserMenu
Мы создаем класс UserMenu
для представления логической части портлета
пользовательского меню. Класс хранится в файле
/wwwroot/blog/protected/components/UserMenu.php
:
Yii::import('zii.widgets.CPortlet'); class UserMenu extends CPortlet { public function init() { $this->title=CHtml::encode(Yii::app()->user->name); parent::init(); } protected function renderContent() { $this->render('userMenu'); } }
Класс UserMenu
наследуется от класса CPortlet
из библиотеки zii
. Он
переопределяет методы init()
и renderContent()
класса CPortlet
. Первый
устанавливает имя текущего пользователя в качестве заголовка портлета, а второй
генерирует содержимое портлета, рендерингом представления userMenu
.
Подсказка: Заметим, что мы явным образом подключаем класс
CPortlet
, вызываяYii::import()
до первого обращения к нему.CPortlet
является частью официальной библиотеки расширенийzii
, классы которой не подключаются автоматически из соображений производительности.
Создание представления userMenu
Затем мы создаем представление userMenu
, сохраненное в файле
/wwwroot/blog/protected/components/views/userMenu.php
:
<ul> <li><?php echo CHtml::link('Создать новую запись',array('post/create')); </li> <li><?php echo CHtml::link('Управление записями',array('post/admin')); </li> <li><?php echo CHtml::link('Одобрение комментариев',array('comment/index')) . ' (' . Comment::model()->pendingCommentCount . ')'; </li> <li><?php echo CHtml::link('Выход',array('site/logout')); </li> </ul>
Информация: По умолчанию файлы представления виджета должны помещаться в поддиректории
views
директории, содержащей файл класса виджета. Имя файла должно быть таким же как название представления.
Использование портлета UserMenu
Пришло время использовать наш новый портлет UserMenu
. Мы изменяем файл макета
/wwwroot/blog/protected/views/layouts/column2.php
следующим образом:
… <div id="sidebar"> <?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); </div> …
В коде выше мы вызываем метод widget()
для генерации и выполнения экземпляра
класса UserMenu
. Поскольку портлет должен отображаться только
аутентифицированным пользователям, мы вызываем widget()
в случае, если
свойство isGuest
текущего пользователя равно false
(то есть пользователь
аутентифицирован).
Тестирование портлета UserMenu
Давайте протестируем то, что у нас получилось.
- Откроем окно браузера и введём URL
http://www.example.com/blog/index.php
. Проверим, что ничего не отображается в сайдбаре страницы. - Нажмём гиперссылку
Войти
и заполним регистрационную форму для входа. В случае успеха, проверим, что портлетUserMenu
появился в сайдбаре и у него в заголовке выведено имя пользователя. - Нажмём гиперссылку
Выйти
в портлетеUserMenu
. Проверим, что действие выхода из системы прошло успешно, и портлетUserMenu
исчез.
Итог
Мы создали портлет, который легко повторно использовать. Мы можем легко снова использовать его в другом проекте, незначительно изменив или даже без модификаций. Кроме того, дизайн портлета следует философии о разделении представления и логики. Хотя мы и не указывали на это в предыдущих разделах, такая практика используется почти всюду в типичном приложении Yii.