Bonjour à tous !

J'ai suvisi le tuto de graf sur le système de membre.
Tous fonction sauf quand j'entre des champ vide et que je valide cela enregistre comme tel les informations !
Voici mon code :

Users.php

<?php
class User extends AppModel{

     public $validate = array(
        'username' => array(
            array( 
                'rule' => 'alphanumeric',
                'required' => true,
                'allowEmpty' => false,
                'message' => "Votre pseudo n'est pas valide"
            )
        )
     );

}

UsersController.php

<?php
class UsersController extends AppController{

    function signup(){
        if($this->request->is('post')){
            $d=$this->request->data;
            $d['Users']['id'] = null;
            if($this->User->save($d,true,array('username','password','mail'))){

            }else{
                die('error');
            }
        }
    }

}

Et enfin le signup.ctp

<h2>S'enregistrer</h2>

<?php echo $this->Form->create('User'); ?>
   <?php echo $this->Form->input('username',array('label'=>"Pseudo: ")); ?>
   <?php echo $this->Form->input('mail',array('label'=>"Email: ")); ?>
   <?php echo $this->Form->input('password',array('label'=>"Mot de passe: ")); ?>
<?php echo $this->Form->end("S'enregistrer"); ?>

Voila merci de vos réponses a bientôt

Cordialement, rémy

6 réponses


StarTechs
Réponse acceptée

Salut !

Juste après ton

$d['Users']['id'] = null;

tu peux faire :

$this->User->validates()

Qui te renvoie un booléen pour savoir si c'est conforme à tes conditions de validations. Si c'est faux, ne fais pas le save de ton model.

Kareylo
Réponse acceptée

Je résume ce que earhater dit dans son dernier paragraphe.
Ta fonction signup doit devenir comme ça :

function signup(){
        if($this->request->is('post')){
            $d=$this->request->data;
            $d['Users']['id'] = null;
            if($this->User->validates()){
                if($this->User->save($d,true,array('username','password','mail'))){

                }else{
                    die('error');
                }
            }
        }
    }
StarTechs
Réponse acceptée

C'est exact. En gros il faut comprendre que le validates vérifie que l'objet correspond bien aux règles que tu as précisées et le save verifie que l'enregistrement s'est bien passé. En règle générale tu n'est pas obligé de mettre un if après le validates, tu peux faire plus simple comme ceci (je crois que le book cakePHP fait comme ceci il me semble) :

function signup(){
        if($this->request->is('post')){
            $d=$this->request->data;
            $d['Users']['id'] = null;
            if($this->User->validates()){
                $this->User->save($d,true,array('username','password','mail'));
                // L'utilisateur est enregistré
            }
            else {
                die("error");
            }
        }
    }

EDIT : ce que je dis est exact. Voici un exemple d'enregistrement (article d'un blog) : http://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html#autorisation-qui-est-autorise-a-acceder-a-quoi

Merci les gars ;)

Bonsoir.
Alors, deux choses ne vont pas dans ton code.
Pour commencer, c'est inutile de mettre un $d['User']['id'] = null; étant donné que dans la méthode save, tu as restreint les champs à sauvegarder, et que l'id n'en fait pas parti.
Ensuite, pour créer un nouvel enregistrement, avant le save, il te faut mettre :

$this->User->create();

Cela permet de signifier à CakePHP que tu veux un nouvel enregistrement et non un update, ce qui forcera la création d'un enregistrement et non une modification.

Salut Lartak ! Il me semble que Grafikart conseille cette méthode (certeinement cette vidéo) : http://www.grafikart.fr/tutoriels/cakephp/membres-user-auth-260.

En gros il y a deux méthodes : soit celle de mon code, qui permet de ne pas faire de Model->create() mais nécessite de forcer l'ID à null pour éviter tout update de model, soit effectivement faire un Model->create() qui prendra en compte les données POST et si un ID est rprésent alors la requête passera en PUT (pas d'enregistrement) ou ne sera pas enregistré (grâce au tableau dans la méthode save). Chacun choisi celle qu'il veut les deux sont correctes :)