Грунтуючись на аналізі вимог, нам необхідні три портлети: «користувальницьке меню», «хмара тегів» та «останні коментарі». Ми реалізуємо їх, розширивши віджет 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
#Давайте протестуємо те, що у нас вийшло.
http://www.example.com/blog/index.php
.
Перевіримо, що нічого не відображається у сайдбарі сторінки.Увійти
і заповнимо реєстраційну форму для входу.
У разі успіху, перевіримо, що портлет UserMenu
зʼявився у сайдбарі
і у нього у заголовку виведено імʼя користувача.Вийти
у портлеті UserMenu
. Перевіримо, що дія
виходу із системи успішно виконана, і портлет UserMenu
зник.Ми створили портлет, який легко повторно використовувати. Ми можемо легко знову використовувати його у іншому проекті, незначно змінивши або навіть без модифікацій. Крім того, дизайн портлетів слідує філософії про розділення представлення і логіки. Хоча ми і не вказували на це у попередніх розділах, така практика використовується майже всюди у типовому додатку Yii.