Bonjour,
Je suis en train de terminer le tuto de la ferme du web (oui, je sais, il est sous symfony 1.2, mais je l'ai adapté pour sf 1.4)
Je rencontre cependant un problème avec leur principe d'authentification (je sais qu'ils ont réinventé la roue car il existe des plugins pour)
J'ai le routing suivant:
Quand je veux m'authentifier, la route suivie est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 login_donateur: url: /don/login param: { module: donateur, action: login } check_login_donateur: url: /don/verification-mot-de-passe param: { module: donateur, action: doLogin }et le code de l'action:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 login_donateur: url: /don/login param: { module: donateur, action: login }
Voici la classe du formulaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public function executeLogin(sfWebRequest $request) { $this->form = new LoginForm(); }
Le code d'affichage de ce formulaire est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 <?php class LoginForm extends sfForm { public function configure() { unset( $this["lvl"], $this["etat"], $this["id"], $this["ip_inscription"], $this["last_login"], $this["date_inscription"] ); $this->setWidgets(array( 'login' => new sfWidgetFormInputText(), 'pass' => new sfWidgetFormInputPassword() )); $this->widgetSchema->setNameFormat('login[%s]'); $this->setValidators(array( 'login' => new sfValidatorAnd( array( new sfValidatorString( array('required' => true, 'min_length' => 3, 'max_length' => 14), array( 'min_length' => "L'identifiant est trop court. 3 caractères minimum.", 'max_length' => "L'identifiant est trop long. 14 caractères maximum", ) ), new sfValidatorRegex( array('pattern' => '/^[a-zA-Z0-9-]+$/') ) ), array(), array( 'required' => "L'identifiant est indispensable", 'invalid' => "L'identifiant ne peut contenir de caractères spéciaux." ) ), 'pass' => new sfValidatorString( array('required' => true, 'min_length' => 6, 'max_length' => 20), array( 'min_length' => "Le mot de passe est trop court. 6 caractères minimum.", 'max_length' => "Le mot de passe est trop long. 20 caractères maximum", 'required' => "Le mot de passe est indispensable", 'invalid' => "Le mot de passe doit avoir entre 6 and 20 caractères" ) ), )); $this->validatorSchema->setPostValidator( new sfValidatorCallback(array('callback' => array($this, 'checkLogin'))) ); } public function checkLogin($validator, $values) { if (!empty($values['login']) && !empty($values['pass'])) { $membre = Doctrine::getTable('donateur')->findOneByLogin($values['login']); if ($membre) { if ($membre->getPass() == ($values['pass'])) { // Login correct ! if ($membre->getEtat() == 1) { return $values; } else { if ($membre->getEtat() == 0) { throw new sfValidatorError($validator, 'Votre compte est toujours désactivé. Veuillez cliquer sur le lien de confirmation reçu par mail pour activer votre compte.'); } else { throw new sfValidatorError($validator, 'Vous êtes banni du site.'); } } } else { // Connexion incorrecte throw new sfValidatorError($validator, 'L\'identifiant et/ou le mot de passe est incorrect'); } } else { throw new sfValidatorError($validator, 'L\'identifiant n\'existe pas.'); } } } }
A ce moment-là, c'est ce code, dans actions.class.php, qui s'exécute:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <h2>Connexion</h2> <form action="<?php echo url_for('@check_login_donateur'); ?>" method="post"> <table> <?php echo $form; ?> <tr> <td colspan="2"><input type='submit' value="Connexion" /></td> </tr> </table> </form>
J'ai cru que l'erreur venait du fait que le mot de passe semblait ne pas être bindé avec le formulaire ici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public function executeDoLogin(sfWebRequest $request) { $this->forward404Unless($request->isMethod('post')); $this->form = new LoginForm(); $this->form->bind($request->getPostParameter('login')); if ($this->form->isValid()) { $donateur = Doctrine::getTable('donateur') ->findOneByLogin($request->getPostParameter('login')); // On set la session de l'utilisateur. $this->getUser()->setAuthenticated(true); // On stocke les infos utiles dans la session utilisateur $this->getUser()->setAttribute("id", $donateur->getId()); $this->getUser()->setAttribute("login", $donateur->getLogin()); $this->getUser()->setAttribute("level", $donateur->getLvl()); // On set les accès de l'utilisateur switch ($donateur->getLvl()) { case 1: $this->getUser()->addCredential("donateur"); break; case 9: $this->getUser()->addCredential("admin"); break; default: $this->getUser()->addCredential("donateur"); } $this->redirect('@homepage'); } else { $this->setTemplate("login"); } }
dans executeDoLogin()
Code : Sélectionner tout - Visualiser dans une fenêtre à part $this->form->bind($request->getPostParameter('login'));
J'ai donc écrit ceciQuand je soumets le formulaire avec un login et un mot de passe, j'obtiens l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part $this->form->bind($request->getPostParameter('login'), getPostParameter('pass'));
A la place de membres, j'ai donateurs dans mon schema, mais ça ne change rien:
Code : Sélectionner tout - Visualiser dans une fenêtre à part SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
J'ai beau chercher depuis hier, je ne vois pas le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 donateur: columns: civilite_id: type: integer(20) notnull: true login: type: string(45) notnull: true pass: type: string(45) notnull: true first_name: type: string(255) notnull: true last_name: type: string(255) notnull: true email: type: string(255) notnull: true unique: true raison_sociale: type: string(255) default: null address: type: string(255) notnull: true postal_code: type: integer(5) notnull: true town: type: string(255) notnull: true country: type: string(2) notnull: true date_inscription: type: timestamp default: null ip_inscription: type: string(16) default: null last_login: type: timestamp default: null lvl: type: integer(4) default: null etat: type: integer(4) default: null
Quelqu'un qui a réalisé ce tutoriel ou qui a déjà connu ce genre de problème pourrait-il m'aider à y voir plus clair?
Merci par avance,
Johnny3
Partager