Друпал при клике на ajax кнопку устанавливает ей атрибут disabled
для запрета повторной отправки формы. Чтобы отключить такое поведение и разрешить многократное нажатие ajax-кнопки, нужно во-первых, подключить js файл со следующим кодом:
(function ($) {
var originalAjaxBeforeSend = Drupal.Ajax.prototype.beforeSend;
Drupal.Ajax.prototype.beforeSend = function(xmlhttprequest, options) {
var elementFocused = $(this.element).is(':focus');
// Call original function
originalAjaxBeforeSend.apply(this, arguments);
if ('disabled' in this && !this.disabled) {
this.ajaxing = false;
$(this.element).removeClass('progress-disabled').prop('disabled', false);
// Restore focus
if (elementFocused) {
$(this.element).focus();
}
// Abort previous ajax request
if (this.$form && this.$form.data('jqxhr')) {
this.$form.data('jqxhr').abort();
}
}
}
})(jQuery);
Во-вторых, в свойстве #ajax
нужной кнопки добавить 'disabled' => FALSE
:
$form['submit'] = array(
...
'#type' => 'submit',
'#ajax' => array(
...
'disabled' => FALSE,
),
);
Profit.
Этим же способом можно запретить дизаблить textfield-ы при keyup:
$form['textfield'] = array(
...
'#type' => 'textfield',
'#ajax' => array(
...
'event' => 'keyup',
'disabled' => FALSE,
),
);
Код работает в Drupal 8+. Для Drupal 7 надо заменить Drupal.Ajax
на Drupal.ajax
.
Написанное актуально для
Drupal 7, Drupal 8+
Комментарии
А где это может пригодиться? В смысле сложно представить ситуацию, когда нужно разрешить повторную отправку форму до возвращения ответа. Обычно такое поведение стремятся как раз таки обойти. У Вас был какой-то специфичный функционал?
Например запретить дизаблить текстовый input при вводе текста, так как в него нельзя ввести текст длиннее одного символа.
Посмотрите на подход к решению этой проблемы в
views exposed forms
. Я имею в виду, что если в настройкахview
указано, что она должна обрабатываться аяксом, то в раскрытом фильтре (текстовом) нет никакой блокировки поля. Вводи текст сколько хочешь. Там запрос уходит по таймауту, а сам таймер сбрасывается при вводе текста.потому что ajax там навешен на кнопку, а не на конкретное поле
Точно, Вы правы.
Но все же, что при таком подходе, как в посте, уйдет столько запросов, сколько символов будет введено в текстовое поле. А по идее запрос должен быть один.
/offtop
У Вас, кажется, не работает опция
Уведомлять меня о новых комментариях
.Без разницы сколько уйдёт запросов, поле при любом количестве будет дизаблиться.
Добавить комментарий