Zend Framework: après une action différente puis revenir à l'action d'origine en cas d'échec de validation de formulaire et de garder les champs

StackOverflow https://stackoverflow.com/questions/3876877

Question

Cela peut sembler un scénario bizarre, mais j'ai deux formes sur une page. On est juste poster à lui-même. J'ai fait le deuxième poste à une autre action pour maintenir le code plus propre. Peut-être pas le bon choix ...

Le problème que je vais avoir est maintenant que si cette seconde forme ne filtre pas, je rediriger vers la page avec la forme, mais je ne sais pas comment garder mes champs de formulaire rempli avec les informations d'origine de l'utilisateur entré. Est-il possible de le faire et de garder à l'affichage de deux actions distinctes, ou dois-je mordre juste la balle et ont deux formes republier la même action et faire face à la logique de désordre?

Était-ce utile?

La solution

Je soumettrait les deux formes de la même action. Il ne devrait vraiment pas être quelque chose de trop en désordre à ce sujet. Dans chaque forme inclure un champ caché pour signifier quelle forme est soumis.

Application_Form_Login:

 /* other form elements */
 $this->addElement('hidden', 'login', array(
      'value' => 1
 ));

Application_Form_Register:

 /* other form elements */
 $this->addElement('hidden', 'register', array(
      'value' => 1
 ));

Contrôleur:

$loginForm = new Application_Form_Login();
$registerForm = new Application_Form_Register();

if($this->_request->isPost()) {
     if($this->_request->getPost('login')) {
         if($loginForm->isValid($this->_request->getPost())) {
             // validated, redirect
             $this->_helper->redirector('profile', 'user');
         }
     }
     if($this->_request->getPost('register')) {
         if($registerForm->isValid($this->_request->getPost())) {
             // validated, proceed as needed
         }
     }
}

$this->view->loginForm = $loginForm;
$this->view->registerForm = $registerForm;

Voir:

echo $this->loginForm;

echo $this->registerForm;

Avec ce type de configuration, si l'une de vos formes validation échoue, isValid() conservera toutes les données qui ont été saisies et vous rediriger toujours sur une validation réussie de l'un ou l'autre des formes.

Autres conseils

Personnellement, je pense que chaque forme devrait poste à son propre contrôleur, que vous avez. Cela permet de maintenir le code pour le traitement de cette forme en un seul endroit. Le problème ici est que vous voulez revenir à la page originale sur la validation a échoué. Mais pourquoi? Pourquoi ne pas réafficher simplement le formulaire dans le contrôleur cible, tout comme vous le feriez s'il y avait un seul formulaire sur la page?

Par exemple, envisager un formulaire de connexion qui apparaît sur chaque page d'un sie (peut-être parce que dans le modèle / mise en page du site). Il affiche à quelque chose comme AuthController::loginAction(). Si la connexion échoue, vous ne lui envoyez pas généralement revenir à la page à partir de laquelle il est venu. Vous le laisser à la page de connexion, avec la forme comme pré-rempli à partir du $_POST que vous voulez qu'il soit (probablement un nom d'utilisateur, mais pas son mot de passe).

Voir cette réponse pour une discussion similaire.

Mise à jour : Il y avait une autre pensée dans ce domaine. Si vous voulez vraiment gérer le traitement de deux contrôleurs différents afin de le garder sur la page à partir de laquelle il a affiché la forme, au moins extrait cette forme de traitement sur dans un l'action aide . De cette façon, vous pouvez au moins garder cette forme de traitement SEC .

Mise à jour : Rob Allen vient d'écrire un billet de blog « nofollow noreferrer »> « une forme dans votre mise en page » dans lequel il décrit une méthode qui utilise une action helper avec une méthode de preDispatch() qui instancie et traite la forme. Très agréable.

Comment vous redirigez? Je ne vois pas le problème si vous affichez seulement la page de formulaire. Vous pouvez vous pré-remplir des formulaires en utilisant Zend_Form :: Populate ().

Eh bien, je voudrais juste garder les deux formes qui présentent sur la même page.

Je ne vois pas pourquoi votre code devrait obtenir une moins lisible. Apprenez à utiliser les aides d'action et vos contrôleurs regarderont soudainement extrêmement simple et lisible:

public function indexAction() 
{
    $request = $this->getRequest();

    // send forms to view, so we can print them
    // but also so we can access them in action helpers
    $this->view->form = $this->_getForm('Form1', '/');
    $this->view->form2 = $this->_getForm('Form2', '/');

    if ($request->isPost())
    {
        // process the first form
        if (isset($_POST['form_submit_button']) && $this->view->form->isValid($_POST))
        {
            $this->_helper->form($this->view->form->getValues());
        }
        // process the second form
        else if (isset($_POST['form2_submit_button']) && $this->view->form2->isValid($_POST))
        {
            $this->_helper->form2($this->view->form2->getValues());
        }
}

Le traitement de chaque forme aurait son propre aide d'action.

scroll top