Bonjour à tous :)

J'ai un petit problème et je n'arrive absolument pas à comprendre d'où cela peut venir.

Mon problème :

  • J'ai un petit formulaire et lorsque je le test pour voir si les erreurs veulent bien s'afficher et bien.....elles ne s'affiches pas....

Je vous joint mon code, si quelqu'un arrive à trouver une bourde que j'aurais fait quelque part et que je n'arrive pas à voir.

Détail :

  • J'ai essayé d'afficher l'erreur dans le formulaire quand j'ajoute un profil, en vain...

  • J'ai donc essayé d'afficher l'erreur avec la fonction validates() et validationErrors de mon model , et là les erreurs de mon formulaire apparaissent bien dans validationErrors.

Ma question :

Pourquoi les erreurs n’apparaissent pas dans mon formulaire et apparaissent dans validationErrors ?

Mon Model Profil.php, pour vous permettre de voir comment sont validées mes données :

<?php
App::uses('AppModel', 'Model');
/**
 * Profil Model
 *
 * @property User $User
 */
class Profil extends AppModel {

/**
 * Primary key field
 *
 * @var string
 */
    public $primaryKey = 'id_profil';

    public $actsAs = array('Acl' => array('type' => 'requester'));
/**
 * Validation rules
 *
 * @var array
 */
    public $validate = array(
        'nom_profil' => array(
            'alphaAndSpace' => array(
                'rule' => array('alphaAndSpace'),
                'message' => 'Seul les lettres et les espaces sont autorisés !',
            ),
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Vous ne pouvez pas laisser vide le nom du profil !',
            ),
            'unique' => array(
                'rule' => array('isUnique'),
                'message' => 'Le nom du profil existe déjà !',
            ),
        ),
    );

    //The Associations below have been created with all possible keys, those that are not needed can be removed

/**
 * hasMany associations
 *
 * @var array
 */
    public $hasMany = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'profil_id',
            'dependent' => false
        )
    );
    public function afterSave($created,$option = array())
    {
        //Mise a jour de la table aros avec l'alias pour que la gestion des droits fonctionnent
        $this->query('UPDATE aros SET alias = "'.$this->data'Profil']'nom_profil'].'" WHERE aros.foreign_key ="'.$this->data'Profil']'id_profil'].'"; ');
    }

    public function parentNode()
    {
        return null;
    }

    public function beforeDelete($cascade = true)
    {
        $idAro = $this->node()[0]'Aro']'id'];
        $this->Aro->delete($idAro);
        $this->Behaviors->disable('Acl');    
        return true;
    }

    public function alphaAndSpace($check) {
        // le tableau $check est passé en utilisant le nom du champ de formulaire comme clé
        // nous devons extraire la valeur pour rendre la fonction générique
        $valeur = array_values($check);
        $valeur = $valeur[0];

        return preg_match('|^[a-zA-Z-]*$|', $valeur);
    }

}

Mon Controller ProfilsController.php avec la fonction index et add :

<?php

    class ProfilsController extends AppController
    {

        public function index()
        {  
            $this->paginate = array('order' => array('Profil.nom_profil' => 'asc' ));
            $profils = $this->paginate('Profil');
            $this->set(compact('profils'));
            $this->set('listPath',$this->getPathAcos());
            $this->set('Acl',$this->Acl);

            if($this->request->is('post') || $this->request->is('put'))
            {
                //Permet la redirection vers la page de modif d'un profil
                if(isset($this->request->data'Profil']'profil_id']))
                {
                    $id = $this->request->data'Profil']'profil_id'];
                    //Si on a recupere un id on essaye de recupere le profil correspondant a cet ID
                    $profil = $this->Profil->findById_profil($id);
                    if (!$profil)
                    {
                        $this->Session->setFlash("Le profil n'existe pas ! ",'message_erreur');
                        $this->redirect(array('action'=>'index'));
                    }
                    else
                    {
                        $this->redirect('/profils/edit/'.$id);
                    }
                }
                elseif (isset($this->request->data'Profil']'nom_profil']))
                {
                    $this->add($this->request->data);
                }
                else
                {
                    $this->Session->setFlash("Action non autorisée !",'message_erreur');
                    $this->redirect(array('action'=>'index'));
                }              
            }
        }

        public function add($data = null)
        {
            if ( $data != null)
            {
                //Création de l'objet Profil avec les données envoyées dans le POST
                $this->Profil->create($data);

                //Si l'utilisateur a bien été sauvegardé dans la base on envoie un message flash et on redirige vers index
                if ($this->Profil->save(null,true,array('nom_profil')))
                {

                    $this->Session->setFlash("Le Profil a été créé",'message_succes');
                    $this->redirect(array('controller'=>'profils','action' => 'index'));
                }
                else
                {
                    //si la sauvegarde a échoué on informe l'utilisateur de l'application qui a voulu enregistré un nouvel utilisateur
                    $this->Session->setFlash("Le profil n'a pas pu être créé !",'message_erreur');
                    $this->redirect(array('controller'=>'profils','action' => 'index'));
                }  
            }
            else
            {
                $this->Session->setFlash("Le profil n'a pas pu être créé !",'message_erreur');
                $this->redirect(array('action'=>'index'));
            }
        }
        public function beforeFilter()
        {
            parent::beforeFilter();
            //On recupere l'ensemble des données de la table Profil pour pouvoir modifier un utilisateur ou en rajouter un
            $searchType=$this->Profil->query('SELECT * FROM profils WHERE nom_profil <> "Admin" AND nom_profil <> "Anonym"');
            $tableau_idname = array();
            foreach ($searchType as $Idprofil)
            {          
                $tableau_idname$Idprofil'profils']'id_profil']] = $Idprofil'profils']'nom_profil'] ;
            }
            $this->set('tableau_idname',$tableau_idname);
        }

    }
