beforeSave, afterSave etc - как это работает?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

beforeSave, afterSave etc - как это работает?

Сообщение Nafania »

Вопрос от новичка в Yii - не пинайте сильно :?

Суть, есть модель User, в ней вестимо метод save().

Хочу написать компонент Registration, который бы решал, что делать после save() модели User (высылать письмо или сразу логинить или чего еще).
Создаю компонент Registration.php

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

<?php
class Registration extends User {
    protected function afterSave () {
    //тут всякая логика
    }

}
?>
кладу его в папку components - автоподхват компонентов включен в конфиге

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

    'import'=>array(
        'application.models.*',
        'application.components.*',
        'application.helpers.*',
        'application.modules.*',
        'application.extensions.*'
    ), 
Однако метод afterSave() в Registration не срабатывает.

Почему он не срабатывает?
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: beforeSave, afterSave etc - как это работает?

Сообщение zibert02 »

надо так вызывать

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

public function afterSave()
        {
//чтото делаем
           return parent::afterSave();
        } 
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: beforeSave, afterSave etc - как это работает?

Сообщение Nafania »

zibert02 писал(а):надо так вызывать

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

public function afterSave()
        {
//чтото делаем
           return parent::afterSave();
        } 
Все равно не срабатывает.
save() проходит и юзер в базе, но логика из Registration не работает.

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

Re: beforeSave, afterSave etc - как это работает?

Сообщение samdark »

Покажите, как сохраняете пользователя.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: beforeSave, afterSave etc - как это работает?

Сообщение Nafania »

Sam Dark писал(а):Покажите, как сохраняете пользователя.
В контроллере UserController

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

    public function actionRegister ()
    {
        if ( !Yii::app()->user->isGuest ) {
        throw new CException('Вы уже зарегистрированы и зашли на сайт');
        }

        $User = new User('register');
        $Profile = new Profile('register');

        $this->performAjaxValidation($User, 'user-register-form');
        $this->performAjaxValidation($Profile, 'user-register-form');

        $_User = ( isset($_POST['User']) ? $_POST['User'] : array());
        $_Profile = ( isset($_POST['Profile']) ? $_POST['Profile'] : array());

        if($_User || $_Profile )
        {
        $User->attributes = $_User;
        $Profile->attributes = $_Profile;

            if( $User->validate() && $Profile->validate() )
        {
            $User->save(false);

            $Profile->profile_user_id = $User->getId();
            $Profile->save(false);
        }
        }
        $this->render('register',array(
        'User'=>$User,
        'Profile' => $Profile
        ));
    } 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: beforeSave, afterSave etc - как это работает?

Сообщение samdark »

Ну так вы работаете с User, а не с Registration. Соответственно у Registration ничего вызываться и не будет.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: beforeSave, afterSave etc - как это работает?

Сообщение Nafania »

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

Re: beforeSave, afterSave etc - как это работает?

Сообщение samdark »

Ну… либо определять afterSave() в User, либо использовать для работы с юзером Registration.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: beforeSave, afterSave etc - как это работает?

Сообщение Nafania »

То есть предлагается сделать например так

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

class User 
....
public function afterSave () {
$Registration = new Registration;
$Registration->do_something();
}
?

А есть какое-либо изящное решение с автоподхватом регистрации?
Не хотелось бы жестко прицеплять одно к другому.
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: beforeSave, afterSave etc - как это работает?

Сообщение zibert02 »

попробуйте создать событие в Registration и после save вызывайте событие
Аватара пользователя
jilizart
Сообщения: 82
Зарегистрирован: 2010.04.22, 18:56
Контактная информация:

Re: beforeSave, afterSave etc - как это работает?

Сообщение jilizart »

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

Re: beforeSave, afterSave etc - как это работает?

Сообщение samdark »

jilizart, скорее всего нет т.к.
Не хотелось бы жестко прицеплять одно к другому.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: beforeSave, afterSave etc - как это работает?

Сообщение Nafania »

Спасибо всем за советы, буду делать через эвенты.
Ответить