Bonsoir,

J'ai un petit problème : j'essaye d'inclure sur une page un formulaire d'inscription, cependant il y a aussi un formulaire de connexion sur cette même page.

Donc le $validates est valable pour tous les inputs de la page.. :s

Si le visiteur fait une erreur sur le champs d'inscription, le message d'erreur apparaîtra sur les inputs de connexion.
Je peux fournir une image si besoin.

Comment "isoler" les deux formulaires ?

Merci bien d'avance !

9 réponses


normalement tu as le premier formulaire de connexion (qui commence par $this->Form->create('Membre');) qui se referme apres le bouton de submit pour se connecter puis le second avec $this->Form->create('AutreModele'); avec là encore un autre bouton submit et dans ton controlleur tu appelles validates de AutreModele et tout va bien.
Maintenant, si tu souhaites avoir les deux formulaires dans un seul, fait précéder les champs de connexion par 'Membre.' et les autres par 'AutreModele.' ainsi, lorsque tu appelles AutreModele->validates, il ne vérifiera pas les champs de Membre
enfin, s'il s'agit, dans les deux cas du modele Membre, le plus simple est de voir la premiere méthode que je t'ai donnée.

Zouox
Auteur

Merci.

Les deux formulaires ont le modèle User, si je leur donne un modèle différent ils n'auront plus accès à la même table?!

non, il faudra que tu traites le formulaire modifié pour qu'il corresponde à ton modele et aux tables. Par exemple, si tu choisi de renommer le second formulaire en FormulaireBindon (ce qui est dans le Form->create), tu auras $this->data'FormulaireBidon'] donc intriatable par $this->User->validates(), il faudra donc que, lorsque tu traites tes données tu renommers $this->data'FormulaireBidon'] en $this->data'User'] avant $this->User-<set($this->data);

mais je suppose que c'est pour une inscription le second formulaire... tu peux aussi les séparer et les faire rediriger vers deux actions distinctes pour les traiter facilement parce que la méthode que je viens de te donner marche mais n'est pas hyper propre je trouves...

Zouox
Auteur

Si je tiens à les laisser sur la même page, il faut impérativement donner un nom différent à l'un des deux même s'ils ont des actions différentes ?

echo $form->create('User', array('url' => array('action' => 'register')));
echo $form->create('User', array('url' => array('action' => 'login')));

Et qu'ensuite je renomme le "$this->data'FormulaireBidon']" par "$this->data'Registre']" dans le contrôller : action register ?

Merci !

non, s'ils ne redirigent pas vers la même action, ce n'est pas la peine d'avoir un FormulaireBidon, tu peux laisser dorectement le bon modele à utiliser

Zouox
Auteur

En effet, mais voilà ce que ça produit si le visiteur poste n'importe quoi : http://imageshack.us/photo/my-images/638/captureowo.jpg/

ha oui j'avais oublié ce détail là x)
fait deux variables validate dans ton modele... la premiere que tu appelles validate (celle par défaut) doit etre celle que tu utilise le plus souvent et une seconde (dans le modele toujours, que tu appelles valConnexion par exemple) que tu parametres pour la connexion. lorsque c'est le formulaire de connexion qui est exécuté, dans l'action tu faits $this->User)>validate = $this->User->valConnexion; et tu continues, pour l'inscription, tu n'as rien a faire puis que la variable validate est deja la bonne, les messags qui n'ont pas besoin d'etre affichés ne s'afficheront pas par contre je ne suis pas sur que $this->User->validates() retourne vrai dans les bonnes conditions... essaye et dis nous mais si ca ne fonctionne pas, je serais à cours d'idée...

Zouox
Auteur

On dirait bien que j'ai le même problème :(

Voilà ce que j'ai mis dans l'action login :

function login() {
        $this->User->validate = $this->User->valLogin;

        if($this->User->validates())
            {
                $this->flash('Login successful! Click to continue','/');
                $this->redirect("/");
            }
    }

J'ai lu qu'on pouvait passer par un champs "hidden" pour les différencier, c'est possible?

oui ca doit l'etre puisque si le champ a une certaine valeur, on est dans un formulaire, s'il en a un autre, on est dans l'autre mais comment l'utiliser je vois pas a part en revenant sur une de mes propositions précédente que ne fonctionne pas... je suppose que tu as écumé la doc donc inutile de te dire d'aller jetter un coup d'oeuil et pour google meme chose...

jusque là je n'etais pas allé voir google et je me suis souvenu avoir déjà rencontré ce cas il me semble... et ceci avait aidé je crois ;)