Zend Framework: Beitrag andere Aktion dann zu den ursprünglichen Aktion zurück, wenn Felder Validierung und zu halten Form versagt

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

Frage

Dies könnte wie eine seltsame Szenario klingen, aber ich habe auf der einen Seite zwei Formen bekam. Man entsendet nur zu sich selbst zurück. Ich machte den zweiten Beitrag zu einer anderen Aktion des Code sauberer zu halten. Vielleicht nicht die richtige Wahl ...

Das Problem, das ich jetzt habe, ist, dass, wenn die zweite Form nicht Validate tut, ich umleiten mit dem Formular auf die Seite zurück, aber ich weiß nicht, wie meine Formularfelder in dem Benutzer mit den ursprünglichen Informationen gefüllt halten trat ein. Gibt es eine Möglichkeit, das zu tun und zu halten Posting zwei getrennte Aktionen, oder muss ich nur den sauren Apfel beißen und haben beide Formen Post zurück auf die gleiche Aktion und befassen sich mit der chaotischen Logik?

War es hilfreich?

Lösung

würde ich beiden Formen auf die gleiche Aktion vorzulegen. Es sollte wirklich nichts zu chaotisch darüber sein. In jeder Form umfasst ein verstecktes Feld, um anzuzeigen, welche Form vorgelegt wird.

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
 ));

Controller:

$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;

Ausblick:

echo $this->loginForm;

echo $this->registerForm;

Bei dieser Art eines Aufbaus, wenn eine der beiden Formulare Validierung fehlschlagen, wird isValid() alle Daten erhalten, die eingegeben wurde und Sie noch umleiten auf eine erfolgreiche Validierung eines oder beide der Formen.

Andere Tipps

Ich persönlich glaube, dass jede Form sollte Post an einen eigenen Controller, wie Sie haben. Dies hält den Code für die Verarbeitung dieser Form in einem einzigen Ort. Das Problem hierbei ist, dass Sie auf die Originalseite auf Fehler bei der Überprüfung zurückkehren möchten. Aber wieso? Warum nicht einfach das Formular in der Zielsteuerung erneut anzuzeigen, wie würden Sie, wenn es ein einziges Formular auf der Seite?

Betrachten wir zum Beispiel ein Login-Formular, das erscheint auf jeder Seite eines sie (vielleicht, weil es auf der Website template / Layout). Es Beiträge zu so etwas wie AuthController::loginAction(). Wenn die Anmeldung fehlschlägt, dann tun Sie normalerweise nicht, dass er auf die Seite zurückschicken, aus dem er kam. Sie lassen ihn auf der Login-Seite, mit der Form, wie aus der $_POST vorgefüllten, wie Sie es haben wollen (wahrscheinlich einen Benutzernamen, nicht aber sein Passwort).

finden Sie unter für eine ähnliche Diskussion href="https://stackoverflow.com/questions/3829512/persist-zend-form-object-after-redirect/3830780#3830780">.

Aktualisieren : Habe einen anderen Gedanken in diesem. Wenn Sie wirklich wollen, um die Verarbeitung in zwei verschiedenen Controllern, um zu behandeln, ihn auf der Seite zu halten, aus dem er die Form geschrieben, zumindest Extrakt, dass Form in eine Verarbeitung aus Action Helfer . Auf diese Weise könnte man zumindest halten diese Form-Verarbeitung DRY .

Aktualisieren : Rob Allen hat gerade eine große Blog-Post „ein Formular in Ihrem Layout“ , in dem er eine Methode beschreibt, dass Anwendungen einen Aktion-Helfer mit einem preDispatch() Verfahren, dass Instantiiert und das Formular verarbeitet. Sehr schön.

Wie leiten Sie? Ich sehe das Problem nicht, wenn Sie gerade wieder die Formularseite angezeigt werden soll. Sie können prefill Sie Formulare mit Zend_Form :: populate ().

Nun, würde ich einfach beiden Formen auf der gleichen Seite einreichen.

Ich sehe nicht, warum Ihr Code sollte jede weniger lesbar erhalten. Erfahren Sie, wie Action Helfer verwenden und Ihre Controller plötzlich aussehen extrem einfach und lesbar:

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());
        }
}

Jede Verarbeitung des Formulars würde seine eigene Aktion Helfer haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top