Bonjour à tous,
Voila je developpe une application, et sur un meme layout je voudrais qu'un membre puisse s'inscrire ou se connecter.
Problème : J'ai deux formulaires avec des nom de champs identiques et du coup ils sont tous les deux soumis a la validation.
Voici les codes:
formulaire de connexion
<?php
echo $this->Session->flash('auth');
echo $this->Form->create('User', array('action'=>'login'));
echo $this->Form->input('login', array('div'=>false, 'label'=>false, 'placeholder' => 'Pseudo'));
echo $this->Form->input('password', array('type'=>'password', 'div'=>false, 'label'=>false, 'placeholder' => 'Mot de passe'));
echo $this->Form->end('Connexion');
?>
formulaire d'inscription
<?php
echo $this->Form->create('User', array('action'=>'add'));
echo $this->Form->input('login', array('label'=>false, 'placeholder' => 'Pseudo'));
echo $this->Form->input('password', array('type'=>'password', 'label'=>false, 'placeholder' => 'Mot de passe'));
echo $this->Form->input('password_confirm', array('type'=>'password', 'label'=>false, 'placeholder' => 'Confirmer le mot de passe'));
echo $this->Form->input('email', array('label'=>false, 'placeholder' => 'Adresse email'));
echo $this->Form->input('email_confirm', array('label'=>false, 'placeholder' => 'Confirmer votre adresse email'));
echo $form->end('S\'inscrire');
?>
Comment faire pour que le champs login du formulaire de connexion ne soit pas soumis à la validation ?
Cordialement
ça va bloquer Il faut intercepter les messages d'erreur et les vider avant d'afficher l'un ou l'autre des forms suivant les cas (jamais eu le cas donc je peux donner que cette piste)
Alors j'ai bricolé un peu, et j'ai changer le nom de certains champs dans la vue, puis avec beforeSave() j'ai fait correspondre les champs.
Mais je vais essayer de vider les messages d'erreur. Merci
Bonjour à tous,
J'essaie de faire la même chose et j'ai trouvé un exemple sur le net que je n'arrive pas à mettre en place.
Voici le lien
Si tu y arrives fais moi signe ;0)
En espérant que cela t'aidera.
PS : Un grand merci à Grafikart pour ses tutos.
Moi j'ai réussi :
Voici mon code :
<?php $action = $this->request->params'action'];?>
<div class="grid_12">
<div class="box_top">
<h2 class="icon key">Login</h2>
<ul class="sorting">
<li><a href="#connexion" <?php echo $action=='login'?'class="active"':'' ;?>>Login</a></li>
<li><a href="#signup" <?php echo $action=='signup'?'class="active"':'' ;?>>S'enregistrer</a></li>
<li><a href="#forgot" <?php echo $action=='password'?'class="active"':'' ;?>>Mot de pass oublié</a></li>
</ul>
</div>
<div class="box_content padding">
<div class="tabs">
<div id="connexion">
<?php echo $this->Session->flash('login'); ?>
<?php echo $this->Form->create('User', array(
'id' =>'Users-login',
'url' => array(
'controller' => 'users',
'action' => 'login'))); ?>
<?php echo $this->Form->input('username',array(
'id' => 'login',
'label' => array(
'class' =>'left',
'text' =>'Login'),
'class' => ' ',
'error' =>'',
'div' => 'field noline nopadding')) ?>
<?php echo $this->Form->input('password',array(
'id' => 'pass',
'label' =>array(
'class' =>'left',
'text' =>'Password'),
'class' => '',
'error' =>'',
'title' => '',
'div' => 'field',)) ?>
<div class="field noline nopadding">
<?php echo $this->Form->button("Login",array(
'class' => 'right',
'div' => 'right',
'type' => 'submit'));?>
</div>
<?php echo $this->Form->end(); ?>
</div>
<div id="signup">
<?php echo $this->Session->flash('signup'); ?>
<?php echo $this->Form->create('User', array(
'id' =>'Users-signup',
'url' => array(
'action' => 'signup'))); ?>
<?php echo $this->Form->input('User.1.username',array(
'id' =>'username',
'label' =>array(
'class' =>'left',
'text' =>'Login'),
'class' => 'validation',
'error' => array(
'attributes' => array(
'class' => 'error small',
'wrap' => 'p')),
'title' => 'Choisir un login',
'div' => 'field noline nopadding',)) ?>
<?php echo $this->Form->input('User.1.mail',array(
'id' => 'mail',
'label' => array(
'class' =>'left',
'text' =>'Mail'),
'class' => 'validation',
'error' => array(
'attributes' => array(
'class' => 'error small',
'wrap' => 'p')),
'title' => 'Entrer votre email',
'div' => 'field noline nopadding',)) ?>
<?php echo $this->Form->input('User.1.password',array(
'id' =>'password',
'label' =>array(
'class' =>'left',
'text' =>'Password'),
'class' => 'validation',
'error' => array(
'attributes' => array(
'class' => 'error small',
'wrap' => 'p')),
'title' => 'choisissez votre mot de passe',
'div' => 'field',)) ?>
<?php echo $this->Form->button("S'enregister",array(
'div'=> array('class'=> 'button'),
'id' => 'button',
'type'=> 'submit'
));?>
<?php echo $this->Form->end(); ?>
</div>
<div id="forgot">
<?php echo $this->Session->flash('password'); ?>
<?php echo $this->Form->create('User', array(
'id'=>'Users-password',
'url' => array('action' => 'password'))); ?>
<?php echo $this->Form->input('User.2.mail',array(
'id' =>'mail-password',
'label' =>array('class'=>'left','text'=>'Mail'),
'class' => '',
'error' => '',
'title' => 'Entrer votre email',
'div' => 'field',)) ?>
<?php echo $this->Form->button("Mot de passe oublié",array('div' => 'field noline right nopadding','type' => 'submit'));?>
<?php echo $this->Form->end(); ?>
</div>
</div>
</div>
<div class="box_content padding hide" id="tos">
<div class="box_content padding popup">
<form>
<p class="center">
Un mail va vous être envoyé pour activer votre compte.
</p>
<h6>
</h6>
<a href="/" class="button">Retour à l'acceuil</a>
</form>
</div>
</div>
et mon controlleur :
<?php
class UsersController extends AppController
{
// Enregistrement & création de l'user public
public function signup(){
if($this->request->is('ajax')){
$this->autoRender = false;
if($this->request->is('post') && !empty($this->request->data)) {
// Multiple formulaire donc .1 devant :)
$d'User']'username'] = $this->request->data'User'][1]'username'];
$d'User']'password'] = $this->request->data'User'][1]'password'];
$d'User']'mail'] = $this->request->data'User'][1]'mail'];
$d'User']'id'] = null;
if(!empty($d'User']'password'])) {
$d'User']'password'] = Security::hash($d'User']'password'], null, true);
}
$this->User->create($d);
if($this->User->save($d, true, array('username', 'mail', 'password'))) {
echo(json_encode(array(
'resultat' => true,
)));
} else {
echo(json_encode(array(
'resultat' => false,
)));
}
}
}
else{
$this->layout = 'login';
if($this->request->is('post') || $this->request->is('put')){
$d'User']'username'] = $this->request->data'User'][1]'username'];
$d'User']'password'] = $this->request->data'User'][1]'password'];
$d'User']'mail'] = $this->request->data'User'][1]'mail'];
// Forcage de l'id à null
$d'User']'id'] = null;
// Hash du mot de passe
if (!empty($d'User']'password'])) {
$d'User']'password'] = Security::hash($d'User']'password'],null,true);
}
// Enregistrement du nouvel user
if($this->User->save($d,true,array('username','password','mail'))){
// Création d'un email de validation
$link = array('controller'=>'users','action'=>'activate',$this->User->id.'-'.md5($d'User']'password']));
App::uses('CakeEmail','Network/Email');
$mail = new CakeEmail();
$mail->from('mail@gmail.com')
->to($d'User']'mail'])
->subject('Test :: Inscription')
->emailFormat('html')
->template('signup')
->viewVars(array('username'=>$d'User']'username'],'link'=>$link))
->send();
$this->Session->setFlash("Votre Compte a bien été crée, vous allez recevoir un mail pour valider votre compte ","aides/notif",array('taille'=>'small','type'=>'success'),'login');
$this->redirect('/');
}
else
{
$this->Session->setFlash('Corrigé vos erreurs',"aides/notif",array('taille'=>'small','type'=>'error'),'signup');
}
}
}
}
// Connexion de l'user public
public function login(){
$this->layout = 'login';
$this->set('title_for_layout', "Connexion");
// Si dejé connecté :
if (AuthComponent::user('id')){
$this->redirect('/membre/pages');
}
else{
if($this->request->is('post')){
if ($this->Auth->login()) {
$this->User->id = $this->Auth->user('id');
$this->User->saveField('lastlogin',date('Y-m-d H:i:s'));
$this->Session->setFlash("Vous êtes maintenant connecté","aides/notif2",array('type'=>'success'));
$this->redirect('/membre/pages/index');
}else{
$this->Session->setFlash('Identifiants incorrects',"aides/notif",array('type'=>'error','taille'=>'small','id'=>'err'),'login');
}
}
}
}
// Déconnexion de l'user membre
public function membre_logout(){
$this->redirect($this->Auth->logout());
}
// Déconnexion de l'user membre
public function logout(){
$this->redirect($this->Auth->logout());
}
// Activation du compte
public function activate($token){
$this->layout = 'login';
$token = explode('-',$token);
$user = $this->User->find('first',array(
'conditions' => array(
'id' => $token[0],
'MD5(User.password)' => $token[1],
'active' => 0)
));
if (!empty($user)) {
$this->User->id = $user'User']'id'];
$this->User->saveField('active',1);
$this->Session->setFlash('Votre Compte a bien été activé',"aides/notif2",array('type'=>'success'));
$this->Auth->login($user'User']);
$this->requestAction(array(
'controller' => 'Categories',
'action' => 'adduser'
));
}
else {
$this->Session->setFlash("Le compte spécifié a déja été validé ou n'existe pas","aides/notif",array('taille'=>'small','type'=>'login'));
}
$this->redirect('/');
}
// Mot de pass oublié
public function password(){
$this->layout = 'login';
if (!empty($this->request->params'named']'token'])) {
$token = $this->request->params'named']'token'];
$token = explode('-',$token);
$user = $this->User->find('first',array(
'conditions' => array(
'id' => $token[0],
'MD5(User.password)' => $token[1],
'active' => 1)
)
);
if ($user) {
$this->User->id = $user'User']'id'];
$password = substr(md5(uniqid(rand(),true)),0,8);
$this->User->saveField('password',Security::hash($password,null,true));
$this->Session->setFlash("Votre mot de passe a été réinitialiser : Voici votre nouveau mot de pass : $password ",'aides/notif',array('taille'=>'small','type'=>'warning'),'login');
$this->redirect(array('controller'=>'users','action'=>'login'));
}else {
$this->Session->setFlash("Le lien n'est pas valide",'aides/notif',array('taille'=>'small','type'=>'error'),'password');
}
}
// Génération du mail avec un token
if ($this->request->is('post') || $this->request->is('put')) {
$v = current($this->request->data);
$v'mail'] = $this->request->data'User'][2]'mail'];
$user = $this->User->find('first',array(
'conditions' => array(
'mail'=>$v'mail'],
'active' => 1)));
if (empty($user)) {
$this->Session->setFlash('Aucun utilisateur ne correspond a cet email','aides/notif',array('taille'=>'small','type'=>'error'),'password');
}else {
App::uses('CakeEmail','Network/Email');
$link = array('controller'=>'users','action'=>'password','token' => $user'User']'id'].'-'.md5($user'User']'password']));
$mail = new CakeEmail();
$mail->from('mail@gmail.com')
->to($user'User']'mail'])
->subject('Test :: Mot de passe oublié')
->emailFormat('html')
->template('mdp')
->viewVars(array('username'=>$user'User']'username'],'link'=>$link))
->send();
$this->Session->setFlash('Un email viens de vous être envoyé','aides/notif',array('taille'=>'small','type'=>'success'),'login');
$this->redirect('/');
}
}
}
// Edition du compte membre
public function membre_edit(){
$user_id = $this->Auth->user('id');
if(!$user_id){
$this->redirect('/');
}
$this->User->id = $user_id;
$passError = false;
if ($this->request->is('put') || $this->request->is('post') ) {
$d = $this->request->data;
$d'User']'id'] = $user_id;
if (!empty($d'User']'pass1'])) {
if ($d'User']'pass1'] == $d'User']'pass2']) {
$d'User']'password'] = Security::hash($d'User']'pass1'],null,true);
}else {
$passError = true;
}
}
if ($this->User->save($d,true,array('firstname','lastname','password'))) {
$this->Session->setFlash('Votre profil a bien été modifié','aides/notif',array('taille'=>'','type'=>'success'));
}else{
$this->Session->setFlash("Erreur, la modification n'a pas pu être effectué",'aides/notif',array('type'=>'error'));
}
if ($passError) {
$this->User->validationErrors'pass2'] = array("Les mots de passe ne correspondent pas");
}
}else {
$this->request->data = $this->User->read();
$this->set('title_for_layout', "Mon Profil");
}
$this->request->data'User']'pass1'] = $this->request->data'User']'pass2'] = '';
}
public function validation() {
if($this->request->is('ajax')){
$this->autoRender = false;
$ajax_data = array($this->request->data'champ'] => $this->request->data'valeur']);
$champ = $this->request->data'champ'];
$d'user'] = $ajax_data;
$this->User->create($ajax_data);
$errors = $this->User->invalidFields();
if (array_key_exists($champ,$errors)){
echo ($errors$champ][0]);
}else{
echo ("1");
}
}
}
}
?>
Si vous avez des questions ;)
J'ai mis ton code et quand je clique sur "S'enregistrer" avec tous les champs vides, ce sont les champs de du formulaire "login" qui deviennent rouges.
J'ai loupé un truc ?
Voici mon code de ma Classe User (extraite du tuto de grafikart):
<?php
Class User extends AppModel{
public $validate = array(
'username' => array(
array(
'rule' => 'alphanumeric',
'required' => true,
'allowEmpty' => false,
'message' => "Votre pseudo n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => 'Ce pseudo est déjà pris'
)
),
'email' => array(
array(
'rule' => 'email',
'required' => true,
'allowEmpty' => false,
'message' => "Votre email n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => 'Cet email est déjà pris'
)
),
'password' => array(
array(
'rule' => 'notEmpty',
'allowEmpty' => false,
'message' => 'Vous devez saisir un mot de passe'
)
)
);
}
?>
La vue que je t'ai envoyé il faut la mettre aussi dans signup et password :).
C'est la seule solution que j'ai trouvé pour le moment
J'ai réussi !! ! !! ;)
J'ai utilisé la base de XciD sur l'utilisation des champs nommés [1].
Je vous mets ma solution dès que j'ai tout testé (login, signup, password).
A+
Alors voici ma vue login
<div class="page-header">
<h2>Se connecter</h2>
</div>
<?php echo $this->Form->create('User', array(
'id' =>'UserLoginForm',
'url' => array(
'controller' => 'users',
'action' => 'login')
)
);
?>
<?php echo $this->Form->input('username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end("Se connecter"); ?>
<div class="page-header">
<h2>S'enregistrer</h2>
</div>
<?php echo $this->Form->create('User', array(
'id' =>'UserSignupForm',
'url' => array(
'controller' => 'users',
'action' => 'signup')
)
);
?>
<?php echo $this->Form->input('User.1.username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('User.1.email',array('label'=>"Email")); ?>
<?php echo $this->Form->input('User.1.password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end("S'enregister"); ?>
Ma vue signup :
<div class="page-header">
<h2>Se connecter</h2>
</div>
<?php echo $this->Form->create('User', array(
'id' =>'UserLoginForm',
'url' => array(
'controller' => 'users',
'action' => 'login')
)
);
?>
<?php echo $this->Form->input('User.1.username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('User.1.password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end("Se connecter"); ?>
<div class="page-header">
<h2>S'enregistrer</h2>
</div>
<?php echo $this->Form->create('User', array(
'id' =>'UserSignupForm',
'url' => array(
'controller' => 'users',
'action' => 'signup')
)
);
?>
<?php echo $this->Form->input('username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('email',array('label'=>"Email")); ?>
<?php echo $this->Form->input('password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end("S'enregister"); ?>
et enfin mon controller :
<?php
Class UsersController extends AppController {
function index() {
}
function signup(){
// Si des données ont été postées :
if($this->request->is('post')){
// On vérifie si on se trouve dans le cas 'User'][1]:
if (isset($this->request->data'User'][1])) {
$d = $this->User->create($this->request->data'User'][1]);
$this->request->data = $d;
} else {
$d = $this->request->data;
}
$d'User']'id'] = null;
if(!empty($d'User']'password'])){
$d'User']'password'] = Security::hash($d'User']'password'], null, true);
}
if($this->User->save($d,true,array('username','password','email'))){
// Création du lien pour activation du compte
$link = array('controller'=>'users','action'=>'activate',$this->User->id.'-'.md5($d'User']'password']));
// Création du mail
App::uses('CakeEmail','Network/Email');
$mail = new CakeEmail('default');
$mail->from('noreply@free.fr')
->to($d'User']'email'])
->subject('Test : Inscription')
->emailFormat('html')
->template('signup')
->viewVars(array('username' => $d'User']'username'],'link'=>$link))
->send();
$this->Session->setFlash("Votre compte a bien été créé","notif");
}else{
$this->Session->setFlash("Merci de corriger vos erreurs","notif",array('type' => 'error'));
}
}
}
function login() {
// Si des données ont été postées :
if($this->request->is('post')){
// On vérifie si on se trouve dans le cas 'User'][1]:
if (isset($this->request->data'User'][1])) {
$d = $this->User->create($this->request->data'User'][1]);
$this->request->data = $d;
} else {
$d = $this->request->data;
}
// on vérifie que l'identifiant soit bien renseigné
if (empty($d'User']'username'])) {
$this->User->validationErrors'username'] = array('Saississez votre login.');
} elseif (empty($d'User']'password'])) {
$this->User->validationErrors'password'] = array('Saississez votre mot de passe.');
}
if ($this->Auth->login()) {
$this->User->id = $this->Auth->user("id");
$this->User->saveField('lastlogin', date('Y-m-d H:i:s'));
$this->Session->setFlash("Vous êtes maintenant connecté(e)","notif");
$this->redirect('/');
} else {
$this->Session->setFlash("Identifiant incorrect","notif",array('type' => 'error'));
}
}
}
function logout(){
$this->Auth->logout();
$this->redirect('/users/index');
}
function activate($token){
$token = explode('-',$token);
$user = $this->User->find('first',array(
'conditions' => array('id' => $token[0],'MD5(User.password)' => $token[1],'active' => '0')
));
if (!empty($user)){
$this->User->id = $user'User']'id'];
$this->User->saveField('active','1');
$this->Session->setFlash("Votre compte a bien été activé","notif");
$this->Auth->login($user'User']);
}else{
$this->Session->setFlash("Le lien d'activation ne semble pas valide","notif",array('type' => 'error'));
}
$this->redirect('/');
}
}
?>
Je débute sur CakePHP donc il est possible (je pense) d'améliorer le code.
Si vous avez des questions je suis là.
A+
Ouep, sauf que mes vues signup et login sont différentes. Si je suis sur la vue login alors les champs sur le formulaire signup sont indexé d'un [1] et inversement. cela me permet de faire toujours pointer les erreurs sur les champs du modele user et non 'User'][1]'username]... car je n'ai pas réussi ;)
Au niveau des erreurs ?
Les erreurs se mettent sur les bons champs suivant le formulaire que tu valides.
C'est ce que l'on veut non ?