Як відключити кнопку подання після натискання?


13

Схоже, Drupal не запобігає надсиланню декількох форм, навіть на сторінках вузлів. Цей QA пропонує виправити його на стороні сервера.

Як я можу відключити кнопку надсилання після натискання?

Будь-які інші рішення?


Чи не запобігає API форми Drupal подвійним поданням заявки завдяки перевірці значення маркера форми? Не можете двічі надіслати форму з одним і тим же маркером?
Джоннатан Елмор

Відповіді:


12

Це лише в програмі Dev, але модуль Hide Submit зробив би свою справу. Однією з особливостей є:

Сховати (або відключити) кнопку подання після її натискання

Я щойно встановив його на сайті розробників, і він, здається, працює добре для форм додавання вузлів; після натискання кнопки надсилання її приховують і замінюють завантажувальним зображенням та повідомленням "Будь ласка, зачекайте ...", перш ніж форма буде остаточно надіслана. Я ще не пробував цього на будь-яких інших формах.


Будь-яка ідея про те, як змусити модуль приховування приховувати роботу над формами у власних спеціальних модулях? Я сподівався, що це буде широкий сайт, але, схоже, це не так.
користувач785179

@ user785179 подивіться, як вона реалізується hook_form_alter()- якщо вона використовується hook_form_FORMID_alter(), переключіть її на загальну hook_form_alter(). Якщо це загальне значення, hook_form_alter()якщо всередині, додайте orв це деякі if.
Молот

Будьте обережні з цим рішенням - модуль приховати приховування порушує завантаження Ajax, спричиняє проблеми з автозаповненням, а в деяких випадках викликає кнопку для подання нічого не робити при першому натисканні. Мені просто довелося видалити його з сайту.
jenlampton

@Jen Strange, я використовую його на десятках сайтів протягом багатьох років, не бачачи подібних проблем. Можливо, у вас встановлений ще один модуль, який йому заважає
Clive

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, куди ви помістили файл sitename.js? Якщо в модулі чи підтемі вам потрібно буде або додати його до файлу .info, щоб він завантажився, або зателефонувати drupal_add_js () де-небудь ще, щоб отримати його на сторінці. Ви можете бачити, що він доданий у джерело сторінки?
jenlampton

Thxs вирішила це. Я не знав, що це має бути між: (функцією ($) {і}) (jQuery); у файлі js. Працює як шарм !!
Justme

0

Найпростіший спосіб - це зробити тематичне рішення на основі JavaScript, щоб відключити кнопку після подання форми. У файл topic.info помістіть файл javascript, щоб він міг завантажувати тему api.

scripts[] = js/themename-script.js

Тепер у topicname-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.theme запускається при завантаженні сторінки
  3. Під час подання форми форми додавання вузла (клас на основі наведеного вище прикладу, його можна налаштувати за типом форми) відключіть кнопки подання (надіслати та попередній перегляд), щоб її не можна було натиснути ще раз

Я впевнений, що є якась обробка аякса, що вищезазначене може бути небезпечним, і подання форми більше ніколи не може бути повторене, якщо помилка виявиться у валідації Form_api, тому тестуйте це і налаштуйте відповідно до ваших потреб. Я відключив обидві кнопки, оскільки ви все ще можете натиснути кнопку попереднього перегляду, поки кнопку відсилання була відключена. Очевидно, мій пробіг мій змінюється.


2
Ви використовуєте старий Drupal.behaviorsстиль декларування; це не буде працювати для Drupal 7. Це повинно бути Drupal.behaviors.themename = { attach: function (context, settings) { // .... Див Управління JavaScript в Drupal 7 для отримання додаткової інформації
Клайв

Стиль декларації виправлений
Євген Фіделін

Які значення слід замінити в цьому сценарії "форма вузла"?
pal4life

Я намагався зробити це роботою в адміністративної темі, але не пощастило. Перейменуйте тему з адміністративною і скопіювавши повний код у sitename.js та додав це до файлу інформації про тему. І все-таки я отримую легко більше подань тієї самої форми.
Джамме
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.