Yii2: Использование виджета yii\jui\DatePicker, мои настройки
Самый простой пособ работы с датой (на любом сайте) - использовать обычный input, указав ему type date
:
<?= $form->field($model, 'created_at')->textInput(['type' => 'date']); ?>
Самым простым способом работы с датой в Yii2 является использование виджета DatePicker jQuery UI
, который поставляется "из коробки" (шаблон advanced).
use yii\jui\DatePicker; <?= $form->field($model,'created_at')->widget(DatePicker::class, [ 'language' => 'ru', //'dateFormat' => 'dd.MM.yyyy, 'options' => [ 'placeholder' => Yii::$app->formatter->asDate($model->created_at), 'class'=> 'form-control', 'autocomplete'=>'off' ], 'clientOptions' => [ 'changeMonth' => true, 'changeYear' => true, 'yearRange' => '2015:2050', //'showOn' => 'button', //'buttonText' => 'Выбрать дату', //'buttonImageOnly' => true, //'buttonImage' => 'images/calendar.gif' ]])->label(false) ?>
Но теперь встаёт вопрос о том, как записать в базу выбранную дату в нужном формате. Дело в том, что из виджета в нашу форму приходит дата в формате dd.mm.yyyy
, а в базe она храниться в числовом формате (тип поля integer)
.
На этот случай у меня есть решение (опять же, одно из множества). Это небольшое поведение, которое необходимо подключить в модели:
<? namespace common\behaviors; use yii\behaviors\AttributeBehavior; use yii\base\InvalidConfigException; class DateToTimeBehavior extends AttributeBehavior { public $timeAttribute; public function getValue($event) { if (empty($this->timeAttribute)) { throw new InvalidConfigException( 'Can`t find "fromAttribute" property in ' . $this->owner->className() ); } if (!empty($this->owner->{$this->attributes[$event->name]})) { $this->owner->{$this->timeAttribute} = strtotime( $this->owner->{$this->attributes[$event->name]} ); return date('d.m.Y', $this->owner->{$this->timeAttribute}); } else if (!empty($this->owner->{$this->timeAttribute}) && is_numeric($this->owner->{$this->timeAttribute}) ) { $this->owner->{$this->attributes[$event->name]} = date( 'd.m.Y', $this->owner->{$this->timeAttribute} ); return $this->owner->{$this->attributes[$event->name]}; } return null; } }
Данное поведение будет форматировать дату из формы в нужный нам формат, правильно сохранять её в базу и обратно конвертировать для вывода в форме (виджете).
В самой форме, помимо нашего поля для ввода даты определим ещё одно свойство:
... // Здесь будет храниться отформатированная дата public $created_at_formatted; ...
Добавим в правила:
public function rules(): array { return [ ..... ['created_at', 'integer'], ['created_at_formatted', 'date', 'format' => 'php:d.m.Y'] ..... ]; }
Поведение:
public function behaviors() { return [ [ 'class' => DateToTimeBehavior::class, 'attributes' => [ ActiveRecord::EVENT_BEFORE_VALIDATE => 'created_at_formatted', ActiveRecord::EVENT_AFTER_FIND => 'created_at_formatted', ], 'timeAttribute' => 'created_at' ], ]; }
В представлении мы будем работать уже с нашей отформатированной для виджета датой:
<?= $form->field($model,'created_at_formatted')->widget(DatePicker::class, []); ?>
UPDATED:
Вместо вышеуказанного поведения можно воспользоваться напрямую функцией
strtotime()
if ($model->load(Yii::$app->request->post())) { if($model->created_at_formatted){ $model->created_at = strtotime($model->created_at_formatted); } // Ещё какой-то код // Сохраняем модель }
Более подробнее можно почитать на оф.сайте - https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/api/2.1/yii-jui-datepicker