Метод beforeSave() не срабатывает

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
search74
Сообщения: 17
Зарегистрирован: 2014.08.18, 08:30
Контактная информация:

Метод beforeSave() не срабатывает

Сообщение search74 »

Всем привет! Только недавно начал изучать yii (1.1.15) и возник очень глупый вопрос. Прошу сильно не пинать и не отсылать на гугл, т.к. устал гуглить...
Вопрос следующий: создал первое приложение testdrive и там по умолчанию, при создании нового юзера, сохранение его данных идет в таблицу tbl_user.
Я хотел сделать, чтобы пароль сохранялся не в явном виде, а в виде хеша. Для этого в модели user (class User extends CActiveRecord) переопределяю метод beforeSave():

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

public function hashPassword($password)
    {
            return CPasswordHelper::hashPassword($password);
    }
        
        protected function beforeSave()
        {
            //перед сохранением шифруем пароль
            
            if (parent::beforeSave()===false) {
                echo "Родитель запретил переопределять!<br/>\n";
                return false;
            }
            echo "hi from beforeSave!!!<br/>\n";
            if($this->isNewRecord)
                $this->password = $this->hashPassword ($this->password);
            return true;
        }
Но почему то этот метод beforeSave() не срабатывает, подскажите плз почему...
ps в контроллере пока так прописал

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

public function actionCreate()
    {
        $model=new User;

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if(isset($_POST['User']))
        {
            $model->attributes=$_POST['User'];
            if($model->save())
                            //$this->redirect(array('view','id'=>$model->id));
                            echo "Model save";
                            //print_r($model);
        }

        $this->render('create',array(
            'model'=>$model,
        ));
    }
Истина где-то рядом

Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Метод beforeSave() не срабатывает

Сообщение sluchainiyznak »

А валидация походит? Запись ложится в базу?

ilyas.galiev
Сообщения: 39
Зарегистрирован: 2014.08.18, 10:04

Re: Метод beforeSave() не срабатывает

Сообщение ilyas.galiev »

Обычно пишут

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

...
protected function beforeSave() {
   if(parent::beforeSave()) {
      //твой код...
   }
}
...
Может, конечно, можно писать код снаружи if'a, но пока видел только так. Попробуй стандартный способ

Аватара пользователя
search74
Сообщения: 17
Зарегистрирован: 2014.08.18, 08:30
Контактная информация:

Re: Метод beforeSave() не срабатывает

Сообщение search74 »

sluchainiyznak писал(а):А валидация походит? Запись ложится в базу?
Судя по всему проходит, т.к. новые записи добавляются в таблицу...
ilyas.galiev писал(а):Обычно пишут

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

...
protected function beforeSave() {
   if(parent::beforeSave()) {
      //твой код...
   }
}
...
 
Может, конечно, можно писать код снаружи if'a, но пока видел только так. Попробуй стандартный способ
Я считаю правильнее писать через parent::beforeSave()===false,т.к. уже писали:
slavcodev писал(а):Если родительский ивент возвращает false, значит произошла ошибка и дана команда на отмену действия.
Надо учитывать что в родительском методе выполняются и события, в том числе приатаченые поведениями, которые могут отменить сохранение (и другие дествия)
Поэтому идти дальше смысла нет, останавливаемся (return false)
В общем хелп, все равно не понимаю в чем проблема...

UPD! Дико извиняюсь, вопрос снимаю! Работаю в нетбинсе и только сейчас заметил, оказывается я все это время правил файл "/demos/blog/protected/models/User.php"! а мой проект в testdrive'e... :cry:
Истина где-то рядом

ilyas.galiev
Сообщения: 39
Зарегистрирован: 2014.08.18, 10:04

Re: Метод beforeSave() не срабатывает

Сообщение ilyas.galiev »

Бывает xD

Ответить