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

Основываясь на анализе требований, нам необходимы три портлета: «пользовательское меню», «облако тегов» и «последние комментарии». Мы реализуем их, расширив виджет 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> echo CHtml::link('Управление записями',array('post/admin')); ?></li>
    <li> echo CHtml::link('Одобрение комментариев',array('comment/index'))
        . 
' (' Comment::model()->pendingCommentCount ')'?></li>
    <li> 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 #

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

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

Итог #

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


Зачем реклама?