Как отключить кнопку отправки после нажатия?


13

Drupal, похоже, не предотвращает отправку нескольких форм, даже на страницах узлов. Этот QA предлагает исправить это на стороне сервера.

Как я могу отключить кнопку отправки после нажатия?

Любые другие решения?


Разве Drupal Form API не предотвращает двойную отправку благодаря проверке значения токена формы? Не можете отправить форму с одним и тем же токеном дважды?
Джонатан Элмор

Ответы:


12

Это только в dev, но модуль Hide Submit поможет. Одна из особенностей:

Скрыть (или отключить) кнопку отправки после нажатия

Я только что установил его на сайт разработчика, и, похоже, он хорошо работает для форм добавления узлов; когда вы нажимаете кнопку отправки, она скрывается и заменяется загрузочным изображением и сообщением «Пожалуйста, подождите ...», прежде чем форма будет окончательно отправлена. Я не пробовал это на любых других формах все же.


Есть идеи о том, как заставить модуль hide submit работать с формами в ваших собственных пользовательских модулях? Я надеялся, что это будет широкий сайт, но это не так.
user785179

@ user785179 Посмотрите, как он реализует hook_form_alter()- если он использует hook_form_FORMID_alter(), переключите его на общий hook_form_alter(). Если это общее hook_form_alter()с if, добавьте некоторые orв это if.
Молот

Будьте осторожны с этим решением - модуль скрытия отправки прерывает загрузку Ajax, вызывает проблемы с автозаполнением, а в некоторых случаях заставляет кнопку отправки ничего не делать при первом щелчке. Я просто должен был удалить его с сайта.
Дженламптон

@Jen Странно, я годами использую его на десятках сайтов, не видя таких проблем. Возможно, у вас установлен другой модуль, который ему мешает
Клайв

10

Вот решение для Drupal 7. Код - это упрощенная версия модуля Hide Submit.

Этот код отлично работает даже с кнопками «Добавить больше» и AJAX-формами.

Drupal.behaviors.hideSubmitButton = {
  attach: function(context) {
    $('form.node-form', context).once('hideSubmitButton', function () {
      var $form = $(this);
      $form.find('input.form-submit').click(function (e) {
        var el = $(this);
        el.after('<input type="hidden" name="' + el.attr('name') + '" value="' + el.attr('value') + '" />');
        return true;
      });
      $form.submit(function (e) {
        if (!e.isPropagationStopped()) {
          $('input.form-submit', $(this)).attr('disabled', 'disabled');
          return true;
        }  
      });
    });
  }
};

Я хочу реализовать это в административной теме. Сделал файл sitename.js и скопировал в него код выше. Это не работает. Должен ли я настроить вещи?
Justme

@Justme, где вы положили свой файл sitename.js? Если в модуле или подтеме вам нужно либо добавить его в файл .info, чтобы он загрузился, либо вызвать drupal_add_js () где-то еще, чтобы получить его на странице. Вы видите, что это добавлено в исходный код страницы?
Дженламптон

Thxs решил это. Я не знал, что это должно быть между: (function ($) {and}) (jQuery); в файле js. Работает как шарм !!
Justme

0

Самый простой способ - сделать решение на основе JavaScript для отключения кнопки после отправки формы. В файле theme.info поместите свой файл javascript, чтобы он мог быть загружен с помощью api темы.

scripts[] = js/themename-script.js

Теперь в themename-script.js добавьте в раздел Drupal.behaviors.themename, чтобы он выглядел следующим образом:

Drupal.behaviors.themename = function()
{
  $('.node-form').submit(function(){
    $('#edit-submit').attr("disabled", "disabled");
    $('#edit-preview').attr("disabled", "disabled");
  });
}

Итак, процесс выглядит следующим образом:

  1. Тема загружает JavaScript
  2. Drupal.behaviors.themename запускается при загрузке страницы
  3. При отправке формы формы добавления узла (класс на основе приведенного выше примера ее можно настроить в соответствии с типом формы) отключите кнопки отправки (отправка и предварительный просмотр), чтобы ее нельзя было снова щелкнуть

Я уверен, что при некоторой обработке ajax вышеописанное может быть опасным, и отправка формы никогда не будет выполнена снова, если в проверке form_api обнаружена ошибка, поэтому протестируйте ее и настройте в соответствии со своими потребностями. Я отключил обе кнопки, так как вы все еще можете нажать кнопку предварительного просмотра, пока кнопка отправки была отключена. Очевидно, твой milage мой варьируется.


2
Вы используете старый Drupal.behaviorsстиль объявления; это не сработает для Drupal 7. Так и должно быть Drupal.behaviors.themename = { attach: function (context, settings) { // .... См. Управление JavaScript в Drupal 7 для получения дополнительной информации
Клайв

Декларация стиля исправлена
Евгений Фиделин

Какие значения следует заменить из этого скрипта 'node-form'?
pal4life

Я пытался заставить это работать в административной теме, но безуспешно. Переименуйте themename с помощью adminimal, скопируйте полный код в sitename.js и добавьте его в файл информации о теме. Тем не менее, я легко получаю больше представлений той же формы.
Justme
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.