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 estCode:
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:
1
2
3 login_donateur: url: /don/login param: { module: donateur, action: login }
Voici la classe du formulaire:Code:
1
2
3
4 public function executeLogin(sfWebRequest $request) { $this->form = new LoginForm(); }
Le code d'affichage de ce formulaire est le suivant:Code:
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:
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:
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:$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:$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: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:
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