Нарушение ограничения на динамическую форму Symfony - PullRequest
0 голосов
/ 12 октября 2018

я работаю на Symfony3.4 У меня есть динамическая форма страна-> регион-> город (3 различных объекта).Я могу изменить поля на основе выбора пользователя без каких-либо проблем.

Но я не могу сохранить в базе данных из-за нарушения ограничения на поле города (и только это поле)

И я действительноне знаю почему, потому что я называю их (регион и город) одинаково ...

Любая помощь будет приветствоваться.

Вот форма:

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

    $em = $options['entityManager'];

    $builder
        ->add('rue', TextType::class, array(
            'label' => 'votre rue',
            'required' => true,
        ))

        ->add('pays', EntityType::class, array(
            'class' => 'AppBundle\Entity\Pays',
            'placeholder' => '--choisir--',
            'choice_label' => 'nom',
            'required' => true
        ))
    ;

    $addRegion = function (FormInterface $form, Pays $pays = null) {
        $regions = null === $pays ? array() : $pays->getRegions();

        $form->add('region', EntityType::class, array(
            'class' => 'AppBundle\Entity\Region',
            'placeholder' => '--choisir une région--',
            'choices' => $regions,
            'choice_label' => 'nom',
            'required' => true
        ));

    };

    $addVille = function (FormInterface $form, Region $region = null) {
        $villes = null === $region ? array() : $region->getVilles();

        $form->add('ville', EntityType::class, array(
            'class' => 'AppBundle\Entity\Ville',
            'placeholder' => '--choisir une ville--',
            'choices' => $villes,
            'choice_label' => 'nom',
            'required' => true
        ));


        $form->add('submit', SubmitType::class
        );

    };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($addRegion, $addVille){
            $form = $event->getForm();
            $addVille($form, null);
            $addRegion($form, null);
        }
    );

    $builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) use ($addRegion, $addVille, $em) {
            $form = $event->getForm();
            $data = $event->getData();
            if(isset($data['pays'])){
                $paysId = $data['pays'];

                $repo = $em->getRepository('AppBundle\Entity\Pays');
                $pays = $repo->find($paysId);

                $addRegion($form, $pays);
                $addVille($form, null);
            }
            else if(isset($data['region'])){
                $regionId = $data['region'];

                $repo = $em->getRepository('AppBundle\Entity\Region');
                $region = $repo->find($regionId);

                $addVille($form, $region);
            }
        }
    );
}

А вот и шаблон:

{% block body %}

{% form_theme form 'bootstrap_4_layout.html.twig' %}

{% for message in app.flashes('notice') %}
    <div style="color:green;">
        {{ message }}
    </div>
{% endfor %}

{{ form_start(form) }}
{{ form_errors(form) }}
{{ form_end(form) }}

{% endblock%}

{% block javascripts%}

<script>
    var $pays = $('#adresse_pays');
    var $region = $('#adresse_region');
    var $ville = $('#adresse_ville');

    $pays.change(function() {
        var $form = $(this).closest('form');
        var data = {};
        data[$pays.attr('name')] = $pays.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) {
                $ville.empty()
                var select = $(html).find('#adresse_ville > option')
                $ville.append(select)

                $region.empty()
                var select = $(html).find('#adresse_region > option')
                $region.append(select)
                $region.val($("#adresse_region option:first").val());
                console.log('regions')
                console.log(select)
            }
        });
    });


    $region.change(function() {
        var $form = $(this).closest('form');
        var data = {};
        data[$region.attr('name')] = $region.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) {
                $ville.empty()
                var select = $(html).find('#adresse_ville > option')
                $ville.append(select)
                $ville.val($("#adresse_ville option:first").val());
                console.log('villes')
                console.log(select)
            }
        });
    });


</script>

{% endblock%}

Это предупреждение в форме (рядом с полем города): Ошибка Это значение недопустимо

Я пошел дальше благодаря панели отладки, и кажется, что это поле не отправляет объектно целое число.

Разница, которую я нашел с другим полем, заключается в том, что в поле города:

Normalized Format submitted is null

в другом поле, например, в регионе:

Normalized Format   

Region {#6035 ▼
  -id: 3
  -nom: "Catalogne"
  -villes: PersistentCollection {#6039 …}
  -pays: Pays {#5802 ▶}
  -adresses: PersistentCollection {#6041 …}

}

1 Ответ

0 голосов
/ 13 октября 2018

Это работает!

Я разделил функцию

$ builder-> addEventListener (FormEvents :: PRE_SUBMIT, ... пополам => Я удалил else, если и сделал другую подобную функциюслушать, когда «регион» меняется.

Что меня беспокоит, так это то, что я не понимаю, почему это работает именно так, а не иначе ...

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function (FormEvent $event) use ($addRegion, $addVille, $em) {
        $form = $event->getForm();
        $data = $event->getData();
        if(isset($data['pays'])){
            $paysId = $data['pays'];
            $repo = $em->getRepository('AppBundle\Entity\Pays');
            $pays = $repo->find($paysId);
            $addRegion($form, $pays);
            $addVille($form, null); 
        }
    }        
);

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function(FormEvent $event) use ($addVille, $em) {
        $form = $event->getForm();
        $data = $event->getData();
        if(isset($data['region'])){
            $regionId = $data['region'];
            $repo = $em->getRepository('AppBundle\Entity\Region');
            $region = $repo->find($regionId);
            $addVille($form, $region); 
        }           
    }
);
...