Bonjour,

J'ai installer CakePhp il y environ 1 semaine, je commence à le prendre en main, et j'ai une question.

J'ai fais une validation d'un formulaire avec ce framework et j'ai plusieurs questions.

  • La première est comment récuperer un tableau contenant la liste des erreurs (le message de l'erreur concerné) ? Car une fois que je l'ai récupéré, je souhaite l'envoyer en json pour la traiter en ajax et afficher une modal box avec les erreurs dedans.

  • Ma seconde question est comment forcer le contenu d'un champ avec la méthode save ? Je veut enfaite dire que tel champ doit être égal à 0 ou à 1, pour un champ statut ou type de compte par exemple ?

Merci de votre aide et en espérant avoir une réponse rapide.

Cordialement,

Share.

14 réponses


  • $this->Model->validationErrors;
  • Règle de validation ou beforeSave()
Kayn
Auteur

J'ai essayer mais le problème c'est que sa renvois un Array() et je sais pas si json_encode accepte les array pour ensuite les affichés en Ajax.

Bonjour,
json_encode peut effectuer une transformation à partir d'un array

json_encode() côté php et dataType json du côté de l'appel ajax ça fonctionne très bien !

//code php de ta vue
header("Content-Type: application/json", true);
echo json_encode($json);

//appel en ajax
$.ajax({
      ...]
      dataType: "json",
      url: url,
      success: function( response ) 
      { 
        ...]
      },
      error: function( error )
      {
         alert( error );
      }
   } );

Pour les erreurs en Ajax, voilà comment je procède :

J'ai créé une petite fonction ajaxValidation dans le AppModel pour pouvoir vérifier les champs d'un model partout dans mon application

public function ajaxValidation($data) {
        $this->set($data);
        if ($this->validates()) {
            return array('status' => true);
        }
        $invalidFields = $this->invalidFields();
        // Formate les erreurs sous la forme ModelChamps => Message
        foreach ($invalidFields as $key => $value) {
            $key = Inflector::camelize($this->name . '_' . $key);
            $errors$key] = $value[0];
        }
        return array('status' => false, 'errors' => $errors);
}

Ensuite lors de la vérification dans le Controller je procède de la sorte :

if ($this->request->is('ajax')) {
        $this->autoRender = false;
    $response = $this->User->ajaxValidation($this->request->data'User']);
    $this->response->body(json_encode($response));
    $this->response->type('json');
    }

Et ma réponse dans le navigateur ressemble à cela :

{
    "status":false,
    "errors":{
        "UserUsername":"Ce pseudo est déjà utilisé",
        "UserEmail":"Cet email est déjà utilisé",
        "UserPassword":"Entre 6 et 20 caractères",
        "UserTos":"Vous devez accpeter les CGU"
    }
}

Tu n'as plus qu'à adapter ton js pour qu'il affiche les erreurs ou qu'il envoie le formulaire en fonction de la réponse ;)!

Kayn
Auteur

D'accord, mais le problème c'est que quand je fais la commande suivante:

echo json_encode(array('status' => $status, 'message' => $this->Register->validationErrors));

Et bien, j'ai du HTML qui est renvoyé en même temps que mon tableau d'erreurs.

Je ne sais pas du tout pour quelles raisons.

Il me semble qu'il faut que tu mettes ça

$this->layout = 'ajax';

dans la méthode de ton contrôlleur, pour éviter qu'il te rende du html, mais une réponse ajax

Si tu n'utilise pas la même méthode que moi avec le $this->response, pense à mettre en plus du $this->autoRender = false, le $this->layout = false. Ca devrait, je pense, régler le problème

Kayn
Auteur

Il me renvois toujours du code HTML après avoir mis cela dans mon controller:

$this->autoRender = false;
$this->layout = false;

PS: J'ai essayer ta méthode GyZmO, et j'ai aussi le code HTML et je n'ai pas la même réponse que toi.

Il faut créer un layout ajax.ctp (ou le nom que tu veux) dans le dossier /app/views/layouts et dans le controller tu fait ceci :

$this->layout = 'ajax';

Dans ton layout ajax, tu n'écris que ceci :

<?php echo $content_for_layout; ?>
Kayn
Auteur

C'est bon cela fonctionne, merci de votre aide.

Un autre problème est celui que les messages d'erreur s'affiche toujours (que le formulaire soit bien rempli ou non), et certaines règles ne fonctionne pas (vérification de la présence d'un mot de passe et sa longueur minimale). Vous pouvez essayer ici le formulaire d'inscription:
http://www.easy-sharing.net/website/

Voici le contenu de mon model avec les règles de validation:

<?php
class Register extends AppModel
{
    public $useTable = 'users';

    var $validate = array
    (
        'full_name' => array
        (
            array
            (
                'rule' => 'notEmpty',
                'required' => true,
                'allowEmpty' => false,
                'message' => "Vous devez renseigner votre Nom & Prénom."
            ),

            array
            (
                'rule' => '/^[a-zA-Z]{3,}( [a-zA-Z]{3,})?$/',
                'message' => "L'ensemble de votre nom et prénom contient des caractères invalide."
            )
        ),

        'email' => array
        (
            array
            (
                'rule' => 'email',
                'required' => true,
                'allowEmpty' => false,
                'message' => "Votre adresse e-mail n'est pas valide."
            ),

            array
            (
                'rule' => 'isUnique',
                'message' => "L'adresse e-mail saisie est déjà utilisée."
            )
        ),

        'password' => array
        (
            array
            (
                'rule' => 'notEmpty',
                'required' => true,
                'allowEmpty' => false,
                'message' => "Votre devez saisir un mot de passe."
            ),

            array
            (
                'rule' => array('minLength', '6'),
                'message' => "Votre mot de passe doit contenir au minimum 6 caractéres."
            )
        )
    );
}
?>

Voilà, encore merci de votre aide.

Ca ne viendrait pas de là ?

var $validate = array (...

var en php ça ne fonctionne pas, c'est du js :)

Il faudrait mettre ça je pense

public $validate = array(...
Kayn
Auteur

Désolé du temps de réponse j'avais un probleme de connexion internet ...

Non j'ai changé, et j'ai toujours le même problème.

http://easysharing.power-heberg.com/website/

Je ne comprend pas quel est le problème.

Kayn
Auteur

Personne n'a une idée sur le problème ?