Envoyer des messages en json

Par Kayn, il y a 12 ans


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.

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

Cordialement,

Share.

14 réponses

Kayn, il y a 12 ans

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.

Grafikart, il y a 12 ans
  • $this->Model->validationErrors;
  • Règle de validation ou beforeSave()
antho07, il y a 12 ans

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

Pewel-OutOfNutella, il y a 12 ans

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 );
      }
   } );
ker0x, il y a 12 ans

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, il y a 12 ans

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.

Pewel-OutOfNutella, il y a 12 ans

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

ker0x, il y a 12 ans

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, il y a 12 ans

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.

Pewel-OutOfNutella, il y a 12 ans

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, il y a 12 ans

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.

Pewel-OutOfNutella, il y a 12 ans

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, il y a 12 ans

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, il y a 12 ans

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