Tıkladıktan sonra gönder düğmesini nasıl devre dışı bırakabilirim?


13

Drupal, düğüm sayfalarında bile birden çok form gönderilmesini engellemiyor gibi görünüyor. Bu KG , sunucu tarafında düzeltilmesini önerir.

Tıkladıktan sonra gönder düğmesini nasıl devre dışı bırakabilirim?

Başka çözüm var mı?


Drupal'ın Form API'sı, form belirteci değer denetimi sayesinde çift gönderimi engellemiyor mu? Aynı belirteci içeren bir formu iki kez gönderemez misiniz?
Johnathan Elmore

Yanıtlar:


12

Bu sadece geliştiricidir ancak Submit'i Gizle modülü işinizi görecektir. Özelliklerden biri:

Gönder düğmesine tıklandıktan sonra gizleyin (veya devre dışı bırakın)

Ben sadece bir dev sitede yükledim ve düğüm ekleme formları için iyi çalışıyor gibi görünüyor; gönder düğmesini tıkladığınızda, gizlenir ve form gönderilmeden önce bir yükleme resmi ve bir 'Lütfen bekleyin ...' mesajı ile değiştirilir. Yine de başka şekillerde denemedim.


Hide send modülünün kendi özel modüllerinizdeki formlar üzerinde çalışmasını nasıl sağlayacağınız hakkında bir fikriniz var mı? Site çapında olacağını umuyordum, ama durum böyle görünmüyor.
user785179

@ user785179 nasıl uygulandığına bakın hook_form_alter()- kullanılıyorsa hook_form_FORMID_alter()jenerik olarak değiştirin hook_form_alter(). O jenerik ise hook_form_alter()iç eğer birlikte, bazı eklemek or'bunda s if.
Mołot

Bu çözüm konusunda dikkatli olun - gizle gönderme modülü ajax yüklemelerini bozar, otomatik tamamlama sorunlarına neden olur ve bazı durumlarda gönder düğmesinin ilk tıklamada hiçbir şey yapmamasına neden olur. Sadece bir siteden kaldırmak zorunda kaldım.
jenlampton

@Jen Strange, yıllardır düzinelerce sitede böyle bir sorun görmeden kullanıyorum. Belki de buna müdahale eden başka bir modül daha var
Clive

10

İşte Drupal 7 için çözüm. Kod Submit modülünü basitleştirilmiş versiyonu.

Bu kod, "Daha fazla ekle" düğmeleri ve AJAX formlarıyla bile sorunsuz çalışır.

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;
        }  
      });
    });
  }
};

Bunu yönetici temasında uygulamak istiyorum. Bir sitename.js dosyası oluşturdu ve yukarıdaki kodun içine kopyalandı. Çalışmıyor. Bir şeyleri ayarlamam gerekir mi?
Justme

@Justme sitename.js dosyanızı nereye koydunuz? Bir modül veya alt programda, ya yüklenmek için .info dosyasına eklemeniz ya da sayfaya almak için başka bir yere drupal_add_js () öğesini çağırmanız gerekir. Sayfa kaynağına eklendiğini görebiliyor musunuz?
jenlampton

Thxs çözdü. Bunun arasında olması gerektiğini bilmiyordum: (function ($) {and}) (jQuery); js dosyasında. Bir sharm gibi çalışır !!
Justme

0

En kolay yol, form gönderildikten sonra düğmeyi devre dışı bırakmak için tema tabanlı bir javascript çözümü yapmaktır. Theme.info dosyasına, javascript dosyanızı theme api tarafından yüklenebilecek şekilde yerleştirin.

scripts[] = js/themename-script.js

Şimdi themename-script.js dosyasında aşağıdaki gibi görünmesi için Drupal.behaviors.themename bölümüne ekleyin:

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

Böylece akış aşağıdaki gibidir:

  1. Tema javascript'i yükler
  2. Drupal.behaviors.themename sayfa yüklendiğinde tetiklenir
  3. Düğüm ekleme formunun form gönderilmesinde (yukarıdaki örneğe dayalı sınıf, form türüne göre özelleştirilebilir) gönderme düğmelerini devre dışı bırak (gönder ve önizle), böylece tekrar tıklanamaz

Yukarıdaki tehlikeli olabilir ve form_api doğrulamasında bir hata yakalanırsa form gönderimi bir daha asla yapılamayacak bazı ajax işleme varsa eminim bu yüzden bunu test edin ve ihtiyaçlarınızı karşılamak için özelleştirin. Gönder düğmesi devre dışıyken önizleme düğmesini tıklayabildiğiniz için her iki düğmeyi de devre dışı bıraktım. Belli ki senin göçmen benim çeşitliliğim.


2
Eski Drupal.behaviorsbildirim stilini kullanıyorsunuz; Drupal 7 için işe yaramayacak Drupal.behaviors.themename = { attach: function (context, settings) { // .... Daha fazla bilgi için Drupal 7'de JavaScript'i Yönetme konusuna bakın
Clive

Beyan tarzı düzeltildi
Eugene Fidelin

Bu komut dosyası 'düğüm-formu' ndan hangi değerler değiştirilmelidir?
pal4life

Ben bu yönetici temalı çalışmayı denedim ama şans yok. Themename'i adminimal ile yeniden adlandırın ve sitename.js içindeki kodun tamamını kopyalayın ve bunu tema bilgi dosyasına ekleyin. Yine de aynı formdan daha fazla gönderi elde ediyorum.
Justme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.