DatePicker для Yii2 и хранение даты в базе данных integer
Известно, что kartik\datetime\DateTimePicker передает дату в формате dd.mm.yyyy, чтобы принять и сохранить данные в базе нужно иметь таблицу в базе данных с типом DATE. Так вот, задача стояла следующая — дата которая будет передаваться в базу и приниматься обратно имела тип — INT(11). Что для этого сделать? — читайте далее.
Задача: передать в базу данных значение даты из виджета kartik\datetime\DateTimePicker в формате dd.mm.yyyy и сохранить ее в базе в таблице с типом INT. Вывести ее на сайте в понятном виде день.месяц.год.
Устанавливаем виджет.
1 | composer require kartik-v/yii2-widget-datetimepicker "dev-master" |
В вашу модель допустим models\Product.php дописываем следующий код
1 2 3 4 5 6 7 8 9 10 | public function rules() { return [ ... ['time', 'integer'], //проверка ['time', 'default', 'value' => time()], //значение по умолчанию ['dateTime', 'date', 'format' => 'php:d.m.Y'], //формат модели с которой будем работать ... ]; } |
Добавляем функции в модели.
1 2 3 4 5 6 7 8 9 | public function getDateTime() { return $this->time ? date('d.m.Y', $this->time) : ''; } public function setDateTime($date) { $this->time = $date ? strtotime($date) : null; } |
Добавляем перевод
1 2 3 4 5 6 7 8 | public function attributeLabels() { return [ ... 'dateTime' => Yii::t('admin', 'Дата'), ... ]; } |
Далее в форме где будет сохраняться и редактироваться данные — подключаем виджет DateTimePicker.
1 | use kartik\datetime\DateTimePicker; |
и выводим в форме
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <? $form = ActiveForm::begin([ 'options' => ['enctype' => 'multipart/form-data', 'class' => 'model-form'], ]); ?> ............. <? echo $form->field($model, 'dateTime')->widget(DateTimePicker::className(), [ 'name' => 'datetime', 'type' => DateTimePicker::TYPE_COMPONENT_APPEND, 'options' => ['placeholder' => 'Выберите дату...'], 'pickerIcon' => '<i class="fas fa-calendar-alt text-primary"></i>', 'removeIcon' => '<i class="fas fa-trash text-danger"></i>', 'pluginOptions' => [ 'language' => 'ru', 'minuteStep' => '60', 'minView' => '2', 'maxView' => '2', //'startView' => '3', 'format' => 'dd.mm.yyyy', // формат который будет передаваться в базу 'autoclose' => true, //авто закрытие 'weekStart' => 1, //с какого дня начинается неделя 'startDate' => date('Ymd'), //дата ниже которой нельзя установить значение 'todayBtn' => true, // выбрать сегодняшнюю дату 'todayHighlight' => true, // подсветка сегодняшнего дня ], ]); ?> ............. <?ActiveForm::end();?> |
Для вывода на страницах сайта
1 2 3 | $date_int= $model->time; $datetime= Yii::$app->formatter->asDate($date_int); echo 'Дата: '.$datetime; |
Результат:
В базе данных дата храниться в поле с типом integer
В админке как нормальная дата
И на сайте тоже преобразуется и выводиться нормальная дата
Спасибо большое, давно думал как бы это сделать преобразовать все даты в инт
Класс! я в восторге, целый день голову ломал:) Спасибо
Спасибо. Класс. долго искал и нашел у вас.
Ничего не понял, как вы сделали все таки дату в интегер ???? можно в личку.. спасибо
В базе у вас поле time в интегер так? В вашу модель в правила добавьте переменную [‘dateTime’, ‘date’, ‘format’ => ‘php:d.m.Y’] а также добавить две функции на прием и установку времени getDateTime и setDateTime
Ну а далее уже в самой форме подключаем этот виджет и вставляем форму ActiveForm