Странности с форматами дат! Баг или мои кривые руки?!

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Странности с форматами дат! Баг или мои кривые руки?!

Сообщение MaratCrash »

Всем привет =)

Ситуация. Модель User, свойство biorthday типа DATE (в базе), DEFAUL NULL (тоже в базе).
В правилах модели прописал следующее:

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

array('bday', 'default', 'setOnEmpty'=>true),//чтобы нули не записывались
array('bday', 'date', 'format'=>'d-m-Y'),//проверка на нужны формат для БД  
Перед сохранением делаю:

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

public function beforeSave() {
        if (parent::beforeSave()) {
            if ($this->set_password)
                $this->setPassword($this->set_password);
            if (empty($this->role))
                $this->role = self::ROLE_USER;            
            $this->set_password = $this->confirm_password = false;
            if ($this->bday) 
                $this->bday = date('Y-m-d', strtotime($this->bday));
            return true;
        }
        else
            return false;
    }
И перед отображением записи делаю:

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

public function afterFind() {        
        if ($this->bday) 
            $this->bday = date('d-m-Y', strtotime($this->bday));
        parent::afterFind();
    }
И при этом дата выводится в нужном мне формате, НО когда я пытаюсь ее сохранить, то валидацию не проходит =) В чем проблема?! А тепер самое интересное =) Когда я в правилах в формате даты указываю dd-MM-yyyy, то все работает отлично! =)

Ребят, объясните пожалуйста =) Наверняка уж чего-то я не допонимаю =)
puritania
Сообщения: 43
Зарегистрирован: 2012.04.18, 06:26
Откуда: Челябинск
Контактная информация:

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение puritania »

зачем вы в модели форматируете дату (afterFind)? Делать это во вьюхе надо, темже напр dateFormatter
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение MaratCrash »

Хм, а как это скажется на различиях в форматах и моем вопросе? =)
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение MaratCrash »

Делаю я преобразование именно в модели для того, чтобы везде использовался такой формат. Представлений много =) Везде же не буду я делать преобразования во вьюхах =)
puritania, тем не менее, спасибо за ответ!

Вопрос остается открытым.
mass
Сообщения: 71
Зарегистрирован: 2011.11.09, 15:03
Откуда: Москва
Контактная информация:

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение mass »

Не проходит валидацию потому, что:
  • beforeFind - преобразуете дату к d-m-Y
  • Работаете с моделью и тут бах, вы её пробуете сохранить. Отрабатывает валидация, а дата как была d-m-Y, так и осталась.
Решение, уберите преобразование даты в beforeSave(), и добавьте его в beforeValidate()
И на будущее, чтобы исключить еще 25 проблем связанных с такими манипуляциями, сделайте метод в модели

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

public function getFormatedBday(){
   return date('Y-m-d', strtotime($this->bday))
}
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение MaratCrash »

mass, спасибо за ответ. А почему тогда у меня сейчас все работает?! =) Я вот этому удивляюсь =) И если не сложно (я прсто не нашел в доках), какова последовательность вызовов (validate, save и т.д.)?

UPDATE:
mass, сделал, как Вы говорите, но не проходит так валидацию =)
mass
Сообщения: 71
Зарегистрирован: 2011.11.09, 15:03
Откуда: Москва
Контактная информация:

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение mass »

последовательность:
validate - beforeValidate(), сама сама валидация, afterValidate()
save - validate(опционально), beforeSave(), сохранение, afterSave()
Аналогично и для других методов (p.s. валидация автоматом только у save())

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

public function beforeValidate() {
    //ваш код//
    return parent::beforeValidate();
}
 
так написали beforeValidate() ?
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение MaratCrash »

Да, все верно, в beforeValidate().
Я знаете чего не пойму сейчас, почему у меня работает именно так, как я в самом первом посте написал =) Т.е. в rules я указал формат даты "dd-MM-yyyy" и все работает, хотя формат даты должен быть "d-m-Y"
mass
Сообщения: 71
Зарегистрирован: 2011.11.09, 15:03
Откуда: Москва
Контактная информация:

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение mass »

Потому, что в Date валидаторе не используется нативная работа с датой. Oбработка происходит через /framework/utils/CDateTimeParser
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: Странности с форматами дат! Баг или мои кривые руки?!

Сообщение MaratCrash »

Вау! Вот это да! Спасибо! Буду копать в сторону CDateTimeParser!
Ответить