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.
Antworten
Zu viele Anzeigen?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;
}
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;
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.
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.
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!