Drupal 7将ajax监听器直接添加到节点表单

时间:2014-07-28 17:15:26

标签: php ajax drupal-7

我试图将ajax监听器注册到我的一个标准节点表单上的复选框。我想显示表单的某些区域,以防万一,字段被检查。当我在自定义表单中使用它时,我可以让drupal ajax生态系统工作,但是我无法在节点表单上使用它。

首先,我挂钩到form_alter,检查我是否想要添加监听器的节点类型:

function interceptor_form_alter(&$form, &$form_state, $form_id) {
  if($form_id === 'film_node_form') {
    interceptor_dvd_listener($form, $form_state);
  }
}

然后我尝试将ajax的东西附加到我的复选框,其名称为field_dvd:

function interceptor_dvd_listener(&$form, &$form_state) {
  $form['field_dvd'] = array(
    '#title' => t('You want to display DVD informations too?'),
    '#type' => 'checkbox',
    '#ajax' => array(
      'callback' => 'interceptor_dvd_listener_callback',
      'wrapper' => 'checkboxes-div',
      'effect' => 'slide',
      'progress' => array('type' => 'none'),
    ),
  );
  return $form;
}

永远不会调用interceptor_dvd_listener_callback函数。我尝试在那里打印一些调试信息,但没有任何反应......

function interceptor_dvd_listener_callback($form, $form_state) {
  data_service_log_object($form);
}

更新

将表单变量作为对interceptor_dvd_listener的引用传递后,ajax回调就像预期的那样工作。

2 个答案:

答案 0 :(得分:1)

此interceptor_dvd_listener_callback()应在文档中返回值:

  

表单处理完成后,ajax_form_callback()调用   由#ajax [' callback']命名的函数,它返回表单元素   已更新,需要返回到浏览器,或   或者,一组自定义Ajax命令。

为什么不用这个: https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#states

当某些元素具有某些状态时,隐藏或显示某些字段是drupal 7标准功能。

答案 1 :(得分:1)

极有可能是错误:

您没有通过引用interceptor_dvd_listener()函数传递$ form。您也没有使用此函数的返回值。将函数定义更改为:

function interceptor_dvd_listener(&$form, &$form_state) {
  $form['field_dvd'] = array(
    '#title' => t('You want to display DVD informations too?'),
    '#type' => 'checkbox',
    '#ajax' => array(
      'callback' => 'interceptor_dvd_listener_callback',
      'wrapper' => 'checkboxes-div',
      'effect' => 'slide',
      'progress' => array('type' => 'none'),
    ),
  );
}

现在看看它是否有效。如果没有,请执行以下操作:

  1. 确保您的自定义模块名称是“拦截器”。
  2. 确保您要修改的表单的ID是“film_node_form”。
  3. 将interceptor_form_alter()函数更改为:

    function interceptor_form_alter(&$form, &$form_state, $form_id) {
      if($form_id == 'film_node_form') {
        interceptor_dvd_listener($form, $form_state);
      }
    }
    
  4. 如果它仍然不起作用,请在interceptor_form_alter()函数的末尾打印$ form变量,并查看field_dvd是否具有#ajax键。

    您也可以使用此模块(https://www.drupal.org/project/field-conditional-state)而不是编写所有这些自定义代码。