Створення портлетів користувальницького меню ============================================ Грунтуючись на аналізі вимог, нам необхідні три портлети: «користувальницьке меню», «хмара тегів» та «останні коментарі». Ми реалізуємо їх, розширивши віджет [CPortlet](http://www.yiiframework.com/doc/api/CPortlet), що входить до складу Yii. У цьому розділі ми розробимо свій перший портлет — портлет користувальницького меню, який відображає список пунктів меню, доступних тільки аутентифікованим користувачам. Меню містить чотири елементи: * Ухвалити коментар: гіперпосилання, що веде до списку коментарів, які очікують схвалення; * Створити новий запис: гіперпосилання, що веде до сторінки створення запису; * Управління записами: гіперпосилання, що веде до сторінки управління записами; * Вихід із системи: кнопка, при натисканні на яку поточний користувач виходить із системи. Створення класа `UserMenu` ------------------------- Ми створюємо клас `UserMenu` для представлення логічної частини портлетів користувальницького меню. Клас зберігається у файлі `/wwwroot/blog/protected/components/UserMenu.php`: ~~~ [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`. > Tip|Підказка: Зауважимо, що ми явним чином підключаємо клас `CPortlet`, викликаючи `Yii::import()` до першого звернення до нього. `CPortlet` є частиною офіційної бібліотеки розширень `zii`, класи якої не підключаються автоматично з міркувань продуктивності. Створення представлення `userMenu` ---------------------------------- Потім ми створюємо представлення `userMenu`, збережене у файлі `/wwwroot/blog/protected/components/views/userMenu.php`: ~~~ [php] ~~~ > Info|Інформація: За замовчуванням файли представлення віджета повинні поміщатися у піддиректорію `views` директорії, що містить файл класу віджета. Імʼя файлу має бути таким же, як назва представлення. Використання портлета `UserMenu` -------------------------------- Прийшов час використовувати наш новий портлет `UserMenu`. Ми змінюємо файл макету `/wwwroot/blog/protected/views/layouts/column2.php` наступним чином: ~~~ [php] … … ~~~ У коді вище ми викликаємо метод `widget()` для генерації і виконання екземпляра класу `UserMenu`. Оскільки портлет повинен відображатися тільки аутентифікованим користувачам, ми викликаємо `widget()` у разі, якщо властивість `isGuest` поточного користувача є `false` (тобто користувач аутентифікований). Тестування портлета `UserMenu` ------------------------------ Давайте протестуємо те, що у нас вийшло. 1. Відкриємо вікно браузера і введемо URL `http://www.example.com/blog/index.php`. Перевіримо, що нічого не відображається у сайдбарі сторінки. 2. Натиснемо гіперпосилання `Увійти` і заповнимо реєстраційну форму для входу. У разі успіху, перевіримо, що портлет `UserMenu` зʼявився у сайдбарі і у нього у заголовку виведено імʼя користувача. 3. Натиснемо гіперпосилання `Вийти` у портлеті `UserMenu`. Перевіримо, що дія виходу із системи успішно виконана, і портлет `UserMenu` зник. Підсумок -------- Ми створили портлет, який легко повторно використовувати. Ми можемо легко знову використовувати його у іншому проекті, незначно змінивши або навіть без модифікацій. Крім того, дизайн портлетів слідує філософії про розділення представлення і логіки. Хоча ми і не вказували на це у попередніх розділах, така практика використовується майже всюди у типовому додатку Yii.