CakePHP 2.0 确定点击了哪个提交按钮
Posted
技术标签:
【中文标题】CakePHP 2.0 确定点击了哪个提交按钮【英文标题】:CakePHP 2.0 Determine which submit button has been clicked 【发布时间】:2012-04-16 10:36:03 【问题描述】:在 Cakephp 1.3 中,您可以创建一个带有多个提交按钮的表单:
echo $this->Form->submit('Submit 1', array('name'=>'submit');
echo $this->Form->submit('Submit 2', array('name'=>'submit');
并检测在控制器中按下了哪个提交按钮:
if (isset($this->params['form']['submit']) && $this->params['form']['submit'] == "Submit 1")
// first button clicked
在 CakePHP 中,$this->params['form'] 没有设置,点击按钮的值不会出现在 $this->request, $this->request->data, $ 的任何地方this->params、$this->data 或 $_POST。
如何确定在 CakePHP 2.0 中点击了哪个按钮?
提前致谢。
编辑:
根据要求,这是表单的代码:
<?php echo $this->Form->create('History', array('action'=>'add')); ?>
<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()?>
以及表单的输出:
<form action="/projects/kings_recruit/trunk/www/histories/add" id="HistoryAddForm" method="post" accept-charset="utf-8">
<div style="display:none;">
<input name="_method" value="POST" type="hidden">
</div>
<div class="submit">
<input name="submit" value="Yes" type="submit">
<input name="submit" value="No" type="submit">
</div>
</form>
【问题讨论】:
您还应该发布输出的 html - 提交按钮在您的视图中的样子!另外:你的表单周围有 【参考方案1】:通常,对两个提交按钮使用相同的名称是一种不好的做法。 $_POST 和 $this->request->data
中应该有一个“提交”键我在 CakePHP 2.1.1 中对此进行了测试,如下所示:
查看代码:
<?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()?>
控制器中$this->request->data:
array(
'submit' => 'Yes',
'Message' => array(
'test' => 'TestFieldTest'
)
)
在 $_POST 中:
array(
'_method' => 'POST',
'data' => array(
'Message' => array(
'test' => 'TestFieldTest'
)
),
'submit' => 'Yes'
)
你也可以给两个提交不同的名字:
echo $this->Form->submit('Yes', array('div'=>false, 'name'=>'submitY'));
echo $this->Form->submit('No', array('div'=>false, 'name'=>'submitN'));
这样您可以在 $_POST 或 $this->request->data 中区分它们,因为键将是提交的名称:
array(
'submitY' => 'Yes',
'Message' => array(
'test' => 'foo'
)
)
array(
'_method' => 'POST',
'data' => array(
'Message' => array(
'test' => 'Bar'
)
),
'submitY' => 'Yes'
)
然后要确定按下了哪个按钮,您可以使用简单的 isset($_POST['']) 或 $this->request->data ?
【讨论】:
在我的表单帖子数组中没有看到这个 - 即使是一个全新的项目:-S 我会稍后再探索一下并回复你...... 您是否在 POST 上使用任何自定义过滤 - 例如 Codeigniter XSS 或?这很奇怪。一个微不足道的问题是:你的行动是否正确?表格是否指向正确的行动?尝试使用不同的提交名称。能否也提供一下 POST 的内容?【参考方案2】:不要为两个提交按钮使用相同的名称。考虑这个例子:
<?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) 将在单击“是”按钮时产生以下内容:
array(
'submit1' => 'Yes',
'input' => 'test'
)
这是点击“否”按钮的时候:
array(
'submit2' => 'No',
'input' => 'test'
)
检查点击了哪个按钮:
if (isset($this->request->data['submit1']))
// yes button was clicked
else if (isset($this->request->data['submit2']))
// no button was clicked
【讨论】:
【参考方案3】:在 2.0 中不再有 $this->params['form']
所有表单助手发布的字段都以 $this->data
结尾(无论如何这更有意义)
所以
if (!empty($this->data['submit']) && $this->data['submit'] == "Submit 1")
注意 !empty() 在这里也更好。
PS:您可以使用我的增强升级外壳在您的代码中替换它:https://github.com/dereuromark/upgrade
命令
cake Upgrade.Upgrade request
(https://github.com/dereuromark/upgrade/blob/master/Console/Command/UpgradeShell.php#L833)
【讨论】:
我在 $this->data 中也没有看到“提交 1” :-( 另外,我不是在升级 1.3 项目,这是一个全新的 2.0 项目。 也没有在 $_POST 中看到它。已更新我的问题以反映这一点【参考方案4】:if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes")
// do your stuff
【讨论】:
正如我在上一个答案中提到的(并更新了问题以反映这一点),我在 $this->data 中看不到“提交” @RichardAtHome 不是$this->data
,是$this->request->data
。请用$this->request->data
重新检查你的代码
在 $this->request->data 中也看不到它(对不起,我认为这暗示了我没有看到它 $this->request 的观点)以上是关于CakePHP 2.0 确定点击了哪个提交按钮的主要内容,如果未能解决你的问题,请参考以下文章