Yii: использование портлет

Очень часто требуется иметь на сайте блок, который присутствует на каждой странице и который делает определённое действие.

Виджет не совсем подходит так как требуется навесить какую-то логику обработки. Требуется иметь такой мини контроллер, который бы легко встраивался на любую страницу и не дублировал свой код на каждой странице.. Для этих целей как раз подойдет портлет.

Портлет — подключаемый компонент пользовательского интерфейса, который рендерит фрагмент 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(); ?>

Итого мы не дублируем контроллер для действия по сохранению кошельков, а просто ставим нужный блок в одно место.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *