我怎么知道单击了哪个按钮?


12

我有一个带有“提交”和“取消”按钮的表格。在中hook_submit(),我如何知道单击了哪个按钮?


您在谈论hook_submit()还是表单提交处理程序?表单提交处理程序不是的实现hook_submit()
kiamlaluno

Answers:


23

您必须使用中triggering_element$form_state['triggering_element']

最佳做法是#name为按钮定义属性,以便可以在中使用此值triggering_element

例如:

$form['delete'] = array(
  '#type' => 'submit',
  '#value' => t('Delete'),
  '#name' => 'delete',
);

如果未定义,则此属性triggering_element将保留按钮的属性#value(用户可以阅读的文本),但是不建议这样做,因为其他模块可能会更改此值或被本地化更改。

您也可以使用$form_state['clicked_button'],但已弃用

您可以在drupal_build_form函数文档页面上阅读更多信息。


7

$form_state['clicked_button']['#value'] 会告诉您在表单上单击了哪个按钮。


$form_state['clicked_button']['#value']:)
user1359'7

1
我想补充一下,如果您的表单上有必填字段,并且没有填写,那么您的Drupal会抛出表单验证错误(在form_validate之后调用form_submit)。你需要做这样的事情devengineering.com/best-practices/drupal/...
iStryker

那是个很好的观点!
user1359 2011年

5
尽管“ clicked_button”仍然有效,但D7中已不推荐使用它,建议使用“ triggering_element”代替。我记得有一些#ajax错误(我认为)仅影响使用“ clicked_button”的代码,因此这是使用“ triggering_element”的另一个原因。毕竟,这只是$ form_state中的另一个键。
Bojan Zivanovic

1
尽管此方法有效,但已过时且容易出现问题。请参阅tunic的答案以获取正确的Drupal 7方法。
爱丽丝·希顿2013年

3

比较$form_state我在Drupal 6中所做的这些值,在Drupal7中也是如此

if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
    //Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
    //Process if Cancel is pressed
}

如果我没记错的话,在Drupal 7中,Drupal 6 $ form_state] ['X']现在是$ form_state ['X']
iStryker 2011年

为什么需要比较这两个值?
iStryker

如果表单包含多个提交按钮。这种比较将有助于区别在单个提交处理程序中用于提交表单的按钮。$ form_state ['clicked_button'] ['#value'] = t('Yes')将在多语言设置中产生不同的值。
Shoaib Nawaz

最好进行一次比较,以避免在多语言设置中进行所有语言的比较。:)
Shoaib Nawaz

1
@iStryker我不确定您的第一句话是什么意思。
kiamlaluno

3

使用#name属性命名按钮,如下所示:

$form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#name' => 'delete',
);

然后使用:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.

因此,对于具有两个这样的提交按钮的表单:$ form ['submit'] = array('#type'=>'submit','#name'=>'submit-1','#value'=> t (“提交1”),);$ form ['submit2'] = array('#type'=>'submit','#name'=>'submit-2','#value'=> t('Submit2'),); 我们只需要在submitForm()函数中检查$ form_state-> getTriggeringElement()['#name']吗?
Gaius

3

更新2016 Drupal 8

对于那些仍然想弄清楚如何访问触发事件的人,这里是Drupal 8解决方案。

$form_state->getTriggeringElement()

这将返回触发提交元素的数组。如果添加名为的标记,#name则可以通过以下方式访问它。

$button_clicked = $form_state->getTriggeringElement()['#name']

进行此更改的原因在于,FormStateInterface现在是一个readOnly文件,其中只有扩展的类FormStateInterface才能访问变量。因此,您必须使用类似getTriggeringElement()访问器的方法才能访问变量。


我有2018年Drupal 8.4.4的更新:drupal.stackexchange.com/a/256112/1441
user1359 '18

0

在Drupal 8.4.4中$form_state->getTriggeringElement()['#name'];,您可以得到的值op。当您在表单状态的values数组中查找该键时,您将获得#value按钮form元素的键,换句话说,就是最终用户在页面上的按钮上看到的字符串。

我不知道$form_state->getValues()['op']所有形式是否通用,但是我正在用我的模块形式对其进行硬编码。


0

Drupal 8.6.7

创建按钮如下所示。

$form['my_button'] = [
    '#type' => 'button',
    '#value' => t('Custom Button'),
    '#name' => t('customButton'),
    '#weight' => 0,
    '#attributes' => [
      'class' => ['populate-bib-button', 'btn', 'btn-primary'],
    ],
  ];

在您的Submit函数中,获取按钮名称,如以下代码所示。

$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton

比较可以像

if ($input['_triggering_element_name'] == 'customButton') {
  // Do something.
}

#Drupal8

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.