【问题标题】:Drupal7 Forms API: Ajax button not firing callbackDrupal 7 Form API:Ajax 按钮未触发回调
【发布时间】:2016-07-11 05:10:39
【问题描述】:

我真的被难住了。我有一个带有按钮的 ajax 表单 - 实际上,下面的表单同时具有一个按钮和一个选择对象,它们都调用相同的回调函数。

我想要的:调用回调的按钮,但不提交表单。

我所拥有的:select 调用回调就好了,但是提交按钮没有做任何事情。

想法?

function my_module_pane_checkout_form($form, $form_state, $checkout_pane, $order) {
  $pane_form = array(); 

  $pane_form['codes'] = array(
    '#prefix' => '<div id="codes-fieldset-wrapper">',
    '#suffix' => '</div>',
  );

  $pane_form['codes']['add_code_0'] = array(
    '#type' => 'radios',
    '#options' => array(1 => 'One', 2 => 'Two'),
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
    '#default_value' => 1,
  );

  $pane_form['codes']['add_code'] = array(
    '#type' => 'submit',
    '#value' => 'Add Code',
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
  );

  return $pane_form;
}

function my_module_pane_callback($form, $form_state) {
  watchdog('php', 'inside callback');
  return $form['my_module'];
}

【问题讨论】:

  • 请注意:此表单位于商务结帐窗格上(啊,真高兴)。

标签: ajax forms drupal drupal-7 ajaxform


【解决方案1】:

我添加了'#limit_validation_errors' =&gt; array() 并将submit 更改为button 并使其正常工作,但在头疼得厉害(并且失去了一整天的工作)之后却没有。

此表单位于商务结帐窗格上。使用提交按钮,无论我是否在# ajax 数组(因为 Drupal ajax 在 mousedown 时触发)或设置了 '#executes_submit_handler' => FALSE。因此,表单始终在验证,并且由于并非所有内容都已填写,因此没有通过。

使用该按钮,表单仍在运行验证(并且失败),但未将表单标记为已提交。

因此,JSON 有效负载中没有任何按钮命令,因为它未能通过验证。由于 select(或任何其他对象)没有提交表单或检查验证,因此该元素的 ajax 调用正在工作。

由于我们需要通过这两项检查来构建表单和 ajax 命令数组,我们需要元素类型是按钮,并且我们需要将限制验证错误设置为空数组 - Drupal 将只对数组中传递的元素运行检查 - 为此我们什么都不想要。

再次:将'#type' =&gt; 'submit' 更改为'#type' =&gt; 'button' 并添加'#limit_validation_errors' =&gt; array()

function my_module_pane_checkout_form($form, $form_state, $checkout_pane, $order) {
  $pane_form = array(); 

  $pane_form['codes'] = array(
    '#prefix' => '<div id="codes-fieldset-wrapper">',
    '#suffix' => '</div>',
  );

  $pane_form['codes']['add_code_0'] = array(
    '#type' => 'radios',
    '#options' => array(1 => 'One', 2 => 'Two'),
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
    '#default_value' => 1,
  );

  $pane_form['codes']['add_code'] = array(
    '#type' => 'button',
    '#value' => 'Add Code',
    '#limit_validation_errors' => array(),
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
  );

  return $pane_form;
}

function my_module_pane_callback($form, $form_state) {
  watchdog('php', 'inside callback');
  return $form['my_module'];
}

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 2023-03-26
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多