Symfony 4 динамика c выберите страну, выпадающий список города - PullRequest
0 голосов
/ 13 июля 2020

Привет всем, у меня есть проблема с выбором 3 раскрывающихся списков ввода. У меня есть страна, в стране - штат, а в штате - город. Мне удалось выбрать отображение страны и состояния, но проблема в том, чтобы получить город из штата. Я получил эту ошибку. Идентификатор идентификатора отсутствует для запроса App \ Entity \ CountryState

Здесь находится мой конструктор форм

<?php

namespace App\Form;

use App\Entity\Country;
use App\Entity\CountryState;
use App\Entity\StateCities;
use App\Entity\User;
use App\Repository\CountryRepository;
use App\Repository\CountryStateRepository;
use App\Repository\StateCitiesRepository;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;

class CreateBusinessFormType extends AbstractType
{
private $countryRepository;
private $countryStateRepository;
private $stateCitiesRepository;

public function __construct(
    CountryRepository $countryRepository,
    CountryStateRepository $countryStateRepository,
    StateCitiesRepository $stateCitiesRepository
    ) {
    $this->countryRepository = $countryRepository;
    $this->countryStateRepository = $countryStateRepository;
    $this->stateCitiesRepository = $stateCitiesRepository;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('country', EntityType::class, [
            'label' => 'Country',
            'placeholder' => 'Select Country',
            'required' => true,
            'class' => Country::class,
            'query_builder' => function (EntityRepository $entityRepository) {
                return $entityRepository->createQueryBuilder('c')
                    ->addOrderBy('c.name', 'ASC');
            },
            'choice_label' => 'name',
            'choice_value' => 'name',
            'constraints' => [
                new NotBlank([
                    'message' => 'Country is required',
                ]),
            ],
        ])
        ->add('state', ChoiceType::class, [
            'choices' => [],
        ]);

    $formModifyState = function (FormInterface $form, Country $country = null) {
        // Get States
        $states = (null === $country) ? [] : $country->getCountryStates();

        // Add State Form
        $form->add('state', EntityType::class, [
                    'class' => CountryState::class,
                    'label' => 'State (Optional)',
                    'placeholder' => 'Select State',
                    'choices' => $states,
                    'choice_label' => 'name',
                    'required' => false,
                ]);
    };

    $formModifyCity = function (FormInterface $form, CountryState $countryState = null) {
        // Get City
        $cityOption = (null === $countryState) ? [] : $countryState->getStateCities();

        //var_dump($city);

        // Add City Form
        $form->add('city', EntityType::class, [
            'class' => StateCities::class,
            'label' => 'City (Optional)',
            'placeholder' => 'Select City',
            'choices' => $cityOption,
            'choice_label' => 'name',
            'required' => false,
            'constraints' => [
                new NotBlank([
                    'message' => 'State City is required',
                ]),
            ],
        ]);
    };

    // Create Event Listener for State
    $builder->addEventListener(
                FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifyState) {
                    // Get Data
                    $data = $event->getData();

                    // Get Country
                    $country = (null === $data) ? null : $this->countryRepository->find($data);

                    $formModifyState($event->getForm(), $country);
                }
            );

    // Create Event Listener for City
    $builder->addEventListener(
        FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifyCity) {
            // Get Data
            $data = $event->getData();

            // Get State
            $state = $this->countryStateRepository->find($data);

            //$test = $this->countryStateRepository->find($data);

            //var_dump($data);

            $formModifyCity($event->getForm(), $state);
        }
    );

    // Bulder Country
    $builder->get('country')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifyState) {
        // Get Data
        $data = $event->getForm()->getData();

        $formModifyState($event->getForm()->getParent(), $data);
    });

    // Bulder State
    $builder->get('state')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifyCity) {
        // Get Data
        $data = $event->getForm()->getData();

        $formModifyCity($event->getForm()->getParent(), $data);
    });
}

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

И на Twig у меня есть это Javascript

var $post_country = $('#create_business_form_country');
    var $post_token = $('#create_business_form__token');

    // Country on change
    $post_country.change(function() {

        $("#create_business_form_state").select2();

        var $form = $(this).closest('form');

        var data = {};

        data[$post_token.attr('name')] = $post_token.val();
        data[$post_country.attr('name')] = $post_country.val();

        $('#create_business_form_state').prop('disabled', true);

        // Replace Old State form to New
        $.ajax({
            url: $form.attr('action'),
            type: $form.attr('method'),
            data: data,
            success: function (html) { 
                
                // Replace current states field ...
                $('#create_business_form_state').replaceWith(
                    // ... with the returned one from the AJAX response.
                        $(html).find('#create_business_form_state')
                );
                
                // Enable Input
                $('#create_business_form_state').prop('disabled', false);
                // Update Select2
                $('#create_business_form_state').select2();
            }
        });
    });

Любое решение по этому поводу, пожалуйста, я пытаюсь погуглить, но решения не получаю. Кто угодно, пожалуйста.

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