beforeSave() редактирование записи

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Final
Сообщения: 4
Зарегистрирован: 2017.10.19, 14:41

beforeSave() редактирование записи

Сообщение Final »

данные в поле birthday вводятся вручную и нужно сохранить в базу 4 последних символа из 10 вводимых, но никак не получается редактировать запись перед сохранением

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

class SignupForm extends Model
{

    public $username;
    public $email;
    public $password;
    public $birthday;
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['username', 'trim'],
            ['username', 'required'],
            ['username', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This username has already been taken.'],
            ['username', 'string', 'min' => 2, 'max' => 255],
            ['email', 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            ['email', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This email address has already been taken.'],
//            ['password', 'required'],
//            ['password', 'string', 'min' => 3],
            ['birthday', 'required'],
            ['birthday', 'string', 'min' => 10, 'max' => 10]
        ];
    }

    /**
     * Signs user up.
     *
     * @return User|null the saved model or null if saving fails
     */
    public function signup()
    {

        if (!$this->validate()) {
            return null;
        }

        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->birthday);
        $user->generateAuthKey();
        return $user->save() ? $user : null;
    }

    public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->birthday = substr('$birthday', 6,4);
            return true;
        } else {
            return false;
        }
    }

}
Последний раз редактировалось Final 2017.11.02, 09:55, всего редактировалось 1 раз.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: beforeSave() редактирование записи

Сообщение someweb »

А зачем вы непонятную строку передаете: substr('$birthday', 6,4)?
Надо $this->birthday передавать.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Final
Сообщения: 4
Зарегистрирован: 2017.10.19, 14:41

Re: beforeSave() редактирование записи

Сообщение Final »

someweb писал(а): 2017.10.19, 18:01 А зачем вы непонятную строку передаете: substr('$birthday', 6,4)?
Надо $this->birthday передавать.
Так я пытался сохранить 4 последних символа из 10...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() редактирование записи

Сообщение zelenin »

Final писал(а): 2017.10.19, 18:17
someweb писал(а): 2017.10.19, 18:01 А зачем вы непонятную строку передаете: substr('$birthday', 6,4)?
Надо $this->birthday передавать.
Так я пытался сохранить 4 последних символа из 10...
...от строки '$birthday'
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: beforeSave() редактирование записи

Сообщение caHek2x »

боюсь вы не понимаете о чем вам говорят ...
$this->birthday = substr($this->birthday, 6,4);
а вы указали в кавычках какоето слово ... и хоть вам кажется что вы указали переменную но в одинарных кавычках это воспримется как просто текст ...
а еще можно так:
$this->birthday = substr($this->birthday, -4);
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: beforeSave() редактирование записи

Сообщение Alex@ »

caHek2x писал(а): 2017.10.19, 19:29 боюсь вы не понимаете о чем вам говорят ...
$this->birthday = substr($this->birthday, 6,4);
а вы указали в кавычках какоето слово ... и хоть вам кажется что вы указали переменную но в одинарных кавычках это воспримется как просто текст ...
а еще можно так:
$this->birthday = substr($this->birthday, -4);
а зачем вообще так изворачиваться?????

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

$this->birthday = date('Y',strtotime($this->birthday));
и зачем $this->birthday хранить в БД как строка???

сорян $this->birthday = date('Y',strtotime($this->birthday)); это не потеме...
Последний раз редактировалось Alex@ 2017.10.19, 20:15, всего редактировалось 1 раз.
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: beforeSave() редактирование записи

Сообщение Alex@ »

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

public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->birthday = substr('$birthday', 6,4);
            return true;
        } else {
            return false;
        }
    }
В классе Model нет вообще beforeSave есть в ActiveRecords.
и не совсем понятно

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

$user->setPassword($this->birthday);
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() редактирование записи

Сообщение zelenin »

Alex@ писал(а): 2017.10.19, 20:05
caHek2x писал(а): 2017.10.19, 19:29 боюсь вы не понимаете о чем вам говорят ...
$this->birthday = substr($this->birthday, 6,4);
а вы указали в кавычках какоето слово ... и хоть вам кажется что вы указали переменную но в одинарных кавычках это воспримется как просто текст ...
а еще можно так:
$this->birthday = substr($this->birthday, -4);
а зачем вообще так изворачиваться?????
чтобы из даты строкой извлечь год
Alex@ писал(а): 2017.10.19, 20:05

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

$this->birthday = date('Y',strtotime($this->birthday));
плохой вариант
Alex@ писал(а): 2017.10.19, 20:05и зачем $this->birthday хранить в БД как строка???
хочется. выборки не будет делать, формат кастомный. нерационально, но почему нет?
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: beforeSave() редактирование записи

Сообщение Alex@ »

реализация не очень)))
на крайняк тогда можно так заморочиться

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

['birthday', 'filter', 'filter' => function ($value) {
			return substr($this->birthday, -4);
		}],
да и вообще какой-то бред придуман в БД хранить пароль из последних 4 чисел даты рождения
Последний раз редактировалось Alex@ 2017.10.19, 20:25, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() редактирование записи

Сообщение zelenin »

Alex@ писал(а): 2017.10.19, 20:22 реализация не очень)))
на крайняк тогда можно так заморочиться

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

['birthday', 'filter', 'filter' => function ($value) {
			return substr($this->birthday, -4);
		}],
во что превратится birthday после второго сохраненения?
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: beforeSave() редактирование записи

Сообщение Alex@ »

zelenin писал(а): 2017.10.19, 20:24
Alex@ писал(а): 2017.10.19, 20:22 реализация не очень)))
на крайняк тогда можно так заморочиться

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

['birthday', 'filter', 'filter' => function ($value) {
			return substr($this->birthday, -4);
		}],
во что превратится birthday после второго сохраненения?
это форма регистрации а не доступа к таблице User
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() редактирование записи

Сообщение zelenin »

Alex@ писал(а): 2017.10.19, 20:28
zelenin писал(а): 2017.10.19, 20:24
Alex@ писал(а): 2017.10.19, 20:22 реализация не очень)))
на крайняк тогда можно так заморочиться

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

['birthday', 'filter', 'filter' => function ($value) {
			return substr($this->birthday, -4);
		}],
во что превратится birthday после второго сохраненения?
это форма регистрации а не доступа к таблице User
тем не менее, если форма не пройдет валидацию, то значение будет испорчено.

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

$model = new Form;
if(isPost()) {
    $model->load(...);
    if($model->validate()) {  //  если валидация не отработает, то форма отренедерится заново с испорчеными данными
        ...
        $this->redirect(...);
    }
}

$this->render(...);
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: beforeSave() редактирование записи

Сообщение Alex@ »

да согласен
тогда надо вручную в методе signup присваивать просто в переменную $birthday

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

public function signup()
    {

        if (!$this->validate()) {
            return false;
        }

        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $birthday = substr($this->birthday, -4);
        $user->setPassword($birthday);
        $user->generateAuthKey();
        return $user->save();
    }
   

но не в beforeSave($insert)
Ответить