'type'=> 'datetime-local' в cakephp 3.6

Я пытаюсь использовать 'type'=> 'datetime-local' в моей форме, чтобы создать выбор времени и даты. В представлении все работает отлично, но CakePHP не может обработать формат результата. Я пытался привести его к Cake\I18n\Time, но он игнорирует установленное время и использует текущее время.

Кто-нибудь использовал сборщик даты html5 в cakephp? Есть ли намерение сделать его стандартным выбором в торте?

Вариант выбора по умолчанию для CakePHP с большим количеством полей выбора не очень удобен.

1 ответ

CakePHP не поддерживает формат, используемый в HTML5 datetime-local input (YYYY-MM-DDTHH:MM) из коробки (пока).

Вы можете решить эту проблему, например, используя пользовательский / расширенный тип базы данных, который добавляет правильный формат к существующим форматам по умолчанию (это повлияет на все поля / столбцы даты и времени), например:

// in src/Database/Type/DateTimeType.php

namespace App\Database\Type;

class DateTimeType extends \Cake\Database\Type\DateTimeType
{
    public function __construct($name = null)
    {
        $this->_format[] = 'Y-m-d\TH:i'; // date() compatible format

        parent::__construct($name);
    }
}
// in config/boostrap.php before `Type::build('datetime')` is invoked

Type::map('datetime', \App\Database\Type\DateTimeType::class);

анализируя ввод вручную перед маршалингом:

// in a table class, a behavior, or a listener for the Model.beforeMarshal event

public function beforeMarshal(\Cake\Event\Event $event, \ArrayObject $data, \ArrayObject $options)
{
    if (isset($data['fieldName']) &&
        is_string($data['fieldName'])
    ) {
        $data['fieldName'] = \Cake\I18n\Time::parseDateTime(
            $data['fieldName'],
            "yyyy-MM-dd'T'HH:mm" // ICU compatible format
        );
    }
}

или путем включения локализованного анализа и предоставления соответствующего формата (это ограничит все поля / столбцы даты и времени этим одним форматом):

// in config/bootstrap.php

Type::build('datetime')
    ->useImmutable()
    ->useLocaleParser()
    ->setLocaleFormat("yyyy-MM-dd'T'HH:mm"); // ICU compatible format

Смотрите также

Другие вопросы по тегам