logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll

6.8. Rad sa javascript/jQuery u Drupalu. Šta su behaviors (ponašanja)?

27/05/2025, by Ivan

Da bismo počeli, vratimo se kako da uključimo prilagođene javascript fajlove u našu temu. U .libraries.yml fajlu, potrebno je uključiti js:

global-styling:
  version: 1.x
  css:
    theme:
      css/style.css: {}
      css/print.css: { media: print }
  js:
    js/custom.js: {}
  dependencies:
    - core/jquery
    - core/jquery.once

Važno je pratiti uvlačenje od dva razmaka. Dakle, uključili smo fajl js/custom.js. Ali to nije dovoljno da bi jQuery radio za nas. Drupal core ne zahteva jQuery i ne uključuje ga automatski. On mora biti uključen zasebno:

dependencies:
  - core/jquery

Koristićemo i jQuery.once(), što je poseban plugin za jQuery, koji omogućava da se događaji i metode vezuju za selektor samo jednom.

dependencies:
  - core/jquery
  - core/jquery.once

Razlog je što ćemo pisati javascript kod koji Drupal poziva više puta za različite događaje. Zato nam treba metoda .once().

Sada dodajmo neki kod u fajl custom.js:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      $(context).find('.click-me').once('myCustomBehavior').click(function () {
        alert('Hello, World!');
      });
    }
  };
})(jQuery);

Objasnimo redom.

(function ($) {

})(jQuery);

Obmotavamo jQuery kod u ovu konstrukciju zato što jQuery u Drupalu radi u režimu .noConflict(). To je potrebno da bismo mogli da koristimo znak dolara $ bez konflikta sa drugim javascript framework-ovima kao što su Prototype, MooTools. Verovatno nećete sresti te framework-e, ali morate sav jQuery kod ovako da obmotate.

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {

    }
  };
})(jQuery);

Evo šta je behavior. Kada pišete jQuery kod u Drupalu, prvo ga obmotajte u funkciju ($), a zatim u behavior. Naziv behavior-a mora biti jedinstven, u našem primeru je myModuleBehavior, ali za svaki behavior pišete poseban naziv:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {

    }
  };

  Drupal.behaviors.productPageBehavior = {
    attach: function (context, settings) {

    }
  };
})(jQuery);

Korišćenje je u camelCase stilu. Behavior se poziva prilikom učitavanja stranice i za svaki AJAX zahtev. Kada se novi sadržaj doda na sajt i ugradi u postojeću strukturu, behavior kod se ponovo poziva. Ovo je bitno razlikovanje od:

$(document).ready(function () {
  // Uradi nešto.
  // Ne koristi ovakav kod u Drupalu.
});

koji se poziva samo jednom prilikom učitavanja stranice.

Ako ste počeli da koristite behaviors i primetili čudne događaje, na primer da se neki blok dodaje više puta:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      // Behavior se poziva više puta na stranici, ne zaboravite da koristite .once().
      $('.inner').append('<p>Test</p>');
    }
  };
})(jQuery);

Za svaki AJAX zahtev dodat će se novi paragraf Test. Zato je neophodno koristiti .once():

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      // Behavior se poziva više puta na stranici, ne zaboravite da koristite .once().
      $('.inner').once('add-paragraph').append('<p>Test</p>');
    }
  };
})(jQuery);

Još jedna osobina behavior-a je promenljiva context. Svaki put kada se novi sadržaj doda na sajt prilikom učitavanja stranice ili AJAX-om, sav taj novi sadržaj je u promenljivoj context. Zato nije potrebno prolaziti ceo DOM nakon svakog AJAX zahteva da biste vezali događaj za selektor. Dovoljno je koristiti context:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      // Behavior se poziva više puta na stranici, ne zaboravite da koristite .once().
      $(context).find('.inner').once('add-paragraph').append('<p>Test</p>');
    }
  };
})(jQuery);

Sada je paragraf napisan u ispravnom Drupal stilu. Naravno, možete i dalje koristiti stari pristup sa document.ready(), ali on će se pozvati samo jednom i sporiji je od behavior-a.

Ako imate pitanja o jQuery/javascript-u ili predloge za dodatnu temu, pišite u komentarima.