Bonjour à tous,
Voilà plusieurs jours que je coince pour permettre à un utilisateur lambda de s'incrire (grâce au tuto developper un site de A à Z mvc), mais je me tire les cheveux.
Dans controller/UserController.php

function inscription(){ // Fonction qui permet de se connecter
        // debug($this->Session->read());
        if($this->request->data){// Si des données ont été postées
            $data = $this->request->data; // Pour simplifier $this->request->data on le stocke dans $data
            if($data->ccab = empty($data->ccab)){
                $this->loadModel('User');// On charge le modèle User
                $user = $this->User->findFirst(array(// Je recherche dans la base de donnée le premier qui remplie les même conditions
                    'conditions' => array('login' => $data->login
                )));
                if(!empty($user)){ // Si ça remplie les conditions
                    echo 'Cette email existe déjà';
                }else{
                    $data->password = sha1($data->password);// On crypte le mot de passe pour qu'il corresponde avec celui de la base de donnée
                    $data->online = '0';// On insère dans la base de donnée un compte inactif
                    $this->User->create($this->request->data);
                    $this->redirect('users/login');
                }
            }else{
                echo 'Vous êtes enregistré'; 
            }
        }else{
            echo 'Vous n\'avez pas rentré de données'; 
        }
    }

Mon formulaire dans view/users/inscription.php

<div class="container">
    <div class="form-signin-heading">
        <h1>inscription</h1>
    </div>
    <form class="form-horizontal input-lg" action="<?php echo Router::url('users/inscription'); ?> " method="post" role="form"><!-- Alignement dans form.php -->
        <div class="form-group">
            <?php echo $this->Form->input('login','Email', array('placeholder'=>'Enter your email / Rentrer votre email', 'class'=>'form-control')); ?>
            <?php echo $this->Form->input('password','Password / Mot de passe', array('type' => 'password', 'placeholder'=>'Password / Mot de passe', 'class'=>'form-control')); ?>
            <?php echo $this->Form->input('online','hidden'); ?><!-- Ce champ ne doit pas être modifié, du coup caché -->
            <?php echo $this->Form->input('ccab','hidden'); ?><!-- Ce champ ne doit pas être modifié, du coup caché -->
            </br>
                <button type="submit" class="btn btn-primary" value="Se connecter">S'enregistrer</button>
        </div>
    </form>
</div>

Dans core/Model.php j'ai créé mon modèle create

/**
    * Ajouter un nouvel utilisateur
    **/
    public function create($data){
        $log = 'login';
        $fields = array($data);
        $d = array();
        foreach($data as $k=>$v){// Pour chaque information 
            if($k!=$this->login){
                $fields] = "$k=:$k";
                $d":$k"] = $v;
            }elseif(!empty($v)){// Si la clé primaire n'est pas vide.
                $d":$k"] = $v;// Dans ce cas, j'envoie ma clé primaire
            }
        }
        $sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);// On fait une insertion du petit nouveau.
        $pre = $this->db->prepare($sql);
        $pre->execute($d);
            $this->id = $this->db->lastInsertId();
    }

Rien ne marche, Je suppose aussi qu'il faut que je touche à mes fichier conf.php et hook.php. Bref je suis bel et bien planté.

Merci de votre aide

4 réponses


mimosa21
Auteur
Réponse acceptée

Merci d'avoir pris le temps de vous penchez sur mon cas.
J'ai besoin d'une fonction create car la fonction save n'est pas tout à fait adaptée. Ma fonction create va être appelée régulièrement.
En tout cas une chose est sûre, c'est dur de passer de PDO à une structure MVC :)
B-art, tu as raison

if(empty($data->ccab)){
    #code...
}

.
J'ai pris le soin de casser tout ce que j'avais fait et je suis repartis de 0.
Pour ceux que ça intéresse et au passage qu'en pensez-vous?

dans view/visitors/login_fr.php

<div class="container">
    <div class="form-signin-heading">
        <h1>Zone réservée</h1>
    </div>
    <form class="form-horizontal input-lg" action="<?php echo Router::url('visitors/login_fr'); ?> " method="post" role="form"><!-- Alignement dans form.php -->
        <div class="form-group">
            <?php echo $this->Form->input('login','Email', array('placeholder'=>'Rentrer votre email', 'class'=>'form-control')); ?>
            <?php echo $this->Form->input('password','Mot de passe', array('type' => 'password', 'placeholder'=>'Mot de passe', 'class'=>'form-control')); ?>
            <?php echo $this->Form->input('ccab','hidden'); ?><!-- Ce champ ne doit pas être modifié, du coup caché -->
            </br>
                <button type="submit" class="btn btn-primary" value="Se connecter">Se connecter</button>  <a href="<?php echo Router::url('visitors/inscription_fr/'); ?>">Inscription</a>
        </div>
    </form>
</div>

dans view/visitors/inscription_fr.php

