In my view, I have a form with submit and cancel buttons. Both actions return me to my index page. The only difference is Submit does a normal db submit and displays the message ‘Your Invoice has been updated.’, whereas the Cancel should cancel the update and display ‘Update canceled.’. Here’s the controller code:
public function edit($id = null) {
$this->Invoice->id = $id;
$this->set('invoice', $this->Invoice->read(null, $id));
//Check for $_GET
if ($this->request->is('get')) {
$this->request->data = $this->Invoice->read();
} else {
// Bail if cancel button pressed
if (isset($this->params['form']['cancel'])) {
$this->Session->setFlash('Update canceled.');
$this->redirect(array('action' => 'index'));
} else if ($this->Invoice->save($this->request->data)) {
$this->Session->setFlash('Your Invoice has been updated.');
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash('Unable to update your Invoice.');
}
}
}
And here is the view:
<fieldset>
<legend>Enter New Values</legend>
<li><?php echo $this->Form->input('purchaseOrderNumber'); ?></li>
<li><?php echo $this->Form->input('siteAddress'); ?></li>
<li><?php echo $this->Form->input('siteCity'); ?></li>
<li><?php echo $this->Form->input('siteState'); ?></li>
<?php
echo $this->Form->button('Submit Form', array('type' => 'submit'));
echo $this->Form->submit('Cancel', array('div' => false, 'name' => 'cancel'));
?>
However, no matter which button is pressed, it ALWAYS returns the first message. It also performs the db submit.
I tried unsuccessfully using XDebug with Netbeans but that’s a story for a different time. Usually my mistakes are obvious to others. So, I’m hoping someone can set me back on track.
I was just working on the same problem, and I found a solution that works without simply linking back to index. At Wylie’s suggestion to debug
$this->params, I noticed that the ‘form’ array was not being created. However, there was an array called ‘data’ in which the ‘cancel’ parameter was defined.So in the controller where you are checking which button was pressed, instead of
use
and you will get a working cancel button.