Удален тип данных Symfony 4, отключен с помощью jquery, но данные не отправлены

#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],
    ]);