|
|
|
Component provides the *event* and *behavior* features, in addition to the *property* feature which is implemented in
|
|
|
|
its parent class [[Object]].
|
|
|
|
|
|
|
|
Event is a way to "inject" custom code into existing code at certain places. For example, a comment object can trigger
|
|
|
|
an "add" event when the user adds a comment. We can write custom code and attach it to this event so that when the event
|
|
|
|
is triggered (i.e. comment will be added), our custom code will be executed.
|
|
|
|
|
|
|
|
An event is identified by a name that should be unique within the class it is defined at. Event names are *case-sensitive*.
|
|
|
|
|
|
|
|
One or multiple PHP callbacks, called *event handlers*, could be attached to event. You can call [[trigger()]] to
|
|
|
|
raise an event. When an event is raised, the event handlers will be invoked automatically in the order they were
|
|
|
|
attached.
|
|
|
|
|
|
|
|
To attach an event handler to an event, call [[on()]]:
|
|
|
|
|
|
|
|
~~~
|
|
|
|
$comment->on('add', function($event) {
|
|
|
|
// send email notification
|
|
|
|
});
|
|
|
|
~~~
|
|
|
|
|
|
|
|
In the above, we attach an anonymous function to the "add" event of the comment.
|
|
|
|
Valid event handlers include:
|
|
|
|
|
|
|
|
- anonymous function: `function($event) { ... }`
|
|
|
|
- object method: `array($object, 'handleAdd')`
|
|
|
|
- static method: `array('Page', 'handleAdd')`
|
|
|
|
- global function: `'handleAdd'`
|
|
|
|
|
|
|
|
The signature of an event handler should be like the following:
|
|
|
|
|
|
|
|
~~~
|
|
|
|
function foo($event)
|
|
|
|
~~~
|
|
|
|
|
|
|
|
where `$event` is an [[Event]] object which includes parameters associated with the event.
|
|
|
|
|
|
|
|
You can also attach an event handler to an event when configuring a component with a configuration array. The syntax is
|
|
|
|
like the following:
|
|
|
|
|
|
|
|
~~~
|
|
|
|
array(
|
|
|
|
'on add' => function($event) { ... }
|
|
|
|
)
|
|
|
|
~~~
|
|
|
|
|
|
|
|
where `on add` stands for attaching an event to the `add` event.
|
|
|
|
|
|
|
|
You can call [[getEventHandlers()]] to retrieve all event handlers that are attached to a specified event. Because this
|
|
|
|
method returns a [[Vector]] object, we can manipulate this object to attach/detach event handlers, or adjust their
|
|
|
|
relative orders.
|
|
|
|
|
|
|
|
~~~
|
|
|
|
$handlers = $comment->getEventHandlers('add');
|
|
|
|
$handlers->insertAt(0, $callback); // attach a handler as the first one
|
|
|
|
$handlers[] = $callback; // attach a handler as the last one
|
|
|
|
unset($handlers[0]); // detach the first handler
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
|
|
A behavior is an instance of [[Behavior]] or its child class. A component can be attached with one or multiple
|
|
|
|
behaviors. When a behavior is attached to a component, its public properties and methods can be accessed via the
|
|
|
|
component directly, as if the component owns those properties and methods.
|
|
|
|
|
|
|
|
To attach a behavior to a component, declare it in [[behaviors()]], or explicitly call [[attachBehavior]]. Behaviors
|
|
|
|
declared in [[behaviors()]] are automatically attached to the corresponding component.
|
|
|
|
|
|
|
|
One can also attach a behavior to a component when configuring it with a configuration array. The syntax is like the
|
|
|
|
following:
|
|
|
|
|
|
|
|
~~~
|
|
|
|
array(
|
|
|
|
'as tree' => array(
|
|
|
|
'class' => 'Tree',
|
|
|
|
),
|
|
|
|
)
|
|
|
|
~~~
|
|
|
|
|
|
|
|
where `as tree` stands for attaching a behavior named `tree`, and the array will be passed to [[\Yii::createObject()]]
|
|
|
|
to create the behavior object.
|