0 follower

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

Основываясь на анализе требований, нам необходимы три портлета: «пользовательское меню», «облако тегов» и «последние комментарии». Мы реализуем их, расширив виджет CPortlet, входящий в состав Yii.

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

  • Одобрить комментарий: гиперссылка, ведущая к списку комментариев, ожидающих одобрения;
  • Создать новую запись: гиперссылка, ведущая к странице создания записи;
  • Управление записями: гиперссылка, ведущая к странице управления записями;
  • Выход из системы: кнопка, при нажатии на которую текущий пользователь выходит из системы.

1. Создание класса 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, классы которой не подключаются автоматически из соображений производительности.

2. Создание представления 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 директории, содержащей файл класса виджета. Имя файла должно быть таким же как название представления.

3. Использование портлета 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 (то есть пользователь аутентифицирован).

4. Тестирование портлета UserMenu

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

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

5. Итог

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

Found a typo or you think this page needs improvement?
Edit it on github !