Створення портлетів користувальницького меню

Грунтуючись на аналізі вимог, нам необхідні три портлети: «користувальницьке меню», «хмара тегів» та «останні коментарі». Ми реалізуємо їх, розширивши віджет 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.


Для чого реклама?