Symfony 4 Form - Ajax выбор населения - PullRequest
0 голосов
/ 25 марта 2019

Есть ли способ заполнить форму ChoiceType (раскрывающийся список) асинхронно с помощью ajax?

В основном то, что я пытаюсь сделать:

Краткое описание: Простая система бронирования.

Длинное описание:

Когда пользователь выбирает дату с помощью средства выбора даты (или чего-либо еще) в «предпочитаемом виде» ajax call проверит, есть ли доступный временной интервал для выбранной даты, и заполнит ChoiceType «availableTimes» (выпадающий список) временем (например: 10:00, 10:30, 11:00, 11:30 и т. д.) .

Доступное время отсутствует в базе данных.

Моя форма:

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('preferredDate', DateType::class, [
                'widget' => 'single_text',
                'input' => 'datetime',
                'format' => 'dd.MM.yyyy',
            ])
            ->add('availableTimes', ChoiceType::class, ['required' => false]);
    }

Мой JS:

$(".reservation-date").change(function () {
        $.ajax({
            type: "GET",
            dataType: "json",
            url: "{{URL}}",
            data: {},
            success: function (data) {
                $(".reservation-times").empty();
                $.each(data, function (key, value) {
                    //populate availabletimes dropdown
                    let disabled = (value.disabled === true ? "disabled" : '');
                    $(".reservation-times").append('<option ' + disabled + ' value=' + value.time + '>' + value.time + '</option>');
                })
            }
            ,
            error: function (error) {
                console.log(error);
            }
        });
    })

Это работает, когда я отправляю выбранное время. Выдает ошибку "Это значение недопустимо"

Что я делаю не так?

Как бы вы сделали это по-другому?

РЕДАКТИРОВАТЬ: нет проверки набора, но по какой-то причине он все еще хочет проверить этот ChoiceType ... РЕДАКТИРОВАТЬ 2: Прочитать все старые ответы SF2, но все они о отправке формы 2+ раз, используя события ..

EDIT3: ошибки от _profiler:

enter image description here

enter image description here

1 Ответ

0 голосов
/ 25 марта 2019

Я наконец сделал это.Добавлен EventListener, все остальное в основном одинаково.

Моя форма:

public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('preferredDate', DateType::class, [
                'widget' => 'single_text',
                'input' => 'datetime',
                'format' => 'dd.MM.yyyy',
            ])
            ->add('availableTimes', ChoiceType::class)
            ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {

                // get the form from the event
                $form = $event->getForm();
                $formOptions = $form->getConfig()->getOptions();

                //helpers
                $availableTimeHandler = $formOptions['availableTimeHelper'];

                // get the form data, that got submitted by the user with this request / event
                $data = $event->getData();

                //get date
                $preferredDate = $data['preferredDate'];

                // get the availableTimes element and its options
                $fieldConfig = $form->get('availableTimes')->getConfig();
                $fieldOptions = $fieldConfig->getOptions();


                /**
                 * Getting available times logic is here, 
                 * not showing because it's irrelevant to the issue.
                 *
                 * $times array example: 
                 * [
                 *      ['time' => '10:00', 'disabled' => false],
                 *      ['time' => '11:00', 'disabled' => true],
                 *      ['time' => '12:00', 'disabled' => true],
                 * ]
                 */

                $choices = [];
                foreach ($times as $time) {
                    $choices[] = [$time['time'] => $time['time']];
                }

                //update choices
                $form->add('availableTimes', ChoiceType::class,
                    array_replace(
                        $fieldOptions, [
                            'choices' => $choices
                        ]
                    )
                );
            });


    }

Мой JS:

$(".reservation-date").change(function () {
        $.ajax({
            type: "GET",
            dataType: "json",
            url: "{{URL}}",
            data: {},
            success: function (data) {
                $(".reservation-times").empty();
                $.each(data, function (key, value) {
                    //populate availabletimes dropdown
                    let disabled = (value.disabled === true ? "disabled" : '');
                    $(".reservation-times").append('<option ' + disabled + ' value=' + value.time + '>' + value.time + '</option>');
                })
            }
            ,
            error: function (error) {
                console.log(error);
            }
        });
    })

Предложения или советы будут оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...