мы объявили следующие строки в функции инициализации нашего AppController, чтобы они отображались в глобальном масштабе в одном и том же формате для отображения дат:
// default time formats on load Time::$defaultLocale = 'de-DE'; Time::setToStringFormat('dd.MM.YYYY');
Это отлично работает. Дата отображается корректно в представлении. Но мы получаем ошибку проверки, если хотим сохранить объект с полем даты (Предоставленное значение недействительно). Валидатор настроен так:
$validator ->add('datefield', 'valid', ['rule' => 'date']) ->allowEmpty('datefield');
Здесь отладка объекта с полем даты:
Перед patchEntity:
'datefield' => '08.07.2014'
После patchEntity:
'datefield' => object(Cake\I18n\Time) { 'time' => '2014-07-08T00:00:00+0000', 'timezone' => 'UTC', 'fixedNowTime' => false }, .... '[errors]' => [ 'datefield' => [ 'valid' => 'The provided value is invalid' ] ],
Есть ли способ всегда анализировать дату по всему миру в правильном формате для сохранения объекта и проверки.
Разборки (в процессе сортировки) и валидация не имеют ничего общего друг с другом, первое произойдет после последнего.
Проверьте API-интерфейс проверки date
, он принимает дополнительные аргументы, то есть используемый формат, и настраиваемое регулярное выражение для использования вместо предопределенных.
date(string|DateTime $check, string|array $format 'ymd', string|null $regex null)
Проверка даты, определяет, является ли прошедшая строка допустимой датой. ключи, которые ожидают, что полный месяц, день и год подтвердят високосные годы.
Годы действительны с 1800 до 2999.
Форматы:
dmy
27-12-2006 или 27-12-06 разделители могут быть пробелом, периодом, тире, косой чертойmdy
или 12-27-06 разделители могут быть пространством, периодом, тире, косой чертойymd
2006-12-27 или 06-12-27 разделители могут быть пространством, периодом, тире, косой чертой- …
[…]
API> \ Cake \ Validation \ Validation :: date ()
Поэтому, чтобы правильно проверить ваши локализованные немецкие данные, вам нужно указать формат dmy
.
->add('datefield', 'valid', ['rule' => ['date', 'dmy']])
Если вы хотите применить локализованную проверку в глобальном масштабе, чтобы формат можно было изменить из одной точки в вашем приложении, вы могли бы, например, использовать специальное правило проверки и глобально доступный пользовательский поставщик, который извлекает формат из ваших приложений конфигурации, например
namespace App\Validation; use Cake\Core\Configure; use Cake\Validation\Validation; class AppValidation { public static function date($check) { return Validation::date($check, Configure::read('Locale.validation.dateFormat')); } }
$validator->provider('appValidation', 'App\Validation\AppValidation'); $validator->add('datefield', 'valid', [ 'rule' => 'date', 'provider' => 'appValidation' ])
* непроверенный пример кода для иллюстративных целей
См. Также Cookbook> Validation> Custom Validation Rules