?>

Ma vue index.php (juste l'endroit du formulaire):

<!--------- MODAL Ajout Profil -->
<div class="modal fade" id="addProfil" aria-hidden="true" style="display: none;">
    <?php echo $this->Form->create('Profil'); ?>
    <div id='inputProfil'>
        <?php echo $this->Form->input('nom_profil',array(
            'label' => 'Nouveau Profil : ',
            'maxLength' => 20,
            'title' => 'Nouveau Profil',
            'required' => true,
                )
            ); ?>
    </div>
    <div class="modal-footer">
        <a class="bouton btn_close" data-dismiss="modal">Fermer</a>
        <?php echo $this->Form->end('Ajouter'); ?>
    </div>
</div>

J'espère que c'est assez compréhensible comme code :) si non n'hésitez pas à me posez des questions :)

Merci d'avance :)

6 réponses


Pakito
Réponse acceptée

Premier truc qui cloche :

$this->Session->setFlash("Le profil n'a pas pu être créé !",'message_erreur');
$this->redirect(array('controller'=>'profils','action' => 'index'));

Donc ici, non seulement tu n'appelles jamais le validate, qui te permet de récupérer les messages d'erreur, et surtout tu rediriges, donc les sessions Flash sont conservés, mais pas le reste.

Perso, j'ai un code de ce type :

if($this->request->is('ajax')) {
            $ajax_data = array($this->request->data'champ'] => $this->request->data'valeur']);
            $d'user'] = $ajax_data;
            $this->User->create();
            $this->User->set($ajax_data);

            $errors = $this->User->invalidFields();
            if (array_key_exists($this->request->data'champ'],$errors)){
                echo (json_encode(array('message' => $errors$this->request->data'champ']][0], 'resultat' => false)));
            }else{
                switch ($this->request->data'champ']) {
                    case 'username':
                        $message = 'Ce pseudo est disponible';
                        break;

                    case 'email':
                        $message = 'Cet email est valide';
                        break;

                    case 'password':
                        $message = 'Le mot de passe est valide';
                        break;
                    case 'new_password':
                        $message = 'Le mot de passe est valide';
                        break;
                    case 'new_password_2':
                        $message = 'Le mot de passe est valide';
                        break;
                }
                echo (json_encode(array('message' => $message, 'resultat' => true)));
            }
        }

Dans mon cas, c'est une validation en Ajax, champ par champ, lors de la saisie, d'où le traitement effectué pour savoir de quel champ il s'agit, et d'avoir un case break pour les messages de validation.

Mais la logique est là :

  • tu instancie ton model
  • tu lui passes les données saisies par l'utilisateur
  • tu fais appel à validate
  • si tu as une erreur ou des erreurs, tu les passes à ta vue et tu les affiche
  • si tu n'as pas d'erreur, alors tu fais un $this->User->save();

Et hop ! La doc de Cake te donne également des exemples : http://book.cakephp.org/2.0/fr/models/data-validation/validating-data-from-the-controller.html

Bah...C'est un peu succinct de dire "ça marche" pas, et de joindre le code complet.
ça marche pas chez moi ça ne veut rien dire, ton application réagit forcément. Ensuite donnes des extraits de code, parce-que sans vouloir être vexant, lire toutes les lignes je ne vois pas l'intérêt et personnellement ça me fatigue les nyeux :)

Donc reprends, et sois concis. Tu dis "J'ai fait ça, ça fait ça et je l'ai fait avec ça" :) Merki !

Jeremy C
Auteur

Désolé pour ma réponse tardive, je ne pouvais pas répondre ce WE :/

J'ai pris compte de ton commentaire et donc j'ai refait mon poste.J'espère que j'ai été plus précis :)

J'ai un petit problème et je n'arrive absolument pas à comprendre d'où cela peut venir.
Mon problème :
- J'ai un petit formulaire et lorsque je le test pour voir si les erreurs veulent bien s'afficher et bien.....elles ne s'affiches pas....
Je vous joint mon code, si quelqu'un arrive à trouver une bourde que j'aurais fait quelque part et que je n'arrive pas à voir.
Détail : 
- J'ai essayé d'afficher l'erreur dans le formulaire quand j'ajoute un profil, en vain...
- J'ai donc essayé d'afficher l'erreur avec la fonction validates() et validationErrors de mon model , et là les erreurs de mon formulaire apparaissent bien dans validationErrors.

Tu parles de quelles erreurs ?
Ton modèle, le controller ou même le côté html ?

Je ne comprends pas de quoi tu parles

Jeremy C
Auteur

Désolé si je ne suis pas très clair :/

Alors je veux tester mes formulaires pour voir si les messages de validation fonctionnent, et donc je pense que c'est au niveau de la vue que les messages que l'on définit sur le model ne s'affiche pas :/

As-tu mieux compris ?? :)

Cordialement,

Jeremy

Jeremy C
Auteur

Ok merci je vais donc essayé de cette manière là :)
Je tient au courant :)

Edit : Fonctionne comme je veux maintenant en suivant la méthode de Pakito :D

merci :D