Создание портлета пользовательского меню
========================================

Основываясь на анализе требований, нам необходимы три портлета:
«пользовательское меню», «облако тегов» и «последние комментарии».
Мы реализуем их, расширив виджет [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]
<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>
~~~

> Info|Информация: По умолчанию файлы представления виджета должны помещаться в
поддиректории `views` директории, содержащей файл класса виджета. Имя файла
должно быть таким же как название представления.

Использование портлета `UserMenu`
--------------------------------

Пришло время использовать наш новый портлет `UserMenu`. Мы изменяем файл макета
`/wwwroot/blog/protected/views/layouts/column2.php` следующим образом:

~~~
[php]
…
<div id="sidebar">
	<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?>
</div>
…
~~~

В коде выше мы вызываем метод `widget()` для генерации и выполнения экземпляра
класса `UserMenu`. Поскольку портлет должен отображаться только
аутентифицированным пользователям, мы вызываем `widget()` в случае, если
свойство `isGuest` текущего пользователя равно `false` (то есть пользователь
аутентифицирован).


Тестирование портлета `UserMenu`
-------------------------------

Давайте протестируем то, что у нас получилось.

 1. Откроем окно браузера и введём URL `http://www.example.com/blog/index.php`.
    Проверим, что ничего не отображается в сайдбаре страницы.
 2. Нажмём гиперссылку `Войти` и заполним регистрационную форму для входа.
    В случае успеха, проверим, что портлет `UserMenu` появился в сайдбаре и
    у него в заголовке выведено имя пользователя.
 3. Нажмём гиперссылку `Выйти` в портлете `UserMenu`. Проверим, что действие
    выхода из системы прошло успешно, и портлет `UserMenu` исчез.


Итог
----

Мы создали портлет, который легко повторно использовать. Мы можем легко снова
использовать его в другом проекте, незначительно изменив или даже без
модификаций. Кроме того, дизайн портлета следует философии о разделении
представления и логики. Хотя мы и не указывали на это в предыдущих разделах,
такая практика используется почти всюду в типичном приложении Yii.