Bonjour,

Je suis actuellement bloqué lorsque je souhaite enregistrer mon formulaire.
C'est un formulaire de renseignement d'un utilisateur.

Dans le formulaire, je remplis un input 'villeCodePostal' ce qui déclanche un action ajax pour sélectionnez les villes , le select 'villeNom' se remplit avec les noms des villes et les id des villes.

Je valide le formulaire, le $request dans le controlleur à bien id de la ville, par contre $form->isValid() retourne false donc redirection vers le formulaire avec le message 'cette valeur n'est pas valide' apparait sous la ville.

Id de la ville de retour est bonne , les relations OnetoMany me paraissent ok, aucun message d'erreur

Le code postal et les villes sont dans la même table.
'mapped' => false pour les noms de ville pour ne pas prendre toutes les villes de la table

un extrait de mon code:
---------------------------------------------
controller:
----------------
/**
     * Creates a new customer entity.
     *
     * @Route("/new", name="customer_new")
     * @Method({"GET", "POST"})
     */
    public function newAction(Request $request)
    {
    ...
    $customer = new Customer();
        $form = $this->createForm('AppBundle\Form\CustomerType', $customer);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $telModifier = str_replace('-', '', $customer->getTelephoneFixe());
            $customer->setTelephoneFixe($telModifier);
            $em = $this->getDoctrine()->getManager();
            $em->persist($customer);
            $em->flush();

            ...
  }

mes entities

  -----------------------------------------------------
    entity: customer
  -----------

/**
 * Customer
 *
 * @ORM\Table(name="customer")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CustomerRepository")
 *
 * Pour empêcher un nouvel client de s'enregistrer en utilisant:
 * ---------------------------------------------------------------------
 * @UniqueEntity("telephonePortable", message="Ce téléphone n'est pas disponible")
 */
class Customer
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * 
     * @ORM\Column(name="prenom", type="string", length=255)
     */
    private $prenom;
    /**
     * @var string
     *
     *     pattern="/^(?:(?:\+|00)33|0)\s*[1-9](?:[\s.-]*\d{2}){4}$/",
     *     match=false,
     *     message="Le numero de téléphone n'est pas valide"
     *
     * @ORM\Column(name="telephone_portable", type="string", length=14, unique=true)
     */
    private $telephonePortable;
    .....

    //////////////////////////////////////////////////----------------------------------------------------------
    /**
     * @var \AppBundle\Entity\VillesFranceFree
     *
     * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\VillesFranceFree", inversedBy="customers")
     * @ORM\JoinColumn(nullable=false)
     *
     */
    private $villesFranceFree;
    //////////////////////////////////////////////////----------------------------------------------------------
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->customers_of_contruction_site = new \Doctrine\Common\Collections\ArrayCollection();
    }
...
}
  ----------------------------------------------------------------
  entity ville
  ---------------
  /**
 * VillesFranceFree
 *
 * @ORM\Table(name="villes_france_free", 
 *     uniqueConstraints={ 
 *              @ORM\UniqueConstraint(name="ville_code_commune_2", columns={"ville_code_commune"}) }, 
 *     indexes={
 *              @ORM\Index(name="ville_nom", columns={"ville_nom"}), 
 *              @ORM\Index(name="ville_code_postal", columns={"ville_code_postal"})})
 * 
 * @ORM\Entity(repositoryClass="AppBundle\Repository\VillesFranceFreeRepository")
 */
class VillesFranceFree
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="ville_nom", type="string", length=45, nullable=true)
     */
    private $villeNom;

    /**
     * @var string
     *
     * @ORM\Column(name="ville_code_postal", type="string", length=255, nullable=true)
     */
    private $villeCodePostal;

    ////////////////////-------------------------
    /**
     * @var \AppBundle\Entity\Customer
     *
     * @ORM\OneToMany(targetEntity="\AppBundle\Entity\Customer", mappedBy="villesFranceFree")
     */
    private $customers;
    //////////////////////////////////////////////////----------------------------------------------------------

    /**
     * Constructor
     */
    public function __construct()
    {
          $this->customers = new \Doctrine\Common\Collections\ArrayCollection();
    }
    ...
    }

CustomerType.php

    ------------------------------------------------------------
    form
    ---------------------------
     public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('villeCodePostal', NumberType::class, array(
                'attr' => array('class' => 'form-control col-md-7 col-xs-12', 'data-validate-length-range' =>'5', 'pattern' => 'numeric'),
                'label' => 'Code postal',
                'mapped' => false,
            ))
            ->add('villeNom', ChoiceType::class, array(
                    'choices' => array('' => ''),
                    'attr' => array('class' => 'form-control col-md-7 col-xs-12'),
                    'label' => 'ville',
                    'mapped' => false,
                    'required'   => false,
            ))
        ;
    }

et pour finir un bout de twig

...
<div class="item form-group">
                                <label class="control-label col-md-3 col-sm-3 col-xs-12" for="{{ form.villeCodePostal.vars.id }}">{{  form_label(form.villeCodePostal)  }} <span class="required">*</span>
                                </label>
                                <div class="col-md-6 col-sm-6 col-xs-12">
                                    {{ form_widget(form.villeCodePostal) }}
                                    {{ form_errors(form.villeCodePostal) }}
                                </div>
                            </div>
                            <div class="item form-group">
                                <label class="control-label col-md-3 col-sm-3 col-xs-12" for="{{ form.villeNom.vars.id }}">{{  form_label(form.villeNom)  }} <span class="required">*</span>
                                </label>
                                <div class="col-md-6 col-sm-6 col-xs-12">
                                    {{ form_widget(form.villeNom) }}
                                    {{ form_errors(form.villeNom) }}
                                </div>
                            </div>
 ...

Petite précisions, lorqu'il revient sur le form le select du nomVille est vide.
Symfony 3

Merci pour votre aide

Bonne journée
drick

Aucune réponse