ฉันจะควบคุมลำดับของ Drupal.behaviors ได้อย่างไร


9

ฉันต้องการโค้ดจาวาสคริปต์จากโมดูล X เพื่อทำงานเฉพาะหลังจากที่หนึ่งจากโมดูล Y ได้ทำงานแล้ว วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

คำตอบ:


5

รหัส JavaScript ที่ใช้โดย Drupal 7 มีดังต่อไปนี้:

Drupal.attachBehaviors = function (context, settings) {
  context = context || document;
  settings = settings || Drupal.settings;
  // Execute all of them.
  $.each(Drupal.behaviors, function () {
    if ($.isFunction(this.attach)) {
      this.attach(context, settings);
    }
  });
};

Drupal 6 ใช้รหัสที่คล้ายกัน:

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

หากจาวาสคริปต์จะรับประกันว่าคุณสมบัติของออบเจ็กต์ / อาเรย์นั้นจะถูกส่งjQuery.each()เข้าไปในลำดับเดียวกันเสมอซึ่งจะถูกเพิ่มค่าเหล่านั้นจะถูกส่งผ่านจากฟังก์ชั่นที่ใช้เป็นพารามิเตอร์ที่สองตามลำดับเดียวกัน
นี่หมายความว่าพฤติกรรมแรกที่แทรกเข้าไปDrupal.behaviorsจะถูกดำเนินการก่อน
ในกรณีนี้เพื่อให้พฤติกรรมที่กำหนดโดยโมดูลของคุณดำเนินการก่อนคุณสามารถใช้น้ำหนักที่เบาลงได้ หากคุณต้องการให้มีการดำเนินการต่อหน้าโมดูลอื่นให้ตั้งค่าน้ำหนักของโมดูลเป็น -50 ค่าอื่น ๆ ก็สามารถทำงานได้เช่นกัน หากคุณใช้ Drupal 7, drupal_add_js ()อนุญาตให้เชื่อมโยงน้ำหนักกับรหัส JavaScript รหัส JavaScript ที่มีน้ําหนักเบาจะปรากฏขึ้นก่อนในเอาต์พุต HTML สิ่งนี้เป็นไปไม่ได้เมื่อใช้ Drupal 6

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


ฉันพบหน้าเว็บที่ระบุน้ำหนักที่ใช้โดยบางโมดูล ฉันจำ URL ของหน้านั้นไม่ได้และหากหน้านั้นรวมเฉพาะบางโมดูลหรือไม่ครบถ้วน หากฉันพบหน้านั้นฉันจะรายงานลิงค์ที่นี่
kiamlaluno

1
คุณสามารถเช็คอินตารางระบบ - ลองselect name, weight from system where type = 'module' order by weight ASC, name
cam8001

น่าเสียดายที่ฉันต้องการ PHP ของโมดูลของฉัน (mymodule) เพื่อให้ทำงานก่อน PHP (โมดูล vertical_tabs) ของโมดูลอื่น แต่ JS ของ mymodule จะทำงานหลังจาก js ของ vertical_tab มีวิธีการใช้จาวาสคริปต์อย่างหมดจดเพื่อลดน้ำหนักหรือไม่?
cam8001

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

@ cam8001: ในกรณีนั้นไม่มีทางที่จะทำสิ่งที่คุณพยายามจะทำได้ยกเว้นการเปลี่ยนลำดับของวัตถุที่อยู่ในDrupal.behaviorsนั้น ตามที่ฉันรายงาน$.each(Drupal.behaviors)จะแสดงรายการวัตถุตามลำดับเดียวกับที่ใส่ไว้โดยไม่ยึดตามตัวระบุ
kiamlaluno

5

ใช้โมดูลWeight Weight
(โปรดให้มันทดสอบก่อนที่คุณจะใช้ในเว็บไซต์การผลิต)

โมดูลอนุญาตให้แนบตุ้มน้ำหนักกับพฤติกรรมจากนั้นมันจะจี้ / แทนที่drupal.attachBehaviorsด้วยการใช้งานที่กำหนดเองซึ่งเกี่ยวข้องกับน้ำหนัก


ทำไมไม่ให้น้ำหนักของโมดูลแทนตามที่แนะนำในคำตอบอื่น ๆ

  • น้ำหนักโมดูลเป็นเครื่องมือที่ค่อนข้างหนัก มันใช้กับการติดตั้งตะขอทั้งหมด (php) และพฤติกรรม (js) ของโมดูลในขณะที่เราสนใจเพียงพฤติกรรมเดียวเท่านั้น
  • ลำดับของคุณสมบัติในวัตถุ js ไม่ได้รับประกันโดย spec (ถึงแม้ว่ามันจะถูกนำไปใช้ตามที่คุณคาดหวังในเบราว์เซอร์เกือบทั้งหมด)

ดู
ลำดับของฟิลด์ในวัตถุจาวาสคริปต์ที่คาดการณ์ได้เมื่อวนลูปผ่านมันหรือไม่? และ
เพื่อ Elements - สำหรับ ( ... ใน ... ) วงใน JavaScript


@ kiam ถ้าฉันทำโมดูลนี้เป็น "น้ำหนักพฤติกรรม" ("bewgt") บน drupal.org คุณจะเข้าร่วมเป็นผู้ดูแลร่วมหรือไม่? มันอาจจะเป็นโมดูลที่ค่อนข้างเล็ก แต่น่าจะดีกว่าปล่อยให้มันมาพร้อมกับสิ่งอื่น ฉันมีตัวอย่างการนำไปใช้งานในพื้นที่สำหรับ D6 ดูเหมือนจะใช้งานได้
donquixote

ทำเพียงแค่มัน .. คุณได้รับเชิญยังคง :)
donquixote

drupal.org/node/1302126 - ฉันหวังว่าสิ่งนี้จะอยู่ในแกนกลางใน D8 :)
donquixote

มันจะเป็นโมดูลที่น่าสนใจ แต่ฉันต้องอัปเดตรหัสของโมดูลบางส่วนก่อนซึ่งฉันจะไม่เขียนโค้ดบรรทัดจากทุกวัย หลังจากนั้นฉันสามารถเป็นอิสระในการร่วมพัฒนาโมดูลใหม่
kiamlaluno

เพียงแค่พูดว่าคนจะขอใช้กรณี drupal.org/node/1302126#comment-5911632
donquixote

0

สำหรับ Drupal 6 -

วิธีแก้ปัญหาง่ายๆหากไม่จำเป็นต้องพกพาคือการทำให้ JS คุณต้องการเรียกใช้ล่าสุดในไฟล์ template template.php การเรียก drupal_add_js ของธีมจะถูกเรียกหลังจากโมดูลเสมอ

หากไม่จำเป็นต้องพกพาโซลูชัน "cleanest" ใน drupal 6 คือการเพิ่มโมดูลใหม่ที่มีน้ำหนักแตกต่างจากโมดูลของคุณด้วย php คุณสามารถมีสองโมดูลในโฟลเดอร์เดียวกันทำให้โมดูลแรกขึ้นอยู่กับโมดูลแรกและปรับน้ำหนักใน hooks การติดตั้ง / อัพเดต ไม่จำเป็นต้องใช้อะไรเลยเพียงทำให้การติดตั้งง่ายขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.