Заполните поле динамически на основе значения выбора пользователя в другом поле в Symfony 5 - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь "Динамически обновить поле на основе выбора пользователя в другом поле в Symfony 5" с "https://symfony.com/doc/current/form/dynamic_form_modification.html#form -events-submit-data " с этой стороны. Но я столкнулся с этим исключением / ошибкой "Аргумент 2, переданный в App \ Form \ SportMeetupType :: App \ Form {closure} (), должен быть экземпляром App \ Form \ Sport или null, указан экземпляр App \ Entity \ Sport, называемый в C: \ Apache24 \ htdocs \ dynamicform \ src \ Form \ SportMeetupType. php в строке 58 "при вызове ajax.

Мой код:

Форма:

class SportMeetupType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')

            ->add('sport', EntityType::class, [
                'class'       => 'App\Entity\Sport',
                'placeholder' => '',
            ])

        ;


        $formModifier = function (FormInterface $form, Sport $sport = null) {
            $positions = null === $sport ? [] : $sport->getPositions();

            $form->add('position', EntityType::class, [
                'class' => 'App\Entity\Position',
                'placeholder' => '',
                'choices' => $positions,
            ]);
        };

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

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

        $builder->get('sport')->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)
                $sport = $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(), $sport);  // Here line 58 and error show this line
            }
        );

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => SportMeetup::class,
        ]);
    }
}

Контроллер:

/**
 * @Route("/new", name="sport_meetup_new", methods={"GET","POST"})
 */
public function new(Request $request): Response
{
    $sportMeetup = new SportMeetup();
    $form = $this->createForm(SportMeetupType::class, $sportMeetup);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($sportMeetup);
        $entityManager->flush();

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

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

Прутик / Вид:

{% extends 'base.html.twig' %}

{% block title %}New SportMeetup{% endblock %}

{% block body %}
    <h1>Create new SportMeetup</h1>

   {{ form_start(form) }}
    {{ form_row(form.name)}}
    {{ form_row(form.sport) }}    {# <select id="sport_meetup_sport" ... #}
    {{ form_row(form.position) }} {# <select id="sport_meetup_position" ... #}
    {# ... #}
{{ form_end(form) }}


{% endblock %}

JavaScript код:

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

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

  // Simulate form data, but only include the selected sport value.
  var data = {};
  data[$sport.attr('name')] = $sport.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 ...
      $('#sport_meetup_position').replaceWith(
        // ... with the returned one from the AJAX response.
        $(html).find('#sport_meetup_position')
      );
      // Position field now displays the appropriate positions.
    }
  });
});

При изменении значения выпадающего списка Sport затем ajax вызывается и показывает ниже исключения / ошибки "Аргумент 2, передаваемый в App \ Form \ SportMeetupType :: App \ Form {closure} (), должен быть экземпляром App \ Form \ Sport или null, экземпляром App \ Entity \ Спорт задан, вызывается в C: \ Apache24 \ htdocs \ dynamicform \ src \ Form \ SportMeetupType. php в строке 58 "

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

1 Ответ

0 голосов
/ 03 апреля 2020

Убедитесь, что в вашем SportMeetupType. php у вас есть:

use App\Entity\Sport;

Я думаю, вы используете неправильный класс.

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