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
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.
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!