datetime поле и сохранение в unixtime

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

datetime поле и сохранение в unixtime

Сообщение S c »

Всем привет! Вроде простой вопрос, но чет загнал в ступор.
Есть поле формы

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

echo $form->field($model, 'public_date')->widget(kartik\widgets\DateTimePicker::classname(), [
        'language' => 'uk',
        'options' => [
            'placeholder' => Yii::t('app', 'Select publication date'),
        ],
        'pluginOptions' => [
            'autoclose' => true,    
            'format' => 'dd.mm.yyyy HH:ii',
            'todayHighlight' => true,
            'todayBtn' => true,
        ]
]);
в БД хранится как integer в Unix Timestamp

Вот в идеале чтоб на поле (и в других местах, но это довольно просто решаемо) выводилось в каком нить datetime формате, и сохранялось в БД в timestamp. Не хочу в контроллере, в модели (beforeEvent) делать преобразования. Свойство модели должно хранить и получать unixtime (int) и все, железно. А в контроллере - много мест где нужно делать подобное. Нашел такое решение - http://demos.krajee.com/datecontrol
Есть что то встроенное в yii подобное? чтоб к примеру виджет (либо обычный field()) отображал пользователю datetime формат - но на экшен уже передавал unix? И чтоб виджет получал тот же unixtime, а отображал читаемую дату. Вообще чья зона ответственности - делать такие преобразования? Ладно еще во view я могу подготовить какой то DTO, ок, но тогда получается что в action нужно переводить datetime в unixtime перед присваиванием?
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: datetime поле и сохранение в unixtime

Сообщение S c »

Сейчас я думаю что либо использовать AR по полной (работать с датой как с datetime, а в beforeSave переводить её в unix), либо вообще модель отделить полностью от AR, добавить какой-нить промежуточный formModel, там валидировать и подготавливать все данные и уже после корректно инициализировать объект модели. Но это проект "на коленке" так сказать, не стоит таких трудозатрат.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: datetime поле и сохранение в unixtime

Сообщение S c »

нашел, по простому:
в rules()

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

[['public_date'], 'datetime', 'format' => 'php:d.m.Y H:i', 'timestampAttribute' => 'public_date'],
тогда после валидации преобразует ваш атрибут в timestamp

и во view

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

/* если дата не задана, asDateTime() преобразует дату в строку "(not set)", обернутую в html (или что у вас задано в свойстве nullDisplay для форматтера)
по этому - если дата пустая, просто передавайте пустое значение в datetimepicker */
$formattedDate = !empty($model->public_date) ? Yii::$app->formatter->asDatetime($model->public_date, 'php:d.m.Y H:i') : '';
echo $form->field($model, 'public_date')->widget(\kartik\widgets\DateTimePicker::classname(), [
    'language' => 'uk',
    'options' => [
        'value' => $formattedDate,
        'placeholder' => Yii::t('app', 'Select publication date'),
    ],
    'pluginOptions' => [
        'autoclose' => true,    
        'format' => 'dd.mm.yyyy HH:ii',
        'todayHighlight' => true,
        'todayBtn' => true,
    ]
]);
получаем что в атрибуте всего в timestamp, в отображении везде где нужно - выводим в разных форматах
Ответить