views:

432

answers:

3

An action within a controller generates the next id from the database and displays it on screen as reference. How can I prevent the action being called again if the user clicks refresh.

A: 

You can do this by implementing a 302 redirect

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

Assuming you have these pages

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

Form.php only displays form and sends data via POST to processForm.php. Within processForm.php you can parse data and issue the redirect to displayId.php with id you want to display in GET parameter.

This way when user refreshes the page (displayId.php) the form data is not processed again.

michal kralik
I'm more interested in how it can be done within Zend Framework.
db83
+3  A: 

The post-redirect-get pattern with Zend Framework would generally involve leaving the action of the form empty (so it posts to itself) and then redirecting when you don't want to display the form again (so upon success).

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;
}
Greg
If the form data is valid then I do some processing on it. How can I pass the output of the processing to the view page that the user has been redirected to?
db83
A: 
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;
Murat Corlu