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?

uwe
źródło
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.

Clive
źródło
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;
        }  
      });
    });
  }
};
Eugene Fidelin
źródło
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ć.

Mayday
źródło
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