CActiveRecordBehavior как выполнить beforeSave() owner'a ?

Всем привет.

Я написал behavior, который расширяет CActiveRecordbehavior,

Она переопределяет событие beforeSave


public function beforeSave($event)

    {

        if ($this->owner->isNewRecord) {

                        $newMeta = new MetaData();

                        $newMeta->save();

                        $this->owner->meta_id = $newMeta->id;

                }

                //parent::beforeSave($event);

                //$this->owner->beforeSave();

    }



В то же время в active record кому это поведение назначается, вызывает свои действия в своём beforeSave методе.

Это вообще можно? Чтобы и behavior сработал, и потом изначальный свой метод вызвался.

[b]Это вообще можно? Чтобы и behavior сработал, и потом изначальный свой метод вызвался.

[/b]

  • Нет, этого сделать нельзя… изначальная суть behavior - это некоторая независимость и связывание с первоначальным объектом только через события… т.е.

beforeSave() -> onBeforeSave( event ) -> behaviors[i].events’onBeforeSave’;

Я же просил показать Вас где такая необъодимость возникла, попробывали бы найти решение…

to vamp

Не вводите пользователей в заблуждение, это элементарное действие в данном инструменте. Вы не до конца понимаете концепцию поведений. Дело в том, что на модель может быть навешано хоть 10 поведений. Более того у всех 10 вызовется beforeSave(), после чего вызовется beforeSave() модели, если все правильно делать. Так что этот workflow:

забудьте как страшный сон. ;)

to Karasko

Это элементарно, просто не забывайте из перекрытого в модели(не поведении!) beforeSave() вызывать родительский метод beforeSave() таким образом:




protected beforeSave()

{

... все что угодно ...

return parent::beforeSave();

}



либо




protected beforeSave()

{

$result=parent::beforeSave();


... все что угодно, в том числе модификация $result ...


return $result;

}



В зависимости от того, какой workflow вам необходим, подойдет первый или второй вариант.

А вообще, чтобы подобных вопросов не возникало, неплохо читать комментарии к методам, которые перекрываете. ;) Дословно:

creocoder, респект вам :-*

Именно так, вы описали работает и behavior и собственное поведение.

Мы с vamp’ом будем умнее :rolleyes: