CTimeStampBehaviour для установки create_time и update_time сброса create_time с помощью afterFind()

Я использую CTimeStampBehaviour для установки create_time и update_time для сброса create_time с afterFind() в модели, в основном я устанавливаю формат даты, который будет отображаться на внешнем интерфейсе. Но это не работает, так как create_time отправлено 0000-00-00 00:00:00 с использованием модели afterFind(). Это прекрасно работает, когда я комментирую afterFind() в модели.

Я использовал эту функцию в моей модели:

public function behaviors(){
return array(
    'CTimestampBehavior' => array(
        'class' => 'zii.behaviors.CTimestampBehavior',
        'createAttribute' => 'create_time',
        'updateAttribute' => 'update_time',
        'setUpdateOnCreate'=> true,
    )
);
}

Я видел документацию по классу CTimeStampBehavior на сайте yii, в нем есть ссылка на наследование afterFind(), но не предлагается, как его использовать. Я использую afterFind() в модели, как это:

protected function afterFind() {
parent::afterFind();
$this->create_time = Yii::app()->dateFormatter->formatDateTime(
        CDateTimeParser::parse(
            $this->create_time, 'yyyy-MM-dd hh:mm:ss'
        ), 'short', 'short'
    );
return true;
}

Кто-нибудь может подсказать, почему create_time заполняется нулями при использовании afterFind()?

1 ответ

Решение

create_time будет заполнен нулями, когда вы сохраните модель после загрузки и afterFind() изменил значение create_time на форматированную дату. Это потому, что когда вы сохраняете свою модель, вы пытаетесь отправить отформатированное значение в базу данных, которая не понимает формат, и установите значение в 0000-00-00 00:00:00,

Когда вы реализуете afterFind() метод для изменения формата значения, вы должны реализовать beforeSave() метод для возврата значения в формат, понятный базе данных.

Обычно плохая идея форматировать значения непосредственно в модели. Когда вы выполняете строгий MVC, задачей View является правильное форматирование вашей даты.

Другие вопросы по тегам