4 Stimmen

Formularwiedervorlage im Zend Framework verhindern?

Eine Aktion innerhalb eines Controllers generiert die nächste ID aus der Datenbank und zeigt sie auf dem Bildschirm als Referenz an. Wie kann ich verhindern, dass die Aktion erneut aufgerufen wird, wenn der Benutzer auf Aktualisieren klickt.

3voto

Greg Punkte 10290

Das Post-Redirect-Get-Muster mit Zend Framework würde im Allgemeinen bedeuten, die Aktion des Formulars leer zu lassen (so dass es zu sich selbst postet) und dann umzuleiten, wenn man das Formular nicht mehr anzeigen möchte (also bei Erfolg).

public function newAction() {
    $form = new Form_Foo();
    if($this->_request->isPost()) {
        if($form->isValid($this->_request->getPost()) {
            //save or whatever
            return $this->_redirect('path/to/success');
        }
        // else fall through
    }
    $this->view->form = $form;
}

3voto

Murat Çorlu Punkte 7594
if ($this->isPost()) {
   // Check validation
   if ($error) {
       $dataToMove = array();
       // $dataToMove is array that you want to pass with redirect
       // It can be an array of errors or form data that user has entered

       // Use FlashMessenger helper to pass data to redirection via Zend_Session
       $this->_helper->getHelper('FlashMessenger')->addMessage($dataToMove);

       // And redirect page to form url
       $this->_helper->getHelper('Redirector')->goToUrl('/form/url/');
}

// If not posted, get data from FlashMessenger
$data = $this->_helper->getHelper('FlashMessenger')->getMessages();

// And assign to view or make that you want
$this->view->formData = $data;

1voto

DavidHavl Punkte 347

Obwohl dies ein älterer Beitrag ist, kommen die Leute immer noch hierher, um Antworten zu erhalten, also lassen Sie mich ein wenig mehr helfen.

Die Umleitung des Formulars ist großartig und nützlich, aber wir können immer noch nicht verhindern, dass die Leute auf die Schaltfläche "Zurück" klicken und auf diese Weise das Formular erneut übermitteln.

Die Lösung besteht darin, das Formular entweder als Popup anzuzeigen und es nach dem Ausfüllen wieder verschwinden zu lassen (leicht mit Jquery zu bewerkstelligen) oder eine eindeutige ID für jede Transaktion zu generieren und zu prüfen, ob die ID zuvor verwendet wurde. Siehe Artikel: http://www.boutell.com/newfaq/creating/stoprefresh.html

Ich hoffe, es hilft.

0voto

mike Punkte 4561

Sie können dies tun, indem Sie eine 302-Weiterleitung implementieren

header('HTTP/1.1 302 Found');
header('Location: displayId.php?id=5');
die();

Angenommen, Sie haben diese Seiten

  • form.php
  • processForm.php
  • displayId.php

Formular.php zeigt nur das Formular an und sendet die Daten per POST an processForm.php . Unter processForm.php können Sie die Daten analysieren und die Weiterleitung an displayId.php mit der ID, die Sie im GET-Parameter anzeigen möchten.

Auf diese Weise werden die Formulardaten nicht erneut verarbeitet, wenn der Benutzer die Seite (displayId.php) aktualisiert.

0voto

Intellix Punkte 2524

Ich weiß, Sie versuchen, dies in Zend Framework zu tun, aber ich sage nur, ich bin nach der gleichen Funktionalität. Gerade verschoben alles zu ZF und ich bin ziemlich enttäuscht zu sehen, dass diese Funktionalität nicht in gebaut ist.

Früher wurde jedes Formular an die Datei process.php übermittelt, die alle GET- und POST-Anfragen verarbeitete, die Ergebnisse (z. B. Fehler- und Erfolgsmeldungen) speicherte und den Benutzer an die neue Stelle weiterleitete.

Wenn $_SESSION['post_data'] gesetzt wurde, würde ich $_POST = $_SESSION['post_data']; und dann aus der Sitzung entfernen.

Das funktionierte großartig, aber jetzt brauche ich dasselbe in ZF :D Wie gesagt... ein wenig enttäuscht, da ich nicht glaube, dass irgendjemand einen Dialog haben möchte, der nach dem erneuten Senden von Daten fragt... was zum Teufel bedeutet das für den Endbenutzer? nichts!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X