В этой статье я расскажу, как создать свой виджет (widget) в Yii.
В директории extensions создадим папку mywidgets. В ней мы будем хранить все виджеты, сделанные непосредственно нами.
Далее, в папке mywidgets создадим папку views, где будем хранить вьюсы для наших виджетов.
Как и у контроллера, у виджета может быть собственное представление. По умолчанию файлы представлений виджета находятся в поддиректории views директории, содержащей файл класса виджета. Эти представления можно рендерить при помощи вызова CWidget::render() точно так же, как и в случае с контроллером. Единственное отличие состоит в том, что для представления виджета не используются макеты. Также следует отметить, что $this в представлении указывает на экземпляр виджета, а не на экземпляр контроллера.
В папке views, создаим файл вида goper.php
Итак, прнивожу пример своего виджета:
class Goper extends CWidget{
// этот метод будет вызван внутри CBaseController::endWidget()
public function run()
{
// можель формы
$model = new Login;
// этот метод будет вызван внутри CBaseController::beginWidget()
$this->render('goper', array('model' => $model));
}
}
Файл вида goper.php
<div class="form">
<? $form=$this->beginWidget('CActiveForm', array(
'id'=>'login-form',
'enableClientValidation'=>true,
'action' => 'site/login',
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
)); ?>
<p class="note">Поля с <span class="required">*</span> обязательны для заполнения.</p>
<?=$form->errorSummary($model); ?>
<div class="row">
<?=$form->labelEx($model,'username'); ?>
<?=$form->textField($model,'username'); ?>
<?=$form->error($model,'username'); ?>
</div>
<div class="row">
<?=$form->labelEx($model,'password'); ?>
<?=$form->passwordField($model,'password'); ?>
<?=$form->error($model,'password'); ?>
</div>
<div class="row rememberMe">
<?=$form->checkBox($model,'rememberMe'); ?>
<?=$form->label($model,'rememberMe'); ?>
<?=$form->error($model,'rememberMe'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Login'); ?>
</div>
<? $this->endWidget(); ?>
</div><!-- form -->
Вставка виджета.
$this->widget('ext.mywidgets.Goper');
Вот и всё.