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 !