MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Что такое виджет в фреймверке Yii 1.x.x
25.09.2014
00:06
Текстовые метки: Yii, виджет, widget
Раздел: Компьютер - Программирование - Язык PHP - Yii

Виджет

Виджет (widget) — это экземпляр класса CWidget или унаследованного от него. Это компонент, применяемый, в основном, с целью оформления. Виджеты обычно встраиваются в представления для формирования некоторой сложной, но в то же время самостоятельной части пользовательского интерфейса. К примеру, виджет календаря может быть использован для рендеринга сложного интерфейса календаря. Виджеты позволяют повторно использовать код пользовательского интерфейса.

Виджеты по своей сути ближе к контроллерам. Чаще всего виджеты вызываются из представлений. Пример вызова простого виджета из представления:

<?php $this->widget('path.to.WidgetClass'); ?>

Но так же, виджеты могут иметь и собственное содержание. Для использования такого виджета необходимо обозначить в коде начало и конец размещения виджета:

<?php $this->beginWidget('path.to.WidgetClass'); ?>

…некое содержимое, которое может быть использовано виджетом…

<?php $this->endWidget(); ?>

Изменить поведение виджета можно путём установки начальных значений его свойств при вызове CBaseController::beginWidget или CBaseController::widget. Например, при использовании виджета CMaskedTextField можно указать используемую маску, передав массив начальных значений свойств как показано ниже, где ключи массива являются именами свойств, а значения — начальными значениями соответствующих им свойств виджета:

<?php

$this->widget('CMaskedTextField',array(

'mask'=>'99/99/9999'

));

?>

Чтобы создать новый виджет, необходимо расширить класс CWidget и переопределить его методы init() и run():

class CMyWidget extends CWidget

{

public function init()

{

// этот метод будет вызван внутри CBaseController::beginWidget()

}

public function run()

{

// этот метод будет вызван внутри CBaseController::endWidget()

}

}

Как и у контроллера, у виджета может быть собственное представление. По умолчанию файлы представлений виджета находятся в поддиректории views директории, содержащей файл класса виджета. Эти представления можно рендерить при помощи вызова CWidget::render() точно так же, как и в случае с контроллером. Единственное отличие состоит в том, что для представления виджета не используются макеты.

Внимание! Следует отметить, что $this в представлении указывает на экземпляр виджета, а не на экземпляр контроллера.

Подсказка: свойство CWidgetFactory::widgets может быть использовано для настройки умолчаний для отдельных виджетов во всём приложении. Подробнее об этом можно прочитать в разделе «Темы оформления, глобальная настройка виджетов».

Параметры виджета

Как было сказано выше, виджет может быть вызван с параметрами. Классический пример из документации:

$this->widget('MyWidget', array('params'=>array(

'mask'=>'99/99/9999',

'title'=>'Введите дату',)));

Где mask и title - это параметры виджета. В виджете параметры попадут в публичное свойство с именем $this->params. Поэтому такое свойство нужно описать в виджете, иначе будет ошибка. Пример:

class MyWidget extends CWidget {

    // свойство $params - массив параметров виджета

    public $params = array(

        'mask'=>'11/11/1111', // Тут задано значение по-умолчанию

        'title',

    );

 

    public function run() {

        // передаем сразу весь массив параметров в представление

        $this->render('drawData',array('params' => $this->params));

    }

}

Упрощенный вариант

Параметры виджета не обязательно держать в одном массиве. Можно делать и отдельные параметры. Обращение к виджету:

$this->widget('MyWidget', array('mask'=>'99/99/9999', 'title'=>'Введите дату') );

Код виджета

class MyWidget extends CWidget {

    // Свойства виджета

    public $mask='11/11/1111'; // Тут задано значение по-умолчанию

    public $title;

 

    public function run() {

        $this->render('drawTitle',array('title' => $this->title));

    }

}

Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования