Jak wyłączyć przycisk wysyłania po kliknięciu?


13

Wydaje się, że Drupal nie zapobiega przesyłaniu wielu formularzy, nawet na stronach węzłów. Ta kontrola jakości sugeruje naprawienie go po stronie serwera.

Jak mogę wyłączyć przycisk przesyłania po kliknięciu?

Jakieś inne rozwiązania?


Czy interfejs API formularzy Drupal nie zapobiega podwójnemu przesyłaniu dzięki sprawdzeniu wartości tokena formularza? Nie możesz przesłać formularza z tym samym tokenem dwa razy?
Johnathan Elmore,

Odpowiedzi:


12

Jest tylko w wersji deweloperskiej, ale moduł Ukryj wysyłanie wystarczy. Jedną z funkcji jest:

Ukryj (lub wyłącz) przycisk wysyłania po jego kliknięciu

Właśnie zainstalowałem go na stronie deweloperskiej i wydaje się, że działa dobrze w przypadku formularzy dodawania węzłów; po kliknięciu przycisku Prześlij jest on ukryty i zastąpiony ładującym obrazem oraz komunikatem „Proszę czekać ...”, zanim formularz zostanie ostatecznie przesłany. Jednak nie próbowałem tego w żadnej innej formie.


Masz pomysł, jak sprawić, by ukryty moduł przesyłania działał na formularzach we własnych modułach niestandardowych? Miałem nadzieję, że będzie obejmował całą witrynę, ale wydaje się, że tak nie jest.
user785179,

@ user785179 sprawdź, jak się implementuje hook_form_alter()- jeśli używa hook_form_FORMID_alter(), przełącz go na ogólny hook_form_alter(). Jeśli to jest ogólne, hook_form_alter()jeśli w środku, dodaj trochę orw tym if.
Mołot

Bądź ostrożny z tym rozwiązaniem - moduł ukrywania wysyłania przerywa przesyłanie ajax, powoduje problemy z autouzupełnianiem, aw niektórych przypadkach powoduje, że przycisk wysyłania nic nie robi przy pierwszym kliknięciu. Musiałem tylko odinstalować go z witryny.
jenlampton

@Jen Strange, używam go w wielu witrynach od lat, nie widząc takich problemów. Być może masz zainstalowany inny moduł, który mu przeszkadza
Clive

10

Oto rozwiązanie dla Drupala 7. Kod jest uproszczoną wersją modułu Ukryj wysyłanie.

Ten kod działa dobrze nawet w przypadku przycisków „Dodaj więcej” i formularzy 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;
        }  
      });
    });
  }
};

Chcę to zaimplementować w motywie administracyjnym. Utworzono plik sitename.js i skopiowano do niego powyższy kod. To nie działa. Czy powinienem dostosować rzeczy?
Justme

@Justme gdzie umieściłeś plik sitename.js? Jeśli w module lub podtemacie musisz dodać go do pliku .info, aby go załadować, lub wywołać drupal_add_js () w innym miejscu, aby uzyskać go na stronie. Czy widzisz, że jest dodawany w źródle strony?
jenlampton

Dzięki rozwiązali. Nie wiedziałem, że powinno to być pomiędzy: (function ($) {and}) (jQuery); w pliku js. Działa jak sharm !!
Justme,

0

Najprościej jest zrobić oparte na motywach rozwiązanie javascript, aby wyłączyć przycisk po przesłaniu formularza. W pliku theme.info umieść plik javascript, aby można go było załadować za pomocą interfejsu API kompozycji.

scripts[] = js/themename-script.js

Teraz w themename-script.js dodaj do sekcji Drupal.behaviors.themename, aby wyglądać następująco:

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

Więc przepływ jest następujący:

  1. Motyw ładuje javascript
  2. Nazwa Drupal.behaviors.the jest uruchamiana przy ładowaniu strony
  3. Po przesłaniu formularza węzła dodaj formularz (klasa oparta na powyższym przykładzie, można go dostosować do rodzaju formularza) wyłącz przyciski przesyłania (prześlij i wyświetl podgląd), aby nie można było kliknąć ponownie

Jestem pewien, że istnieje pewne przetwarzanie ajax, że powyższe może być niebezpieczne, a przesłanie formularza nigdy nie będzie możliwe, jeśli zostanie wykryty błąd podczas sprawdzania poprawności form_api, więc przetestuj to i dostosuj do swoich potrzeb. Wyłączyłem oba przyciski, ponieważ nadal można było kliknąć przycisk podglądu, gdy przycisk przesyłania był wyłączony. Oczywiście twój przebieg może się różnić.


2
Używasz starego Drupal.behaviorsstylu deklaracji; to nie zadziała dla Drupala 7. Musiałoby tak być Drupal.behaviors.themename = { attach: function (context, settings) { // .... Aby uzyskać więcej informacji, zobacz Zarządzanie JavaScript w Drupal 7
Clive

Naprawiono styl deklaracji
Eugene Fidelin,

Jakie wartości należy zastąpić z tego skryptu „węzłowego”?
pal4life

Starałem się, aby działał w trybie administracyjnym, ale bez powodzenia. Zmień nazwę na adminimal i skopiuj cały kod z sitename.js i dodałem go do pliku informacji o motywie. Ciągle otrzymuję więcej zgłoszeń o tym samym formularzu.
Justme
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.