загрузить города в choiceType после выбора одного гувернората во втором ChoiceType - PullRequest
0 голосов
/ 21 мая 2018

У меня есть две сущности с ассоциацией Gouvernorat -> Villes.

Это сущность Gouvernorat:

class Gouvernorat
    {
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     */
    private $name;
    /**
     * @ORM\OneToMany(targetEntity="EntiteBundle\Entity\Ville", mappedBy="idGouvernorat")
     */
    private $villes;
    //getters & setters & constructor
}

, а это городская сущность:

class Ville
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=200, nullable=false)
 */
private $name;

/**
 * @var \Gouvernorat
 *
 * @ORM\ManyToOne(targetEntity="EntiteBundle\Entity\Gouvernorat",inversedBy="villes")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_gouvernorat", referencedColumnName="id")
 * })
 */
private $idGouvernorat;
}

В третьем объекте под названием Etablissement у меня есть строка gouvernorat и строка string ville. Поэтому я пытаюсь создать тип EtablissementType.Эта форма содержит два типа сущностей для дочернего гувернората и краткую копию Вилле:

class EtablissementType extends AbstractType
{  

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
        ->add('nom')           
        ->add('gouvernorat', EntityType::class, array(
            'class' => 'EntiteBundle\Entity\Gouvernorat',
            'choice_label' => 'name',
            'multiple' => false
        ))          
        ->add('ville',EntityType::class,
            array(
                'class' => 'EntiteBundle\Entity\Ville',
                'choice_label' => 'name',
                'multiple' => false
        ))            
        ->add('Enregistrer',SubmitType::class)
        -> setMethod('POST');       
}

когда я выбираю гувернората, я хочу, чтобы все города этого гувернората загружались во втором ChoiceType, поэтому я добавил это событие:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
            //$builder-> ...

            $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();

                $data = $event->getData();                    
                $gouv = $data-> getGouvernorat();
                $villes = null === $gouv ? array() : $gouv->getVilles();
                $names = array_map(function ($value) {
                    return  $value['name'];
                }, $villes);

                $form->add('ville', ChoiceType::class,
                    array(
                    'choices' => $names
                ));
            }
        );
    }

ярлык для данных (в формате json):

[
{
    "id": 1,
    "name": "ARIANA",
    "villes": [
        {
            "id": 1,
            "name": "RAOUED",
            "idGouvernorat": null
        },
        {
            "id": 2,
            "name": "SIDI THABET",
            "idGouvernorat": null
        },
        {
            "id": 3,
            "name": "ARIANA VILLE",
            "idGouvernorat": null
        },
        {
            "id": 4,
            "name": "LA SOUKRA",
            "idGouvernorat": null
        },
        {
            "id": 5,
            "name": "KALAAT LANDLOUS",
            "idGouvernorat": null
        },
        {
            "id": 6,
            "name": "ETTADHAMEN",
            "idGouvernorat": null
        },
        {
            "id": 7,
            "name": "MNIHLA",
            "idGouvernorat": null
        }
    ]
},
{
    "id": 2,
    "name": "BEJA",
    "villes": [
        {
            "id": 8,
            "name": "BEJA NORD",
            "idGouvernorat": null
        },
        {
            "id": 9,
            "name": "NEFZA",
            "idGouvernorat": null
        },
        {
            "id": 10,
            "name": "GOUBELLAT",
            "idGouvernorat": null
        },
        {
            "id": 11,
            "name": "MEJEZ EL BAB",
            "idGouvernorat": null
        },
        {
            "id": 12,
            "name": "AMDOUN",
            "idGouvernorat": null
        },
        {
            "id": 13,
            "name": "TEBOURSOUK",
            "idGouvernorat": null
        },
        {
            "id": 14,
            "name": "TESTOUR",
            "idGouvernorat": null
        },
        {
            "id": 15,
            "name": "THIBAR",
            "idGouvernorat": null
        },
        {
            "id": 16,
            "name": "BEJA SUD",
            "idGouvernorat": null
        }
    ]
},

и т.д.проблема, я не нашел проблему точно, я использовал документацию Symfony - Динамическая генерация для отправленных форм

<script>
                    var $gouvernorat = $('#etablissement_gouvernorat');
                    // When gouvernorat gets selected ...
                    $gouvernorat.change(function() {
                        // ... retrieve the corresponding form.
                        var $form = $(this).closest('form');
                        // Simulate form data, but only include the selected gouvernorat value.
                        var data = {};
                        data[$gouvernorat.attr('name')] = $gouvernorat.val();
                        // Submit data via AJAX to the form's action path.
                        $.ajax({
                            url : $form.attr('action'),
                            type: $form.attr('method'),
                            data : data,
                            success: function(html) {
                                // Replace current ville field ...
                                $('#etablissement_ville').replaceWith(
                                    // ... with the returned one from the AJAX response.
                                    $(html).find('#etablissement_ville')
                                );
                                // Ville field now displays the appropriate Villes.
                            }
                        });
                    });
                </script>

1 Ответ

0 голосов
/ 22 мая 2018

Во-первых, когда вы получаете данные gouv в форме, я не уверен, что они работают должным образом.

Заменить

$form = $event->getForm();
$data = $event->getData();                 
$gouv = $data->getGouvernorat();

На:

$form = $event->getForm();
$data = $event->getData();                
$gouv = $data->get('gouvernorat')->getData(); // basically, you get the form data for the gouvernorat field

В данный момент я думаю, что gouvernorat не заполнен своими собственными villes, которые хранятся в базе данных (я полагаю).Теперь вам нужно проверить, возвращает ли getGouvernorat метод ваших $ data (который является экземпляром Etablissement) экземпляр Gouvernorat .Если да, вы получите этот gouvernerat из своей базы данных, чтобы получить доступ ко всем его городам.

if (!is_null($data->getGouvernorat())) {
    $persistedGouvernorat = $gouvernoratRepository->find($event->getData()->getGouvernorat());;
    if (!is_null($persistedGouvernorat)) {
        $gouverorat = $persistedGouvernorat;
    }
}
$villes = $gouvernorat->getVilles();

Тогда я думаю, что вы можете избавиться от своей проблемы.

...