it-swarm-id.com

Bagaimana saya bisa mengontrol tatanan perilaku Drupal.

Saya ingin kode JavaScript dari modul X dijalankan hanya setelah kode dari modul Y dijalankan. Apa cara terbaik untuk melakukan ini?

9
cam8001

Kode JavaScript yang digunakan oleh Drupal 7 adalah sebagai berikut:

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 menggunakan kode serupa:

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

Jika JavaScript akan menjamin bahwa properti objek/array selalu dilalui dalam urutan yang sama dengan yang ditambahkan, maka nilai akan diteruskan dari jQuery.each() ke fungsi yang digunakan sebagai parameter kedua dalam urutan yang sama dengan yang dimasukkan di dalam array dilewatkan sebagai parameter pertama.
Ini berarti bahwa perilaku pertama yang dimasukkan dalam Drupal.behaviors Dieksekusi terlebih dahulu.
Dalam hal ini, untuk memungkinkan perilaku yang didefinisikan oleh modul Anda dijalankan terlebih dahulu, Anda bisa menggunakan bobot yang lebih ringan untuk itu. Jika Anda ingin mereka dieksekusi sebelum yang lain, bobot modul harus diatur ke -50; nilai-nilai lain juga bisa berfungsi. Jika Anda menggunakan Drupal 7, drupal_add_js () memungkinkan untuk mengaitkan bobot ke kode JavaScript; kode JavaScript dengan bobot yang lebih ringan muncul pertama kali dalam output HTML. Ini tidak mungkin dengan Drupal 6, pikir.

JavaScript tidak menjamin bahwa properti dilalui dalam urutan yang sama seperti yang ditambahkan. Ini berarti bahwa implementasi JavaScript yang berbeda akan menyajikan properti yang sama menggunakan urutan yang berbeda; itu juga berarti bahwa urutan yang sama dapat berubah di berbagai versi browser yang sama.

5
kiamlaluno

Gunakan modul Berat Perilak .
(Tolong beri beberapa pengujian sebelum Anda menggunakannya di situs produksi)

Modul ini memungkinkan untuk melampirkan bobot pada perilaku, dan kemudian membajak/menggantikan drupal.attachBehaviors dengan implementasi kustom, yang menghargai bobot.


Mengapa bukan bobot modul, seperti yang disarankan dalam jawaban lain?

  • berat modul adalah alat yang cukup berat. Ini berlaku untuk semua implementasi hook (php) dan perilaku (js) dari modul, sementara kami hanya tertarik pada satu perilaku tunggal.
  • urutan properti di objek js tidak dijamin oleh spec (meskipun diimplementasikan seperti yang Anda harapkan di hampir semua browser).

Lihat
Apakah urutan bidang dalam objek javascript tidak dapat diprediksi saat mengulanginya? dan
rutan elemen - untuk (... dalam ...) loop dalam javascript .

5
donquixote

Untuk Drupal 6 -

Solusi sederhana, jika ini tidak perlu portabel adalah dengan meletakkan JS yang ingin Anda jalankan terakhir ke file theme templat.php. Panggilan tema drupal_add_js selalu dipanggil setelah modul.

Jika memang perlu portabel solusi "terbersih" di drupal 6 adalah menambahkan modul baru yang memiliki bobot berbeda dari modul Anda dengan php. Anda bahkan dapat memiliki dua modul di folder yang sama, buat modul pertama bergantung pada yang pertama, dan sesuaikan bobot pada kait instal/perbarui. Tidak ada yang diperlukan, hanya membuat instalasi lebih mudah.

0
mirzu