<div class="container">
    <div class="form-signin-heading">
        <h1>inscription</h1>
    </div>
    <form class="form-horizontal input-lg" action="<?php echo Router::url('visitors/inscription_fr'); ?> " method="post" role="form"><!-- Alignement dans form.php -->
        <div class="form-group">
            <?php echo $this->Form->input('name','Nom', array('placeholder'=>'Rentrer votre nom', 'class'=>'form-control', 'required'=>'required')); ?>
            <?php echo $this->Form->input('login','Email', array('type'=>'email', 'placeholder'=>'Rentrer votre email', 'class'=>'form-control', 'required'=>'required')); ?>
            <?php echo $this->Form->input('password','Mot de passe', array('type' => 'password', 'placeholder'=>'Mot de passe', 'class'=>'form-control', 'required'=>'required')); ?>
            <?php echo $this->Form->input('id','hidden'); ?><!-- Ce champ ne doit pas être modifié, du coup caché -->
            <?php echo $this->Form->input('ccab','hidden'); ?><!-- Ce champ ne doit pas être modifié, du coup caché -->
            </br>
                <button type="submit" class="btn btn-primary" value="Se connecter">S'enregistrer</button>
        </div>
    </form>
</div>

Dans controller/VisitorController.php

class VisitorsController extends Controller{
    var $table = 'users';
    public $db; // Variable db qui stoquera l'objet pdo.
    function inscription_fr($id = null){
        $salt = "48@!alsd";
        $d'id'] = $id;
        if($this->request->data){
            $data = $this->request->data; // Pour simplifier $this->request->data on le stocke dans $data
            if(empty($data->ccab)){
                $this->loadModel('User');// On charge le modèle User
                $user = $this->User->findFirst(array(// Je recherche dans la base de donnée le premier qui remplie les même conditions
                    'conditions' => array('login' => $data->login
                )));
                if(!empty($user)){ // Si ça remplie les conditions
                    $this->Session->setFlash('Cette email existe déjà.');
                }else{ 
                    $data->password = sha1(sha1($data->password).$salt);// On crypte le mot de passe pour qu'il corresponde avec celui de la base de donnée 
                    $this->User->create($this->request->data);
                    $this->Session->setFlash('Vous allez recevoir un email de confirmation.');
                    $this->redirect('visitors/login_fr');
                }
            }else{// else ccab
                $this->redirect('visitors/login_fr');
            }
        }else{
            return true;
        } 
        $this->set($d);
    }

    /**
    * Login
    **/
    function login_fr(){ // Fonction qui permet de se connecter
        $salt = "48@!alsd";
        // debug($this->Session->read());
        if($this->request->data){// Si des données ont été postées
            $data = $this->request->data; // Pour simplifier $this->request->data on le stocke dans $data
            if($data->ccab = empty($data->ccab)){
                $data->password = sha1(sha1($data->password).$salt);// On crypte le mot de passe pour qu'il corresponde avec celui de la base de donnée
                $this->loadModel('User');// On charge le modèle User
                $user = $this->User->findFirst(array(// Je recherche dans la base de donnée le premier qui remplie les même conditions
                    'conditions' => array('login' => $data->login,'password' => $data->password
                )));
                if(!empty($user)){ // Si ça remplie les conditions
                    $this->Session->write('User',$user); // Je mets $user en session
                }
                $this->request->data->password = ''; //Cela évite de renvoyer une deuxième fois le mot de passe
            }else{
                $this->redirect('visitors/login_fr');
            }
        }
        if($this->Session->isLogged()){// Si l'utilisateur est connecté durant la session

            if($this->Session->user('role') == 'admin'){
                $this->redirect('cockpit');// Alors redirection vers la page d'administration

            }elseif($this->Session->user('role') == 'user'){
                $this->redirect('paris');// Alors redirection

            }else{
                $this->redirect('');
            }
        }
    }

J'ai résolu mes problèmes mais je laisse mon post ouvert pour les remarques.

Merci encore de votre aide.

Bonjour,

Edition :

Pourquoi avoir creer la fonction create ?

Cordialement

Bonsoir,

Peut-être serait-ce du à:

if($data->ccab = empty($data->ccab))

Salut,

Déjà il me semble que la syntaxe utiliser n'est pas la bonne.

Pour vérifier si une variable est vide, il suffit normallement de faire :

if(empty($data->ccab)){
    #code...
}

Ensuite, à quoi sert cette variable ccab?

J'ai l'impression que tu essaies de modifier le script fournit par Graf dans le tuto pour l'adapter à ton besoin mais sans vraiment comprendre ce que tu fais...

A mon avis il est préférable de suivre le tuto pas à pas, sortir quelque chose qui fonctionne, comprendre comment ça fonctionne avant de le modifier...

Eventuellement là, si tu n'y arrive pas, demander conseil et expliquer ce que tu cherche à faire...

Bref, bon dèv' en tout cas!