[РЕШЕНО] Конструктор поведения

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Закрыто
mitrich
Сообщения: 53
Зарегистрирован: 2012.09.03, 20:57

[РЕШЕНО] Конструктор поведения

Сообщение mitrich »

Привет всем.

Начну сразу с примера.

Создаем класс MyForm который extended CFormModel. В нем public свойство $a; Также в нем метод init в котором $this->a = 5;

Создаем пустой класс поведения Behavior extended CBehavior. Подключаем поведение к классу MyForm. Задача убрать метод init из класса MyForm и перенести его в поведение.

Пытаюсь делать так. В классе поведения пишу конструктор:

Код: Выделить всё

public function __construct() {
$this->owner->a = 5;
}
однако $this->owner в этот момент NULL и соответственно такой код выдает ошибку.

Пытаюсь прописать в классе поведения:

Код: Выделить всё

public function init() {
$this->owner->a = 5;
}
однако этот метод не дергается системой при инициализации вообще.

Вопрос звучит так. Где прописать код, который должен выполниться при инициализации поведения, чтобы в этом коде был доступен владелец поведения $this->owner ?

Пока что я выкрутился таким образом, что вручную в контроллере вызываю метод init поведения, после того как создал экземпляр класса MyForm:

Код: Выделить всё

$model = new MyForm();
$model->Behavior->init();
но полагаю это костылевое решение, не так ли?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Конструктор поведения

Сообщение ElisDN »

Код: Выделить всё

public function attach($owner){
    $owner->a = 5;
    parent::attach($owner);
}
mitrich
Сообщения: 53
Зарегистрирован: 2012.09.03, 20:57

Re: Конструктор поведения

Сообщение mitrich »

Спасибо огромное, помогло!

Объясните пожалуйста подробнее что происходит согласно этого кода? Чтобы понимать кухню.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Конструктор поведения

Сообщение ElisDN »

Этот метод вызывается после init() при прикреплении экземпляра поведения к модели. Просто декорируем его и всё.

И не забывайте всегда передавать очередь дальше:

Код: Выделить всё

parent::__construct();
parent::init();
parent::attach($owner);
mitrich
Сообщения: 53
Зарегистрирован: 2012.09.03, 20:57

Re: Конструктор поведения

Сообщение mitrich »

По сути это и получился "конструктор" который я хотел, да еще и с $owner - прям по заказу. Еще раз спасибо за help. :D
Закрыто