Как я могу отключить кнопку отправки формы Drupal, когда она нажата, чтобы предотвратить двойную отправку? - PullRequest
6 голосов
/ 17 декабря 2010

Звучит как простой вопрос.Я добавил немного магии jQuery:

$("#edit-save").click(function(event) {
  $(this).attr("disabled", "true");
});

Однако, как только это будет сделано, мой обработчик отправки формы не будет вызван.

Это пользовательская форма по моему собственному пути, определенному в hook_menu:

$items['my_form'] = array(
  'title' => 'My form',
  'page callback' => 'drupal_get_form',
  'page arguments' => array('mymod_myform'),
  'type' => MENU_CALLBACK,
);

В форме у меня есть кнопка отправки и кнопка отмены:

$form['cancel'] = array(
  '#type' => 'submit',
  '#value' => t('Cancel'),
);

$form['save'] = array(
  '#type' => 'submit',
  '#value' => t('Save'),
);

и я определяю свой собственный обработчик отправки:

$form['#submit'][] = 'mymod_myform_submit';

Я поместил немного кода трассировки в функцию drupal_get_form (), чтобы прослушать переменную $ _POST при отправке формы.Когда магия jQuery отключена, переменная $ _POST включает параметр «op»:

Array
  (
    [op] = Save
    [form_build_id] => form-6e74c87390e3fc48d0bebd2f5193315b
    [form_token] => 33db6e34c0350e33c48861a63a38d45f
    [form_id] => dh_seo_workload_item_form
  )

, но если я включаю магию jQuery, чтобы отключить кнопку отправки после ее нажатия, параметр «op» будетбольше не включается в массив $ _POST, и поэтому Drupal считает, что форма не была отправлена.

Я видел вопрос на Запретить двойную отправку форм в jQuery , но я обеспокоенчто это похоже на действительно хакерское исправление, и должен быть лучший способ.

Ответы [ 4 ]

3 голосов
/ 22 апреля 2013

Или вы можете сделать это как однострочное дополнение на уровне массива форм PHP ...

$form['submit'] = array(
  '#type' => 'submit',
  '#value' => t('Save'),
  '#attributes' => array(
    'onclick' => 'javascript:var s=this;setTimeout(function(){s.value="Saving...";s.disabled=true;},1);',
  ),
);
1 голос
/ 17 декабря 2010

Я думаю, что тот факт, что вы привязываетесь к событию нажатия кнопки, означает, что кнопка отключается до того, как событие нажатия может всплыть на форму и вызвать отправку.

Наша команда обнаружила, что отключение кнопки отправки почти всегда создает проблемы для Internet Explorer.Мы сделали крошечный плагин для решения проблемы;см. код здесь: https://stackoverflow.com/a/4473801/4376

0 голосов
/ 09 октября 2013

Просто скройте кнопку отправки (display:none) и покажите другую кнопку, уже отключенную.Я думаю, что он менее хакерский, чем остальные решения этой проблемы.У меня обычно просто 2 кнопки на моей странице, одна видимая, а другая нет, и onClick, просто переключаю их.

Проблема вызвана тем, что отключенные кнопки не вызывают постбэки.

0 голосов
/ 18 декабря 2010

Я исправил это сегодня днем ​​и смог получить информацию о форме, представленную без проблем:

$("#id_of_button").click(function() {
  var submit = $(this);
  setTimeout(function(){
    submit.attr('disabled','disabled')
  },1);
});
...