Bonjour à tous,

Je ne comprend pas pourquoi je n'ai pas de message lorsque le formulaire n'est pas valide.

Par exemple, j'ai demandé à ce qu'un champ soit de format "email", lorsque je mets autre chose qu'un email, que j'appuis sur valide rien ne se passe, je reste sur la page formulaire.
Autre exemple, j'ai fait une clé unique "nom", "prénom", "académie" sur mes contacts et lorsque j'essai créer un contact existant, je reste sur la page de formulaire sans explication.

Comment faire pour que les messages d'erreur du formulaire s'affiche bien ?

A noter que les erreurs html5 (comme par exemple "champ requis" s'affiche bien)

Ce que je fais

Le paramètrage du config.yml

    validation:      { enable_annotations: true }

L'entité contact :

<?php

namespace Diff\eSiteBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * contact
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Diff\eSiteBundle\Entity\contactRepository")
 * @UniqueEntity(
 *     fields={"nom", "prenom", "idaca"},
 *     message="Ce contact existe déjà dans l'académie."
 * )
 */
class contact
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=100)
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="prenom", type="string", length=100)
     */
    private $prenom;

    /**
     * @var string
     *
     * @Assert\Email(
     *     message = "The email '{{ value }}' is not a valid email.",
     *     checkMX = true
     * )
     * @ORM\Column(name="mail", type="string", length=100, nullable=true)
     */
    private $mail;

    /**
     * @var string
     *
     * @ORM\Column(name="tel", type="string", length=15)
     */
    private $tel;

     /**
     * @var string
     *
     * @ORM\Column(name="com", type="text", nullable=true)
     */
    private $com;

    /**
     * 
     * @ORM\ManyToOne(targetEntity="Diff\eSiteBundle\Entity\academie")
     * @ORM\JoinColumn(name="academie_id", nullable=false)
     */
    private $idaca;

    /**
     * @ORM\ManyToMany(targetEntity="Diff\eSiteBundle\Entity\AppliAca", inversedBy="contacts")
     * @ORM\JoinTable(name="responsable")
     */
    private $CntAppliaca;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nom
     *
     * @param string $nom
     * @return contact
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string 
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set prenom
     *
     * @param string $prenom
     * @return contact
     */
    public function setPrenom($prenom)
    {
        $this->prenom = $prenom;

        return $this;
    }

    /**
     * Get prenom
     *
     * @return string 
     */
    public function getPrenom()
    {
        return $this->prenom;
    }

    /**
     * Set mail
     *
     * @param string $mail
     * @return contact
     */
    public function setMail($mail)
    {
        $this->mail = $mail;

        return $this;
    }

    /**
     * Get mail
     *
     * @return string 
     */
    public function getMail()
    {
        return $this->mail;
    }

    /**
     * Set tel
     *
     * @param string $tel
     * @return contact
     */
    public function setTel($tel)
    {
        $this->tel = $tel;

        return $this;
    }

    /**
     * Get tel
     *
     * @return string 
     */
    public function getTel()
    {
        return $this->tel;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->CntAppliaca = new \Doctrine\Common\Collections\ArrayCollection();
        $this->idaca = new \Doctrine\Common\Collections\ArrayCollection();

    }

     /**
     * Set com
     *
     * @param string $com
     * @return contact
     */
    public function setCom($com)
    {
        $this->com = $com;

        return $this;
    }

    /**
     * Get com
     *
     * @return string 
     */
    public function getCom()
    {
        return $this->com;
    }

    /**
     * Set idaca
     *
     * @param \Diff\eSiteBundle\Entity\academie $idaca
     * @return contact
     */
    public function setIdaca(\Diff\eSiteBundle\Entity\academie $idaca)
    {
        $this->idaca = $idaca;

        return $this;
    }

    /**
     * Get idaca
     *
     * @return \Diff\eSiteBundle\Entity\academie 
     */
    public function getIdaca()
    {
        return $this->idaca;
    }

    /**
     * Add CntAppliaca
     *
     * @param \Diff\eSiteBundle\Entity\AppliAca $cntAppliaca
     * @return contact
     */
    public function addCntAppliaca(\Diff\eSiteBundle\Entity\AppliAca $cntAppliaca)
    {
        $this->CntAppliaca[] = $cntAppliaca;

        return $this;
    }

    /**
     * Remove CntAppliaca
     *
     * @param \Diff\eSiteBundle\Entity\AppliAca $cntAppliaca
     */
    public function removeCntAppliaca(\Diff\eSiteBundle\Entity\AppliAca $cntAppliaca)
    {
        $this->CntAppliaca->removeElement($cntAppliaca);
    }

    /**
     * Get CntAppliaca
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getCntAppliaca()
    {
        return $this->CntAppliaca;
    }
}

Le controller permettant de gérer le formulaire (

  /**
* @ParamConverter("domaine", options={"mapping": {"dom":
"id"}})
*/    
  public function creatcntAction(domaine $domaine, $num, Request $request)
  {
    $em = $this->getDoctrine()->getManager(); 
    $rep = $em->getRepository('DiffeSiteBundle:AppliAca');
    $fiche= $rep->findOneById($num);

    //création du nouveau contact
    $cnt = new contact();
    $cnt->setIdaca($fiche->getIdAca());
    $cnt->addCntAppliaca($fiche);
    $typ = 'new';

    $cntform = $this->createForm(contactType::class, $cnt);

    //création du formulaire de la liste des contacts
    $listform = $this->createForm(liensCntType::class, $fiche);

    if ($request->getMethod() == 'POST') 
    {
    $val = 0;   
        //gestion du nouveau contact        
            $cntform->handleRequest($request);              

            if ($cntform->isSubmitted() && $cntform->isValid()) 
            {
                //$this->get('session')->getFlashBag()->add('test', 'cntform');     
                $val = 1;
                $em->persist($cnt);            
                $em->flush();
            }
        //gestion de la liste des contacts existants

            $listform->handleRequest($request);

            if ($listform->isSubmitted() && $listform->isValid()) 
            {               
            // On définit un message flash
        //$this->get('session')->getFlashBag()->add('info', 'La fiche a bien été sauvegardé.');
                $val=1; 
                $em->persist($fiche);
                $em->flush();           
            }

            if (val == 1 )
            {
                return $this->redirect($this->generateUrl('diff_esite_fiche', array('dom'=> $domaine->getId(), 'num'=>$num)));
            }
    } 

  return $this->render('DiffeSiteBundle:form:formnewcontact.html.twig',
        array(
        'cntform' => $cntform->createView(),
        'listform' => $listform->createView(),
        'fiche'=>$fiche,
        'typ'=>$typ,      
    ));      
  }

