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
Предыдущая запись
Yii2 basic: своя страница ошибок, работа с ErrorHandlerСледующая запись
Yii2: Добавить класс на элемент формы ActiveForm