Afficher qu’une seule erreur à la fois en cakephp
Lorsque vous soumettez un formulaire avec cakephp (et que vous avez indiqué vos différentes vérifications dans votre modèle), vous obtenez toutes les erreurs pour tous les champs où il y a une erreur, comme ceci:
Ce comportement de base peut être dérangent pour diverses raisons (esthétique, formulaire trop grand etc…).
Je vous propose de n’afficher que la première erreur, ce chiffre pourra être modifié si vous le souhaitez.
Afficher le nombre souhaité d’erreur d’un formulaire cakephp
En cakephp, vous avez 2 choses utiles pour valider vos formulaires depuis le contrôleur :
- $this->Model->validates() qui permet de vérifier si les données sont valides sans devoir faire appel à la bdd (par exemple, pour un formulaire de contact)
- et $this->Model->validationErrors qui est un tableau contenant toutes les erreurs du formulaire
Alors comment on les utilise?
J’ai décidé de prendre le cas d’une inscription d’un membre dans la bdd (donc on n’utilisera pas la méthode « validates »).
Nous allons utiliser le tableau « validationErrors ».
Si on reprend l’exemple de toute à l’heure de la capture d’écran, vous avez 2 erreurs et si on fait un var_dump de $this->Model->validationErrors dans notre contrôleur, nous avons :
array (size=2) 'username' => array (size=1) 0 => string 'Un pseudo est requis' (length=20) 'password' => array (size=1) 0 => string 'Un mot de passe est requis' (length=26)
Nous allons tout simplement supprimer toutes les autres clés du tableau validationErrors et ne garder que la première. Et réinjecter notre résultat dans ce tableau.
Je vais vous proposer 2 façons de faire, il en existe bien sur plein d’autres.
Première proposition avec array_keys :
$tab = $this->User->validationErrors; // on recupere toutes les cles du tableau ici username et password dans un tableau $cles $cles = array_keys($tab); //on recupere que la premiere cle ici username $premiere_cle=$cles[0]; //on cree une copie du tableau d'erreur $tab2=$this->User->validationErrors[$premiere_cle]; // on crash tout le tableau $this->User->validationErrors=array(); // et on reinjecte notre seule erreur $this->User->validationErrors[$premiere_cle]=$tab2;
Seconde solution avec un foreach bloqué après le premier tour :
$tab = $this->User->validationErrors; //on boucle sur toutes les erreurs foreach ($tab as $key => $value) { //on crash le tableau d'erreur $this->User->validationErrors=array(); /*et on reinjecte notre erreur avec comme cle ici username et une valeur ici le tableau 0 => 'Un pseudo est requis'*/ $this->User->validationErrors[$key]=$value; //on stoppe notre boucle au premier tour break; }
Vous pouvez modifier les 2 solutions pour qu’elles ne récupèrent 2 erreurs par exemple :
$tab = $this->User->validationErrors; $i=0; foreach ($tab as $key => $value) { //si on est au premier tour de boucle on crashe le tableau if($i==0) $this->User->validationErrors=array(); // et on push notre erreur dans notre tableau $this->User->validationErrors[$key]=$value; //si on est au 2nd tour on arrete la boucle if($i>0) break; $i++; }
Vous savez désormais afficher qu’une seule erreur (ou n’importe quel nombre) de vos formulaires cakephp.
Si vous avez apprécié cet article, n’hésitez pas à le partager sur les réseaux sociaux et/ou de laisser un commentaire ci dessous.
Bon dev à vous 😉