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:
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 }
Quand je veux m'authentifier, la route suivie est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
login_donateur:
  url: /don/login
  param: { module: donateur, action: login }
et le code de l'action:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
public function executeLogin(sfWebRequest $request)
    {
        $this->form = new LoginForm();
    }
Voici la classe du formulaire:
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.');
            }
        }
    }
 
}
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
<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>
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
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");
        }
    }
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
 $this->form->bind($request->getPostParameter('login'));
dans executeDoLogin()

J'ai donc écrit ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 $this->form->bind($request->getPostParameter('login'), getPostParameter('pass'));
Quand 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
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
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
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
J'ai beau chercher depuis hier, je ne vois pas le problème.

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