Динамическое заполнение раскрывающихся данных проекта на основе данных выбора раскрывающегося списка клиента. Но форма редактирования показывает исключение / ошибку в symfony 5 - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу "Динамическое заполнение раскрывающихся данных проекта на основе данных выбора раскрывающегося списка клиента" в symfony 5. Новая страница работает правильно, но при изменении значения раскрывающегося клиента на странице редактирования тогда вызывается ajax и показывает это исключение / ошибка: «Ожидаемый аргумент типа« строка »,« ноль »указан в пути к свойству« buildingPosition ».»

Код формы:

class EnquiryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('client', EntityType::class, [
            // looks for choices from this entity
            'class' => Client::class,

            // uses the User.username property as the visible option string
            'choice_label' => 'name',
            'placeholder' => 'Select a Client...',
           // 'label' => 'Contact Person Designation',
            // used to render a select box, check boxes or radios
            // 'multiple' => true,
            // 'expanded' => true,
            ])

            ->add('buildingPosition', TextType::class, [
                'attr' => ['class' => 'form-control'],

                ])
             ->add('offerSubmissionDate', DateType::class, [
                 'attr' => ['class' => 'form-control'],
                 'widget' => 'single_text',
                 'empty_data' => null,


                 ])


            ->add('probability', ChoiceType::class, [
                'choices'  => [
                'P1' => 'P1',
                'P2' => 'P2',
                'P3' => 'P3',
              ],
              'placeholder' => 'Select a Probability...',

           ])
            ->add('notes', TextType::class, [
                'attr' => ['class' => 'form-control'],
                 ])

           ;

            // Start Project data populate dynamically based on the value in the "client" field
            $formModifier = function (FormInterface $form, Client $client = null) {
                $projects = null === $client ? [] : $client->getProjects();

                $form->add('project', EntityType::class, [
                    'class' => 'App\Entity\Project',
                    'placeholder' => '',
                    'choices' => $projects,
                ]);
            };

            $builder->addEventListener(
                FormEvents::PRE_SET_DATA,
                function (FormEvent $event) use ($formModifier) {
                    // this would be your entity, i.e. Enquiry
                    $data = $event->getData();

                    $formModifier($event->getForm(), $data->getClient());
                }
            );

            $builder->get('client')->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) use ($formModifier) {
                    // It's important here to fetch $event->getForm()->getData(), as
                    // $event->getData() will get you the client data (that is, the ID)
                    $client = $event->getForm()->getData();

                    // since we've added the listener to the child, we'll have to pass on
                    // the parent to the callback functions!
                    $formModifier($event->getForm()->getParent(), $client);
                }
            );

            // End Project data populate dynamically based on the value in the "client" field

    }

Код контроллера:

public function edit(Request $request, $id): Response
    {
        $enquiry = new Enquiry();

        $entityManager = $this->getDoctrine()->getManager();
        $enquiry = $entityManager->getRepository(Enquiry::class)->find($id);


        $form = $this->createForm(EnquiryType::class, $enquiry);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {


            $this->getDoctrine()->getManager()->flush();

            $this->addFlash('notice', 'Enquiry updated successfully!');

            return $this->redirectToRoute('enquiry_index');
        }

        return $this->render('enquiry/edit.html.twig', [
            'enquiry' => $enquiry,
            'form' => $form->createView(),
        ]);
    }

Веточка / Посмотреть код:

  {{ form_start(form) }}
              {{ form_row(form.client, {'attr': {'class': 'form-control'}}) }} 
              {{ form_row(form.project, {'attr': {'class': 'form-control'}}) }} 
              {{ form_row(form.buildingPosition) }}
              {{ form_row(form.offerSubmissionDate) }}
              {{ form_row(form.probability, {'attr': {'class': 'form-control'}}) }}
              {{ form_row(form.notes) }}

      {{form_row(row)}}

JavaScript Код:

var $client = $('#enquiry_client');
// When sport gets selected ...
$client.change(function() {

  // ... retrieve the corresponding form.
  var $form = $(this).closest('form');

  // Simulate form data, but only include the selected sport value.
  var data = {};
  data[$client.attr('name')] = $client.val();
  // Submit data via AJAX to the form's action path.
  $.ajax({
    url : $form.attr('action'),
    type: "POST",
    data : data,
    success: function(html) {

      // Replace current position field ...
      $('#enquiry_project').replaceWith(
        // ... with the returned one from the AJAX response.
        $(html).find('#enquiry_project')
      );
      // Position field now displays the appropriate positions.
    }
  });
});

Пожалуйста, помогите мне .....

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