Yii2: Использование виджета yii\jui\DatePicker, мои настройки

       Yii2      yii2    jquery ui    yii2 advanced      3882    
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

Комментарии временно оключены

Поиск

Популярное