Создание портлета пользовательского меню ======================================== Основываясь на анализе требований, нам необходимы три портлета: «пользовательское меню», «облако тегов» и «последние комментарии». Мы реализуем их, расширив виджет [CPortlet](http://www.yiiframework.com/doc/api/CPortlet), входящий в состав Yii. В этом разделе мы разработаем свой первый портлет — портлет пользовательского меню, который отображает список пунктов меню, доступных только аутентифицированным пользователям. Меню содержит четыре элемента: * Одобрить комментарий: гиперссылка, ведущая к списку комментариев, ожидающих одобрения; * Создать новую запись: гиперссылка, ведущая к странице создания записи; * Управление записями: гиперссылка, ведущая к странице управления записями; * Выход из системы: кнопка, при нажатии на которую текущий пользователь выходит из системы. Создание класса `UserMenu` ------------------------- Мы создаем класс `UserMenu` для представления логической части портлета пользовательского меню. Класс хранится в файле `/wwwroot/blog/protected/components/UserMenu.php`: ~~~ [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`. > Tip|Подсказка: Заметим, что мы явным образом подключаем класс `CPortlet`, > вызывая `Yii::import()` до первого обращения к нему. `CPortlet` является > частью официальной библиотеки расширений `zii`, классы которой не подключаются > автоматически из соображений производительности. Создание представления `userMenu` -------------------------------- Затем мы создаем представление `userMenu`, сохраненное в файле `/wwwroot/blog/protected/components/views/userMenu.php`: ~~~ [php] ~~~ > Info|Информация: По умолчанию файлы представления виджета должны помещаться в поддиректории `views` директории, содержащей файл класса виджета. Имя файла должно быть таким же как название представления. Использование портлета `UserMenu` -------------------------------- Пришло время использовать наш новый портлет `UserMenu`. Мы изменяем файл макета `/wwwroot/blog/protected/views/layouts/column2.php` следующим образом: ~~~ [php] … … ~~~ В коде выше мы вызываем метод `widget()` для генерации и выполнения экземпляра класса `UserMenu`. Поскольку портлет должен отображаться только аутентифицированным пользователям, мы вызываем `widget()` в случае, если свойство `isGuest` текущего пользователя равно `false` (то есть пользователь аутентифицирован). Тестирование портлета `UserMenu` ------------------------------- Давайте протестируем то, что у нас получилось. 1. Откроем окно браузера и введём URL `http://www.example.com/blog/index.php`. Проверим, что ничего не отображается в сайдбаре страницы. 2. Нажмём гиперссылку `Войти` и заполним регистрационную форму для входа. В случае успеха, проверим, что портлет `UserMenu` появился в сайдбаре и у него в заголовке выведено имя пользователя. 3. Нажмём гиперссылку `Выйти` в портлете `UserMenu`. Проверим, что действие выхода из системы прошло успешно, и портлет `UserMenu` исчез. Итог ---- Мы создали портлет, который легко повторно использовать. Мы можем легко снова использовать его в другом проекте, незначительно изменив или даже без модификаций. Кроме того, дизайн портлета следует философии о разделении представления и логики. Хотя мы и не указывали на это в предыдущих разделах, такая практика используется почти всюду в типичном приложении Yii.