Et la partie affichage twig

<div class="well">
{{form_start(cntform) }}
 <table>
        <thead>
            <tr>
                <td>Nom</td>
                <td>Prénom</td>
                <td>Mail</td>
                <td>Téléphone</td>
                <td>Fonction</td>
            </tr>
        </thead>
        <tbody>
        <tr>
            <td>{{ form_widget(cntform.nom, {'attr': {'class': 'span2'}}) }}</td>
            <td>{{ form_widget(cntform.prenom, {'attr': {'class': 'span2'}}) }}</td>
            <td>{{ form_widget(cntform.mail, {'attr': {'class': 'span2'}}) }}</td>
            <td>{{ form_widget(cntform.tel, {'attr': {'class': 'span2'}}) }}</td>
            <td>{{ form_widget(cntform.com, {'attr': {'class': 'span2'}}) }}</td>
        </tr>
    </tbody>
     </table>
    {{ form_errors(cntform) }}
      <br>
    <input type="submit" value="Ajouter le contact" class="btn btn-primary" />
    <a href="{{ path('diff_esite_fiche', {'dom': app.request.attributes.get('dom'), 'num': app.request.attributes.get('num')} ) }}" class="btn btn-warning" >ANNULER</a>
    {{form_end(cntform)}}
  </div>

Au départ je n'avais pas mis {{ form_errors(cntform) }}, donc je l'ai ajouté pensant que mon problème venait de là. Mais apparement ce n'est pas ça car malgré sa présence, il n'y a toujours pas de message.

Ce que je veux

Je voudrais avoir les messages d'erreur du formulaire affichés lors de la validation de ce dernier

Ce que j'obtiens

Rien! pas de message d'erreur.

Que me manque-t-il pour que les messages s'affichent ?

Merci pour votre aide

3 réponses


BerneDotCom
Réponse acceptée

Bonjour,
A première vue les erreurs ne s'affichent pas car tu utilises form_widget() dans ton Twig, cette fonction ne rend que le champs mais pas les labels/erreurs.

Edit: Remplace les par des : form_row()

Cordialement

Olorin
Auteur

En fait c'est voulu d'utiliser witget car je ne veux que le champ, je gère le label à part, et je veux un affichage dans un tableau.

Par contre pourquoi il faut spécifier chaque form_errors pour que ça s'affiche ?

Bonjour, quelqu'un aurait la réponse s'il vous plaît ? :)