0 follower

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

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

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

1. Создание класса UserMenu

Мы создаем класс UserMenu для представления логической части портлета пользовательского меню. Класс хранится в файле /wwwroot/blog/protected/components/UserMenu.php, имеющим следующий код:

<?php
class UserMenu extends Portlet
{
    public function init()
    {
        $this->title=CHtml::encode(Yii::app()->user->name);
        parent::init();
    }
 
    protected function renderContent()
    {
        $this->render('userMenu');
    }
}

Класс UserMenu наследует от класса Portlet, созданного нами ранее. Он переопределяет методы init() и renderContent() класса Portlet. Первый устанавливает имя текущего пользователя в качестве заголовка портлета, а второй генерирует содержимое портлета, рендерингом представления userMenu.

Подсказка: Заметим, что мы не включаем явно файл класса для класса Portlet даже учитывая, что мы ссылаемся на него в коде. Это происходит по причине, которую мы объяснили в предыдущем разделе.

2. Создание представления userMenu

Затем мы создаем представление userMenu, сохраненное в файле /wwwroot/blog/protected/components/views/userMenu.php:

<ul>
<li><?php echo CHtml::link('Одобрение комментариев', array('comment/list'))
    . ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
<li><?php echo CHtml::link('Создать новую запись',array('post/create')); ?></li>
<li><?php echo CHtml::link('Управление записями',array('post/admin')); ?></li>
<li><?php echo CHtml::linkButton('Выход',array(
    'submit'=>'',
    'params'=>array('command'=>'logout'),
)); ?></li>
</ul>

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

В представлении мы вызываем метод CHtml::link для создания необходимых гиперссылок; мы также вызываем метод CHtml::linkButton для создания кнопки-ссылки, которая работает как обычная кнопка. Когда нажимается кнопка, она отправляет текущей странице неявную форму с параметром command, значение которого — logout.

Для обработки щелчка по ссылке logout, мы должны изменить метод init() класса UserMenu следующим образом:

public function init()
{
    if(isset($_POST['command']) && $_POST['command']==='logout')
    {
        Yii::app()->user->logout();
        $this->controller->redirect(Yii::app()->homeUrl);
    }
 
    $this->title=CHtml::encode(Yii::app()->user->name);
    parent::init();
}

В методе init() мы проверяем, существует ли POST-переменная command, значение которой - logout. Если существует, то текущий пользователь выходит из системы и браузер перенаправляется на домашнюю страницу приложения. Отметим, что метод redirect(), неявно заканчивает выполнение текущего приложения.

3. Использование портлета UserMenu

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

......
 
<div id="sidebar">
 
<?php $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); ?>
 
</div>
 
......

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

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

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

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

5. Итог

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