2

在 Drupal 中单击链接时如何使用 AJAX 提交表单?

function search_form($form,$form_state) {
  $form['support_email'] = array(
    '#theme' => 'link',
    '#text' => '',
    '#ajax' =>array(
      'callback' => 'ajax_change',
      'wrapper' => 'email-hidden',
      'method' => 'replace',
      'click' => 'true',
    ),
  );
}

这是我在表单中的表单链接。单击链接时,我希望调用 AJAX 回调函数ajax_change,这似乎没有发生。

4

2 回答 2

1

#ajax功能的表单 api 参考说它是“用于:按钮、复选框、复选框、图像按钮、密码、单选、单选、选择、提交、tableselect、textarea、text_format、textfield”。链接不在列表中,因此不起作用。#ajax 功能使 Drupal 在指定的表单元素更改时执行 AJAX 调用。由于链接不会更改,因此它不起作用是合乎逻辑的。

Asaf ( ajax submit for any form)模块或许可以帮助你实现你想做的事情。

此外,您似乎正在尝试使用此 AJAX 隐藏元素。Forms API 具有状态功能,可以轻松有条件地显示/隐藏元素。阅读内容以获取有关状态的更多信息。

#ajax 回调用于制作动态更改自身的表单。

于 2013-08-03T23:37:30.143 回答
1

在 Drupal 中(不使用第三方模块)不可能使用链接标签作为 AJAX 触发元素。另一种解决方案可能是创建一个具有 AJAX 功能的隐藏按钮元素,并在该隐藏按钮上创建链接触发点击事件。

这是表单功能:

function mymodule__form($form, $form_state) {
  // JS file contains the code for triggering click event on e hidden button.
  $form['#attached']['js'][] =
    drupal_get_path('module', 'mymodule') . '/js/mymodule.behaviors.js';

  // Our link element.
  $form['link_mymodule'] = array(
    '#type' => 'link',
    '#name' => 'link_mymodule',
    '#title' => t('Perform mymodule logic'),
    '#href' => current_path(),
    '#options' => array(
      'attributes' => array(
        'class' => array('mymodule_ajax'),
      ),
    ),
  );

  // Hidden AJAX enabled submit button.
  $form['mymodule_ajax_submit'] = array(
    '#type' => 'button',
    '#value' => 'AJAX submit',
    '#name' => 'mymodule_ajax_submit',

    // You may need this to disable validation.
    '#limit_validation_errors' => array(),

    '#ajax' => array(
      'callback' => '_mymodule__form__pager_callback',
      'event' => 'click',
    ),
    '#attributes' => array(
      // Class "element-hidden" will hide the button.
      'class' => array('element-hidden', 'mymodule_ajax_submit'),
    ),
  );

  // Some element for tests.
  $form['random_thing'] = array(
    '#type' => 'markup',
    '#markup' => rand(1, 10000),

    // Wrapper is needed since AJAX will use it as a container for incoming data.
    '#prefix' => '<div class="ajax_wrapper">',
    '#suffix' => '</div>',
  );

  return $form;
}

由于您使用的是 AJAX,因此您还需要回调函数来用新数据替换旧数据:

function _mymodule__form__pager_callback($form, &$form_state) {
  return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_replace('.ajax_wrapper', trim(render($form['random_thing']))),
    ),
  );
}

此外,您必须将点击事件附加到您的链接,这将触发隐藏按钮上的点击事件。这就是存储在/js/mymodule.behaviors.js文件中的内容。

(function ($, Drupal) {
  Drupal.behaviors.mymodule = {
    attach: function (context, settings) {

      // Since behaviors will be executed every times AJAX is called, it's better to use $.once() method even if you
      // are going to use "context" argument. That is needed to be sure that event is attached only once.
      $('.mymodule_ajax', context).once('mymodule_ajax', function () {

        // Bind click event to out link.
        $(this).click(function (e) {
          // Prevent browser to follow the link.
          e.preventDefault();

          // Perform click triggering.
          $('input.mymodule_ajax_submit').click();
        });

      });

    }
  }
}(jQuery, Drupal));
于 2015-07-14T15:23:36.400 回答