Страница 1 из 1

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

Добавлено: 2014.08.18, 08:42
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,
        ));
    }

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

Добавлено: 2014.08.18, 09:58
sluchainiyznak
А валидация походит? Запись ложится в базу?

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

Добавлено: 2014.08.18, 10:21
ilyas.galiev
Обычно пишут

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

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

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

Добавлено: 2014.08.18, 10:52
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:

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

Добавлено: 2014.08.18, 11:43
ilyas.galiev
Бывает xD