Yii-приложения состоят из компонентов–объектов, созданных согласно спецификациям. Компонент (component) - это экземпляр класса CComponent или производного от него. Использование компонента в основном включает доступ к его свойствам, а также вызов и обработку его событий. Базовый класс CComponent устанавливает то, как определяются свойства и события.
Свойство компонента схоже с публичной переменной-членом класса (public member variable). Мы можем читать или устанавливать его значение. Например:
$width=$component->textWidth; // получаем значение свойства textWidth
$component->enableCaching=true; // устанавливаем значение свойства enableCaching
Для того, чтобы создать свойство компонента необходимо просто объявить публичную переменную в классе компонента. Более гибкий вариант - определить методы, считывающие (getter) и записывающие (setter) это свойство, например:
public function getTextWidth()
{
return $this->_textWidth;
}
public function setTextWidth($value)
{
$this->_textWidth=$value;
}
В приведенном коде определено свойство textWidth
(имя нечувствительно к регистру), доступное для записи.
При чтении вызывается метод чтения getTextWidth()
, возвращающий значение свойства.
Соответственно, при записи будет вызван метод записи setTextWidth()
.
Если метод записи не определен, свойство будет доступно только для чтения, а
при попытке записи будет вызвано исключение. Использование методов чтения и
записи имеет дополнительное преимущество: при чтении или записи значения
свойства могут быть выполнены дополнительные действия (такие как проверка на корректность,
вызов события и др.).
Примечание: Есть небольшая разница в определении свойства через методы и через простое объявление переменной. В первом случае имя свойства нечувствительно к регистру, во втором - чувствительно.
События компонента - это специальные свойства, в качестве значений которых выступают методы (называемые обработчиками событий). Прикрепление метода к событию приведет к тому, что метод будет вызван автоматически при возникновении события. Поэтому поведение компонента может быть изменено совершенно отлично от закладываемого при разработке.
Событие компонента задается путем создания метода с именем, начинающимся на on
.
Подобно именам свойств, заданных через методы чтения и записи, имена событий
не чувствительны к регистру. Следующий код задает событие onClicked
:
public function onClicked($event)
{
$this->raiseEvent('onClicked', $event);
}
где $event
- это экземпляр класса CEvent или производного от него,
представляющего параметр события. К событию можно подключить обработчик, как показано ниже:
$component->onClicked=$callback;
где $callback
- это корректный callback-вызов PHP (см.
PHP-функцию call_user_func). Это может быть либо глобальная функция, либо метод класса.
В последнем случае вызову должен передаваться массив: array($object,'methodName')
.
Обработчик события должен быть определен следующим образом:
function methodName($event)
{
......
}
где $event
- это параметр, описывающий событие (происходит из вызова raiseEvent()
).
Параметр $event
- это экземпляр класса CEvent или его производного.
Как минимум, он содержит информацию о том, кто вызвал событие.
Если теперь вызвать onClicked()
, событие onClicked
будет вызвано (внутри onClicked()
), и прикрепленный обработчик
события будет запущен автоматически.
К событию может быть прикреплено несколько обработчиков.
При возникновении события обработчики будут вызваны в том порядке,
в котором они были прикреплены к событию.
Если в обработчике необходимо предотвратить вызов последующих обработчиков,
необходимо установить $event->handled в true
.
Начиная с версии 1.0.2, к компоненту была добавлена поддержка примесей (mixin) и теперь к компоненту можно прикрепить одно или несколько поведений. Поведение - это объект, чьи методы могут быть "унаследованы" компонентом, к которому прикреплены, посредством объединения функционала вместо четкой специализации (как в случае обычного наследования класса). К компоненту можно прикрепить несколько поведений и таким образом получить "множественное наследование".
Поведение классов должно реализовывать интерфейс IBehavior. Большинство поведений могут быть созданы путем расширения базового класса CBehavior. В случае, если поведение необходимо прикрепить к модели, его можно создать на основе класса CModelBehavior или класса CActiveRecordBehavior, который реализует дополнительные, специфические для модели возможности.
Чтобы воспользоваться поведением, его необходимо прикрепить к компоненту путем вызова метода поведения attach(). Далее мы вызываем метод поведения через компонент:
// $name уникально идентифицирует поведения в компоненте
$component->attachBehavior($name,$behavior);
// test() является методом $behavior
$component->test();
К прикрепленному поведению можно обращаться, как к обычному свойству компонента.
Например, если поведение с именем tree
прикреплено к компоненту, мы можем получить
ссылку на этот объект поведения следующим образом:
$behavior=$component->tree;
// эквивалентно выражению:
// $behavior=$component->asa('tree');
Поведение можно временно деактивировать таким образом, чтобы его методы были недоступны через компонент. Например:
$component->disableBehavior($name);
// выражение ниже приведет к вызову исключения
$component->test();
$component->enableBehavior($name);
// здесь все будет работать нормально
$component->test();
В случае, когда два поведения, прикрепленные к одному компоненту, имеют методы с одинаковыми именами, преимущество будет иметь метод поведения, которое было прикреплено раньше.
Использование поведений совместно с событиями дает дополнительные возможности. Поведение, прикрепленное к компоненту, может присваивать некоторые свои методы событиям компонента. В этом случае, поведение получает возможность следить или менять нормальный ход выполнения компонента.
Signup or Login in order to comment.