Очень часто требуется иметь на сайте блок, который присутствует на каждой странице и который делает определённое действие.
Виджет не совсем подходит так как требуется навесить какую-то логику обработки. Требуется иметь такой мини контроллер, который бы легко встраивался на любую страницу и не дублировал свой код на каждой странице.. Для этих целей как раз подойдет портлет.
Портлет — подключаемый компонент пользовательского интерфейса, который рендерит фрагмент HTML-кода.
В отличие от виджета на него легко повесить обработу входящего запроса для выполнения какого-либо действия.
Создадим класс Portlet:
class Portlet extends CWidget
{
public $title; // заголовок портлета
// …другие свойства…
public function init()
{
}
public function run()
{
}
protected function renderContent()
{
// потомки класса должны переопределять этот метод
// для рендера необходимого содержимого портлета
}
}
От него уже создадим нужный портлет.
Допустим задача: выводить блок для ввода своих партнёрских кошельков(т.е дать возможность сохранять пользователю свои кошельки) на страницах личного кабинета финансового сервиса.
Создадим портлет:
Yii::import('zii.widgets.CPortlet');
class AffilateBlock extends Portlet
{
public $title='AffilateBlock';
protected function renderContent()
{
$userId = Yii::app()->request->cookies['user_id']->value;
$user = User::getByUserId($userId);
// если партнер оставил свои адреса для получения вознаграждений
if(isset($_POST['User'])){
$user->attributes = $_POST['User'];
if($user->validate()){
$user->save();
}
}
$this->render('affilateBlock', array('user'=>$user,));
}
}
Теперь чтобы вставить портлет на любую страницу достаточно написать:
widget('AffilateBlock'); ?>
Вьюха для портлета: Итого мы не дублируем контроллер для действия по сохранению кошельков, а просто ставим нужный блок в одно место.
beginWidget('CActiveForm', array(
// Please note: When you enable ajax validation, make sure the corresponding
'enableClientValidation' => true,
'clientOptions' => array(
'validateOnSubmit' => false,
'validateOnChange' => true,
), 'enableAjaxValidation' => false,
)); ?>
Your Affiliate Bitcoin address:
textField($user, 'btc', array('class' => 'i-text', 'size' => '36')); ?>
error($user, 'btc'); ?>
'btn', 'style' => 'width: 145px')); ?>
endWidget(); ?>