#symfony #symfony4
#symfony #symfony4
Вопрос:
У меня есть поле типа данных в форме, для которого установлено значение disabled = true . Когда пользователь устанавливает определенный флажок, некоторый jquery распознает его и удаляет отключенное свойство из html, но значение по-прежнему не передается формой.
Просто интересно, есть ли лучший способ добиться этого в symfony? Поле даты должно быть отключено для пользователя, если он не установит флажок. Поле добавляется следующим образом:
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>true
]);
Я попытался изменить его с помощью события отправки, чтобы symfony распознал поле как включенное, поскольку в html больше нет disabled, поле все равно должно отправляться, поэтому я предполагаю, что symfony игнорирует его из-за исходного disabled = true?
Вот часть конструктора, я пытаюсь изменить поле даты, когда оно отправлено, на disabled = false, но переопределенное значение по-прежнему равно null
$builder->add('overrideDates',CheckboxType::class,[
'label'=>'Override Dates',
'required'=>false
]);
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>true
]);
$builder->addEventListener(FormEvents::SUBMIT,function(FormEvent $event){
$form = $event->getForm();
$data = $form->getData();
if($data->isOverridingDates()){
$form->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>false
]);
}
});
РЕШЕНИЕ
Хорошо, это кажется немного неуклюжим, но это работает для того, что я хочу сделать:
// event listener to enable/disable the overrideDate field if overrideDates === true
$builder->addEventListener(FormEvents::PRE_SUBMIT,function(FormEvent $event){
// get form and data
$form = $event->getForm();
$data = $event->getData();
// add the overridedDate field back into the form
$form->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>((bool)$data['overrideDates'] === true ? false : true)
]);
});
Ответ №1:
Вам следует взглянуть сюда:https://symfony.com/doc/current/form/dynamic_form_modification.html
Это хороший способ сделать то, что вы хотите сделать! Вы должны использовать FormEvents::PRE_SUBMIT вместо FormEvents::SUBMIT
// event listener to enable/disable the overrideDate field if overrideDates === true
$builder->addEventListener(FormEvents::PRE_SUBMIT,function(FormEvent $event){
// get form and data
$form = $event->getForm();
$data = $event->getData();
// add the overridedDate field back into the form
$form->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>((bool)$data['overrideDates'] === true ? false : true)
]);
});
Комментарии:
1. Эй, это то, что я сделал, используя FormEvents:: SUBMIT и повторно добавил поле с disabled = false, но оно по-прежнему отправляет NULL в поле DateType. Я обновил свой вопрос, чтобы показать код. Это делает поле включенным, но оно проходит всю проверку и повторно отображает форму с измененным полем вместо того, чтобы разрешать отправленные данные через
2. Что произойдет, если вы используете FormEvents::PRE_SUBMIT?
3. Я использовал это, обновил свой вопрос решением. Единственное, что мне в этом не нравится, это то, что $ data на данный момент не является объектом entity, это массив, поэтому флажок равен ‘1’, а не логическому значению, как у объекта, поэтому мне пришлось ввести его cast. Помечаем это как правильный ответ.
4. @Nicolas пожалуйста, отредактируйте свой ответ и добавьте к нему больше информации. Со временем ссылки будут прерываться.
Ответ №2:
У меня есть более простое решение, вы должны использовать атрибут HTML «Только для чтения». Этот атрибут включает ту же функцию, что и «отключено», но когда symfony получает данные вашей формы, он учитывает ввод «только для чтения». Вы можете добавить свои входные данные в свой конструктор форм следующим образом :
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'attr' => ['readonly' => true],
]);