beforeSave() - как правильно?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

beforeSave() - как правильно?

Сообщение porcelanosa »

Все ли тут правильно? Смущает параметр $insert - из документации, я не совсем поняла, в какой ветке срабатывает update? Там где return false?
Мне надо что бы нижеследующий код срабатывал всегда.

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

public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->publish_date = strtotime(Yii::$app->request->post('publish_date'));
            return true;
        } else {
            return false;
        }
    }
У меня не срабатывает.
Правда у меня и при попытке изменить в контроллере значение publish_date перед сохранением не работает.

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

    public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $model->publish_date = strtotime(Yii::$app->request->post('publish_date'));
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['update', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
Поле publish_date - помечено как безопасное.
В чем может быть дело?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

porcelanosa писал(а):Все ли тут правильно? Смущает параметр $insert - из документации, я не совсем поняла, в какой ветке срабатывает update? Там где return false?
это вообще не относится к делу. если false, то save не работает
porcelanosa писал(а):Мне надо что бы нижеследующий код срабатывал всегда.

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

public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->publish_date = strtotime(Yii::$app->request->post('publish_date'));
            return true;
        } else {
            return false;
        }
    } 
не надо request использовать в модели.
porcelanosa писал(а): Поле publish_date - помечено как безопасное.
В чем может быть дело?
да кто же его знает. xdebug и минуту времени и у вас есть ответ.
kilimandjaro2
Сообщения: 7
Зарегистрирован: 2015.05.29, 06:21

Re: beforeSave() - как правильно?

Сообщение kilimandjaro2 »

Мне надо что бы нижеследующий код срабатывал всегда., тогда не делайте if (parent::beforeSave($insert)) { пишите сразу что делать, он срабатывает всегда
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

kilimandjaro2 писал(а):Мне надо что бы нижеследующий код срабатывал всегда., тогда не делайте if (parent::beforeSave($insert)) { пишите сразу что делать, он срабатывает всегда
правильно она пишет, только лучше делать так:

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

$this->publish_date = strtotime(Yii::$app->request->post('publish_date'));
return parent::beforeSave($insert);
 
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: beforeSave() - как правильно?

Сообщение porcelanosa »

zelenin писал(а):не надо request использовать в модели.
А что же там можно использовать для получения $_POST ?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: beforeSave() - как правильно?

Сообщение porcelanosa »

Поняла, как сделать.

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

public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->publish_date= strtotime($this->publish_date);
            return parent::beforeSave($insert);
        } else {
            return false;
        }
    }
Теперь работает.
Получается массив request->post() обнуляется что ли? После использования в $model->load() ?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: beforeSave() - как правильно?

Сообщение porcelanosa »

И какие-то проблемы в использовании TIMESTAMP - не сохраняет если поле в таблице этого типа.
Если INT - то все ОК.
Но ведь strtotime как раз и конвертирует в UNIX TIMESTAMP
В чем может быть дело?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

porcelanosa писал(а):
zelenin писал(а):не надо request использовать в модели.
А что же там можно использовать для получения $_POST ?
нет, вообще модель должна быть отделена от внешних данных. внешние данные вы обрабатываете в контроллере, а дальше уходят уже чистые данные.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

porcelanosa писал(а):Поняла, как сделать.

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

public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->publish_date= strtotime($this->publish_date);
            return parent::beforeSave($insert);
        } else {
            return false;
        }
    } 
Теперь работает.
но это не имеет смысла.
вы два раза вызываете parent::beforeSave, причем второй отдает тот же true или false (в вашем случае true, т.к. первый раз сработало). То есть эта запись идентична вашей первой и моей, но мой вариант более лаконичный.
porcelanosa писал(а):Получается массив request->post() обнуляется что ли? После использования в $model->load() ?
не должен. Но вы можете не задавать этот вопрос, а поставить два вар дампа.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

porcelanosa писал(а):И какие-то проблемы в использовании TIMESTAMP - не сохраняет если поле в таблице этого типа.
Если INT - то все ОК.
Но ведь strtotime как раз и конвертирует в UNIX TIMESTAMP
В чем может быть дело?
ну что вы какие-то простейшие вопросы задаете. возьмите да вар дампом посмотрите, что он вам возвращает.
посомтрите getErrors() если не сохраняетс модель.
И вообще, не используйте strtotime() - унифицируйте ваш опыт работы со временем в помощью DateTime. Он универсален в отличии от strtotime

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

DateTime::createFromFormat($format, $value)->toUnixTime(); или (new DateTime($value))->toUnixTime();
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: beforeSave() - как правильно?

Сообщение porcelanosa »

Да спасибо.

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

$this->publish_date = Yii::$app->formatter->asTimestamp($this->publish_date); 
или вот так вот

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

(new DateTime($this->publish_date))->getTimestamp(); 
Результат одинаковый.
Но проблема, возможно в MySQL
Вот такой запрос, выполняется без ошибок:
Изображение

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

UPDATE  `news` SET  `publish_date` =  '1448841600' WHERE  `id` =7
Значение publish_date взято из var_damp
Но при этом значение не изменяется.
Схема БД
ИзображениеПри этом created_date и modified_date через TimestampBehavior меняется нормально.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

"created_date и modified_date через TimestampBehavior меняется нормально"
покажите скрин. на нем будет видна ошибка
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: beforeSave() - как правильно?

Сообщение Йож »

А чем не устраивает http://www.yiiframework.com/doc-2.0/yii ... avior.html ?
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: beforeSave() - как правильно?

Сообщение porcelanosa »

Йож писал(а):А чем не устраивает http://www.yiiframework.com/doc-2.0/yii ... avior.html ?
Потому что оно срабатывает по insert и по update - а нужен независимый механизм установки даты.

Publish_date можно менять когда угодно
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: beforeSave() - как правильно?

Сообщение zelenin »

porcelanosa писал(а):Потому что оно срабатывает по insert и по update
оно сработает на любом AR-событии, которое укажите.
Ответить