mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-04 07:14:06 +01:00
175 lines
11 KiB
Plaintext
175 lines
11 KiB
Plaintext
Компонент
|
||
=========
|
||
Yii-додатки складаються з компонентів-обʼєктів, створених згідно специфікацій.
|
||
Компонент (component) — це екземпляр класу [CComponent] або похідного від нього.
|
||
Використання компоненту в основному включає доступ до його властивостей, а також виклик і обробку його подій.
|
||
Базовий клас [CComponent] встановлює те, як визначаються властивості та події.
|
||
|
||
Властивість компонента
|
||
----------------------
|
||
Властивість компонента схожа на публічну змінну-член класу (public member variable).
|
||
Ми можемо читати або встановлювати його значення. Наприклад:
|
||
|
||
~~~
|
||
[php]
|
||
$width=$component->textWidth; // отримуємо значення властивості textWidth
|
||
$component->enableCaching=true; // встановлюємо значення властивості enableCaching
|
||
~~~
|
||
|
||
Для того, щоб створити властивість компоненту необхідно просто оголосити публічну змінну в класі компонента.
|
||
Більш гнучкий варіант — визначити методи, зчитуючі (getter) і записуючі (setter) цю властивість, наприклад:
|
||
|
||
~~~
|
||
[php]
|
||
public function getTextWidth()
|
||
{
|
||
return $this->_textWidth;
|
||
}
|
||
|
||
public function setTextWidth($value)
|
||
{
|
||
$this->_textWidth=$value;
|
||
}
|
||
~~~
|
||
|
||
У наведеному коді визначена властивість `textWidth` (імʼя нечутливе до регістру), доступна для запису.
|
||
|
||
При читанні викликається метод читання `getTextWidth()`, що повертає значення властивості.
|
||
Відповідно, при записі буде викликаний метод запису `setTextWidth()`.
|
||
Якщо метод запису не визначений, властивість буде доступно тільки для читання, а
|
||
при спробі запису буде викликане виключення. Використання методів читання й
|
||
запису має додаткову перевагу: при читанні або записі значення
|
||
властивості, можуть бути виконані додаткові дії (такі як перевірка на коректність,
|
||
виклик події й ін.).
|
||
|
||
>Note|Примітка: Є невелика різниця у визначенні властивості через методи та через просте
|
||
оголошення змінної. У першому випадку імʼя властивості нечутливо до регістру,
|
||
у другому — чутливо.
|
||
|
||
|
||
Події компонента
|
||
----------------
|
||
Події компоненту — це спеціальні властивості, у якості значень яких виступають
|
||
методи (обробник подій). Прикріплення методу до події приведе до того, що метод буде викликаний
|
||
автоматично при виникненні події. Тому поведінка компонента може бути
|
||
задана зовсім відмінною від тієї, що закладується при розробці.
|
||
|
||
Подія компоненту задається шляхом створення методу з іменем, що починаються на `on`.
|
||
Подібно іменам властивостей, заданих через методи читання й запису, імена подій
|
||
не чутливі до регістру. Наступний код задає подію `onClicked`:
|
||
|
||
~~~
|
||
[php]
|
||
public function onClicked($event)
|
||
{
|
||
$this->raiseEvent('onClicked', $event);
|
||
}
|
||
~~~
|
||
|
||
де `$event` — це екземпляр класу [CEvent] або похідного від нього,
|
||
що представляє параметр події. До події можна підключити обробник, як показано нижче:
|
||
|
||
~~~
|
||
[php]
|
||
$component->onClicked=$callback;
|
||
~~~
|
||
|
||
де `$callback` — це коректний callback-виклик PHP (див. PHP-функцію `call_user_func`).
|
||
Це може бути або глобальна функція, або метод класу.
|
||
В останньому випадку виклику повинен передаватись масив: `array($object,'methodName')`.
|
||
|
||
Обробник події повинен бути визначений наступним чином:
|
||
|
||
~~~
|
||
[php]
|
||
function methodName($event)
|
||
{
|
||
…
|
||
}
|
||
~~~
|
||
|
||
де `$event` — це параметр, що описує подію (відбувається із виклику `raiseEvent()`).
|
||
Параметр `$event` — це екземпляр класу [CEvent] або його похідного.
|
||
Як мінімум, він містить інформацію про те, хто викликав подію.
|
||
|
||
Обробник події може бути анонімною функцією, яка потребує наявності версії PHP 5.3+.
|
||
Наприклад:
|
||
|
||
~~~
|
||
[php]
|
||
$component->onClicked=function($event) {
|
||
…
|
||
}
|
||
~~~
|
||
|
||
Якщо тепер викликати метод `onClicked()`, подію `onClicked` буде викликано
|
||
(всередині `onClicked()`), і прикріплений обробник події буде запущений автоматично.
|
||
|
||
До події може бути прикріплене кілька обробників.
|
||
При виникненні події обробники будуть викликані в тому порядку,
|
||
у якому вони були прикріплені до події.
|
||
Якщо всередині обробника необхідно запобігти виклику наступних обробників,
|
||
необхідно встановити [$event->handled|CEvent::handled] в `true`.
|
||
|
||
|
||
Поведінки компонента
|
||
--------------------
|
||
|
||
Для компоненту була додана підтримка шаблону проектування [домішок (mixin)](http://ru.wikipedia.org/wiki/Mixin),
|
||
що дозволяє прикріпити до нього одну або кілька поведінок.
|
||
Поведінка — це обʼєкт, чиї методи «успадковуються» компонентом, до якого прикріплені,
|
||
Під «успадкуванням» мається на увазі нарощування функціоналу, а не успадкування у класичному розумінні.
|
||
До компонента можна прикріпити кілька поведінок і, таким чином, одержати множинне спадкування.
|
||
|
||
Поведінка класів повинна реалізовувати інтерфейс [IBehavior]. Більшість поведінок можуть бути створені шляхом розширення
|
||
базового класу [CBehavior]. У випадку, якщо поведінку необхідно прикріпити до [моделі](/doc/guide/basics.model), її можна
|
||
створити на основі класу [CModelBehavior] або класу [CActiveRecordBehavior], який реалізує додаткові,
|
||
специфічні для моделі, можливості.
|
||
|
||
Щоб скористатися поведінкою, її необхідно прикріпити до компонента шляхом виклику методу
|
||
[attach()|IBehavior::attach]. Далі ми викликаємо метод поведінки через компонент:
|
||
|
||
~~~
|
||
[php]
|
||
// $name унікально ідентифікує поведінки в компоненті
|
||
$component->attachBehavior($name,$behavior);
|
||
// test() є методом $behavior
|
||
$component->test();
|
||
~~~
|
||
|
||
До прикріпленої поведінки можна звертатися, як до звичайної властивості компоненту.
|
||
Наприклад, якщо поведінка з іменем `tree` прикріплена до компонента, ми можемо одержати
|
||
посилання на цей обʼєкт поведінки таким чином:
|
||
|
||
~~~
|
||
[php]
|
||
$behavior=$component->tree;
|
||
// еквівалентно виразу:
|
||
// $behavior=$component->asa('tree');
|
||
~~~
|
||
|
||
Поведінку можна тимчасово деактивувати таким чином, щоб її методи були недоступні через компонент.
|
||
Наприклад:
|
||
|
||
~~~
|
||
[php]
|
||
$component->disableBehavior($name);
|
||
// вираз нижче приведе до виклику виключення
|
||
$component->test();
|
||
$component->enableBehavior($name);
|
||
// тут все буде працювати нормально
|
||
$component->test();
|
||
~~~
|
||
|
||
У випадку, коли дві поведінки, прикріплені до одного компоненту, мають методи з однаковими іменами,
|
||
перевагу буде мати метод поведінки, яка була прикріплене першою.
|
||
|
||
Використання поведінок разом із [подіями](#component-event) дає додаткові можливості.
|
||
Поведінка, прикріплена до компонента, може привласнювати деякі свої методи подіям компоненту.
|
||
В цьому випадку, поведінка отримує можливість стежити або міняти нормальний хід виконання компоненту.
|
||
|
||
Властивості поведінки також можуть бути доступні із компонента, до якого вона привʼязана.
|
||
Властивості містять у собі як відкриті, так і визначені через геттери та/або сеттери поведінки.
|
||
Наприклад, поведінка має властивість із іменем `xyz` і привʼязана до компонента
|
||
`$a`. Тоді ми можемо використовувати вираз `$a->xyz` для доступу до властивості.
|