CakePHP 2.0 Determine which submit button has been clicked

北战南征 提交于 2019-12-03 06:24:23

Generally it is a bad practise to use the same name for both submit buttons. There should be a "submit" key in the $_POST and $this->request->data

I tested this in CakePHP 2.1.1 as shown below:

The view code:

<?php echo $this->Form->create('Message', array('action'=>'test')); 
//  Extra test input field
echo $this->Form->input('test');
?>

<div class='submit'>
<?php 
echo $this->Form->submit('Yes', array('div'=>false, 'name'=>'submit')); 
echo $this->Form->submit('No', array('div'=>false, 'name'=>'submit')); 
?>
</div>
<?php echo $this->Form->end()?>

The in the controller in $this->request->data:

array(
    'submit' => 'Yes',
    'Message' => array(
        'test' => 'TestFieldTest'
    )
)

And in $_POST:

array(
    '_method' => 'POST',
    'data' => array(
        'Message' => array(
            'test' => 'TestFieldTest'
        )
    ),
    'submit' => 'Yes'
)

You can also give the two submits different names:

echo $this->Form->submit('Yes', array('div'=>false, 'name'=>'submitY')); 
echo $this->Form->submit('No', array('div'=>false, 'name'=>'submitN')); 

This way you can differ them in the $_POST or $this->request->data, because the keys will be the submits' names:

array(
    'submitY' => 'Yes',
    'Message' => array(
        'test' => 'foo'
    )
)

array(
    '_method' => 'POST',
    'data' => array(
        'Message' => array(
            'test' => 'Bar'
        )
    ),
    'submitY' => 'Yes'
)

Then to determine which button is pressed you can use a simple isset($_POST['']) or over $this->request->data ?

Don't use the same name for both submit buttons. Consider this example:

<?php echo $this->Form->create(false); ?>
<?php echo $this->Form->text('input'); ?>
<?php echo $this->Form->submit('Yes', array('name' => 'submit1')); ?>
<?php echo $this->Form->submit('No', array('name' => 'submit2')); ?>
<?php echo $this->Form->end(); ?>

debug($this->request->data) will produce the following when the "Yes" button is clicked:

array(
    'submit1' => 'Yes',
    'input' => 'test'
)

And here it is when the "No" button is clicked:

array(
    'submit2' => 'No',
    'input' => 'test'
)

To check which button was clicked:

if (isset($this->request->data['submit1'])) {
    // yes button was clicked
} else if (isset($this->request->data['submit2'])) {
    // no button was clicked
}

in 2.0 there is no $this->params['form'] anymore all form helper posted fields end up in $this->data (which makes more sense anyway)

so

if (!empty($this->data['submit']) && $this->data['submit'] == "Submit 1") {}

note that !empty() is better here as well.

PS: you can use my enhanced upgrade shell to replace it in your code: https://github.com/dereuromark/upgrade

its the command

cake Upgrade.Upgrade request

(https://github.com/dereuromark/upgrade/blob/master/Console/Command/UpgradeShell.php#L833)

if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes") {
// do your stuff
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!