Files
yii/docs/guide/uk/basics.component.txt
2013-02-20 14:44:01 +02:00

175 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Компонент
=========
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` для доступу до властивості.