วิธีการปิดการใช้งานปุ่มส่งหลังจากคลิก?


13

Drupal ดูเหมือนจะไม่ป้องกันการส่งหลายรูปแบบแม้ในหน้าโหนด QAนี้แนะนำให้แก้ไขทางฝั่งเซิร์ฟเวอร์

ฉันจะปิดการใช้งานปุ่มส่งหลังจากคลิกได้อย่างไร

ทางออกอื่น ๆ


API ของ Drupal ไม่ป้องกันการส่งซ้ำสองครั้งเนื่องจากการตรวจสอบค่าโทเค็นฟอร์มหรือไม่ ไม่สามารถส่งแบบฟอร์มด้วยโทเค็นเดียวกันสองครั้งได้หรือไม่
Johnathan Elmore

คำตอบ:


12

มันมีเฉพาะใน dev เท่านั้น แต่โมดูลHide Submitจะทำการหลอกลวง หนึ่งในคุณสมบัติคือ:

ซ่อน (หรือปิดใช้งาน) ปุ่มส่งหลังจากคลิกแล้ว

ฉันเพิ่งติดตั้งบนไซต์ dev และดูเหมือนว่าจะทำงานได้ดีสำหรับโหนดเพิ่มฟอร์ม เมื่อคุณคลิกปุ่มส่งปุ่มนี้จะถูกซ่อนและถูกแทนที่ด้วยรูปภาพการโหลดและข้อความ 'โปรดรอ ... ' ก่อนที่จะส่งแบบฟอร์มในที่สุด ฉันยังไม่ได้ลองในรูปแบบอื่น ๆ


มีความคิดเกี่ยวกับวิธีรับโมดูลซ่อนการส่งเพื่อทำงานกับแบบฟอร์มในโมดูลที่กำหนดเองของคุณหรือไม่ ฉันหวังว่ามันจะเป็นเว็บไซต์กว้าง แต่ก็ไม่เป็นเช่นนั้น
user785179

@ ดู user785179 วิธีการที่จะดำเนินการhook_form_alter()- ถ้ามันใช้สลับไปยังทั่วไปhook_form_FORMID_alter() hook_form_alter()ถ้ามันเป็นทั่วไปhook_form_alter()ด้วยถ้าภายในเพิ่มบางor's ifในเรื่องนี้
Mołot

โปรดใช้ความระมัดระวังกับวิธีแก้ปัญหานี้ - โมดูลส่งซ่อนตัวแบ่งการอัปโหลด Ajax ทำให้เกิดปัญหาการเติมข้อความอัตโนมัติและในบางกรณีทำให้ปุ่มส่งไม่ต้องทำอะไรเลยในการคลิกครั้งแรก ฉันเพิ่งต้องถอนการติดตั้งจากเว็บไซต์
jenlampton

@Jen Strange ฉันใช้มันในหลายสิบไซต์เป็นเวลาหลายปีโดยไม่เห็นปัญหาใด ๆ บางทีคุณอาจมีการติดตั้งโมดูลอื่นที่รบกวนมัน
ไคลฟ์

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 () ที่อื่นเพื่อรับมันบนหน้า คุณเห็นมันเพิ่มในแหล่งที่มาของหน้า?
jenlampton

ขอบคุณแก้มัน ฉันไม่ทราบว่าสิ่งนี้ควรอยู่ระหว่าง: (function ($) {และ}) (jQuery); ในไฟล์ js ทำงานเหมือนชาร์ม !!
Justme

0

วิธีที่ง่ายที่สุดคือการทำโซลูชันจาวาสคริปต์ที่ใช้ธีมเพื่อปิดใช้งานปุ่มหลังจากการส่งแบบฟอร์ม ในไฟล์ 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. ธีมโหลดจาวาสคริปต์
  2. Drupal.behaviors.themename ถูกโหลดเมื่อโหลดหน้าเว็บ
  3. ในการส่งแบบฟอร์มของโหนดเพิ่มแบบฟอร์ม (คลาสตามตัวอย่างข้างต้นสามารถกำหนดเองได้ตามประเภทของแบบฟอร์ม) ปิดการใช้งานปุ่มส่ง (ส่งและดูตัวอย่าง) ดังนั้นจึงไม่สามารถคลิกได้อีก

ฉันแน่ใจว่ามีการประมวลผล ajax ที่ข้างต้นอาจเป็นอันตรายและการส่งแบบฟอร์มไม่สามารถทำได้อีกครั้งหากมีข้อผิดพลาดในการตรวจสอบ form_api ตรวจสอบเพื่อทดสอบและปรับแต่งเพื่อตอบสนองความต้องการของคุณ ฉันปิดการใช้งานทั้งสองปุ่มเนื่องจากคุณยังสามารถคลิกปุ่มแสดงตัวอย่างในขณะที่ปุ่มส่งถูกปิดใช้งาน เห็นได้ชัดว่าระยะทางของคุณแตกต่างกันไป


2
คุณกำลังใช้Drupal.behaviorsรูปแบบการประกาศแบบเก่า มันจะไม่ทำงานสำหรับ Drupal 7 Drupal.behaviors.themename = { attach: function (context, settings) { // ...มันจะต้อง ดูการจัดการ JavaScript ใน Drupal 7สำหรับข้อมูลเพิ่มเติม
Clive

สไตล์การประกาศคงที่
Eugene Fidelin

ค่าใดที่ควรถูกแทนที่จากสคริปต์ 'รูปแบบโหนด' นี้
pal4life

ฉันพยายามทำให้มันใช้งานได้ในรูปแบบของผู้ดูแลระบบ แต่ก็ไม่มีโชค เปลี่ยนชื่อชื่อด้วย adminimal และคัดลอกรหัสที่สมบูรณ์ใน sitename.js และเพิ่มลงในไฟล์ข้อมูลธีม ฉันยังคงได้รับแบบฟอร์มเดียวกันมากขึ้น
Justme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.