В форме symfony4 у меня есть поле DateType, которое отлично работает, и мне нравится проверка и автоматическая обработка сообщений об ошибках, которые приходят с ним.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('dob', DateType::class, [
'widget' => 'single_text',
'format' => 'M/d/yy',
]);
}
Я бы хотел, чтобы пользователь мог использовать либо 2-значные, либо 4-значные годы, и оба они прошли проверку.
Кажется, что один утомительный способ сделать это - изменить этот конкретный элемент формы в объекте Request перед переходом к методу handleRequest() в моем контроллере, но это было бы беспорядочно и жестко привязано к моему коду.
Действительно хороший способ (которого не существует) было бы иметь что-то вроде другого варианта 'alternate_format' => 'M/d/yyyy'.
Есть ли у кого-нибудь более простой способ?




На данный момент я решил свою проблему с помощью некоторого клиентского javascript. Если кому-то еще нужно что-то подобное, мое поле даты - это дата рождения, и если я принимаю ограничение, что у меня нет никого старше 100 лет, то это решение хорошо подходит для моих целей. [изменить: это ограничение верно только в том случае, если вы устанавливаете год с двумя цифрами. Если вы установите формат на 4-значный год, а затем используете JavaScript для массажа в то же самое, то таких ограничений нет. В приведенном ниже сценарии предполагается, что даты не могут быть в будущем, что подходит для поля даты рождения.]
В своей форме я добавил класс в свое поле и предполагаю, что формат должен иметь год из 4 цифр:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('dob', DateType::class, [
'widget' => 'single_text',
'format' => 'M/d/yyyy',
'attr' => ['class' => 'js-dob'],
])
}
Затем на стороне клиента у меня есть этот небольшой фрагмент, который запускается при отправке:
$('.js-save-button').on('click', function() {
// convert 2-digit years to 4-digit version in dob field
$('.js-dob').each(function() {
let date = new Date($(this).val());
if (date instanceof Date && !isNaN(date)) {
if (date > new Date()) {
date.setFullYear(date.getFullYear() - 100);
}
}
$(this).val(date.toLocaleDateString("en-US"));
});
});