onAfterValidate() и события

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

onAfterValidate() и события

Сообщение youroff »

Нигде не могу найти более менее подробного объяснения событиям в Yii.
Вот мне, например, нужно после валидации объекта CFormModel неким образом переработать его поля и сохранить в виде нового свойства этого объекта. Как это правильно сделать при помощи onAfterValidate()?
Будет здорово, если на основе данного примера уважаемый Александр расширит соответствующую статью в рецептах: http://yiiframework.ru/doc/cookbook/ru/core.events
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: onAfterValidate() и события

Сообщение samdark »

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

function onAfterValidate($event){
  // модель свалидирована и наполнена
  // хешируем пароль
  $this->password = sha1($this->password.'salt');
  
  return parent::onAfterValidate($event);
}
 
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: onAfterValidate() и события

Сообщение youroff »

Извиняюсь за тупость, но можно как-то пояснить, что тут происходит?
Откуда берется $event и как он потом используется? Или это как бы замкнутая конструкция и никакого внешнего обслуживания не требуется?
Каково назначение вызова parent::onAfterValidate($event)?

По ссылке в рецептах тоже, кстати, не понятно, как все происходит:
Сначала мы определяем метод public function onNewComment($event), а потом в примере использования делаем присваивание свойству:
$blogModel->onNewComment = array($notifier, 'comment');
Как так?
И обработчик события живет в одном файле с моделью, где он используется? Судя по примеру, это так, но если где-то еще понадобится такой же обработчик -- он сработает?

Скорее всего я не понимаю базовый принцип событий... где можно прочитать об этом?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: onAfterValidate() и события

Сообщение samdark »

$event передаётся родительским классом CModel. Никакого внешнего обслуживания не требуется.

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

parent::onAfterValidate($event) 
 
нужен, чтобы отработали все остальные события, навешанные в поведениях.

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

$blogModel->onNewComment = array($notifier, 'comment');
 
Тут у нас назначение callback-метода. Т.е. при вызове onNewComment() в том числе отработает и $notifier->comment(). Используется в основном в поведениях и в своих моделях. Посмотрите исходник CModel, станет понятно, что эти методы вызывает.
если где-то еще понадобится такой же обработчик -- он сработает
Если его назначить, то сработает.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: onAfterValidate() и события

Сообщение samdark »

Вообще смысл событий: объявляется некое событие и его обработчик по умолчанию. На событие могут подписаться какие-то сторонние методы. При вызове события (Обычно это делает какой-то компонент. В Yii это чаще всего модель) последовательно вызываются все подписанные методы-обработчики.
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: onAfterValidate() и события

Сообщение youroff »

Большое спасибо за консультацию и отдельное спасибо за документацию и примеры! Это великая работа!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: onAfterValidate() и события

Сообщение samdark »

Стоит ли переместить ответы в рецепт?
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: onAfterValidate() и события

Сообщение youroff »

Точно не повредит. А вообще, конечно, тему поведений и событий было бы правильнее раскрывать в виде отдельных подробных статей, уж очень она неочевидно раскрыта в основной документации и в api. Я бы и сам поучаствовал, не будь чайником -- ну может позже, когда разовьюсь :)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: onAfterValidate() и события

Сообщение slavcodev »

я давно уже жду когда появится пример по интереснее с событиями, чтоб понять что это такое, и для чего нужно.
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: onAfterValidate() и события

Сообщение samdark »

Переписал рецепт. Теперь описание максимально подробное и с примерами: http://yiiframework.ru/doc/cookbook/ru/core.events
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: onAfterValidate() и события

Сообщение youroff »

Супер! Спасибо огромное! :)
Ответить