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

Rad sa bazom podataka u Drupal 7 - lekcija 5 - Extenders (Proširenja)

26/05/2025, by Ivan

Upiti za izbor podržavaju proširenja (extenders). Proširenje omogućava dodavanje funkcionalnosti na upit za izbor tokom izvršenja. Ova funkcionalnost može biti dodatna metoda ili obrada ponašanja postojeće metode.

Za ovo se koriste OOP obrasci (design patterns), proširenja su implementirana po Decorator obrascu. Ona dodaju dodatne odgovornosti dinamičkom objektu kroz fleksibilnu alternativu podklase za proširenje metode.

Korišćenje Extenders (proširenja)

Da biste koristili proširenje, morate imati objekat upita. Za objekat upita, metoda extend() vraća novi objekat koji će biti korišćen umesto trenutnog objekta upita. Na primer:

<?php
$query = $query->extend('PagerDefault');
?>

U ovom primeru, kreira se novi PagerDefault objekat upita koji sadrži originalni objekat upita i vraća novi objekat. $query može da se koristi i bez proširenja, ali sa njim objekat dobija dodatne mogućnosti. Takođe, napomena je da extend() vraća novi objekat i staro stanje se ne čuva. Sledeći primer to ilustruje:

<?php
$query = db_select('node', 'n');
$query
  ->fields('n', array('nid', 'title')
  ->extend('PagerDefault')   // Ova linija vraća novi PagerDefault objekat.
  ->limit(5);               // Ova linija radi jer se PagerDefault objekat poziva.

// Povratak iz extend() nije sačuvan u promenljivu, pa je $query i dalje samo Select objekat.
$query->orderBy('title');

// Ova linija izvršava Select objekat, ne extender. Extender više ne postoji.
$result = $query->execute();
?>

Da biste izbegli probleme, preporučuje se da prošireni objekat upita dodelite istoj promenljivoj kao i originalni objekat upita.

<?php
$query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
$query->fields(...);
// ...
?>

Ovo obezbeđuje da $query ima sva proširenja objekta na početku. Takođe, proširenja mogu biti korišćena više puta na jednom objektu, ali redosled može biti važan. Na primer, objekat koji je proširen sa TableSort treba prvo da bude proširen sa PagerDefault.

Kreiranje novih proširenja

Proširenje je klasa koja implementira SelectQueryInterface i prima dva parametra u konstruktoru: objekat za izbor (query) i objekat DatabaseConnection. Proširenje treba da implementira metode iz SelectQueryInterface i prosledi ih kroz objekat upita u konstruktoru.

U većini slučajeva, sve se radi kroz nasleđivanje klase SelectQueryExtender, koja obrađuje sve unutar klase. U praksi, proširenja su bilo koja klasa koja nasleđuje SelectQueryExtender. Ime te klase se koristi kao argument za extend() na objektu upita.

Dodavanje ili redefinisanje metoda zavisi od same klase proširenja. Svaka metoda koja nije redefinisana se prosleđuje direktno kroz objekat upita. Kada se metoda redefiniše, proširenje može, ali ne mora, pozvati osnovni objekat upita, ali mora vratiti vrednost koja se očekuje po interfejsu SelectQuery. U većini slučajeva vraća se sam objekat upita ili proširenje prosleđuje objekat drugog proširenja.

 

Sledeći primer ilustruje prethodno opisano.

<?php
class ExampleExtender extends SelectQueryExtender {

  /**
   * Sortira zapise.
   */
  public function orderBy($field, $direction = 'ASC') {
    return $this;
  }

  /**
   * Dodaje sopstvenu metodu.
   */
  public function orderByForReal($field, $direction = 'ASC') {
    $this->query->orderBy($field, $direction);
    return $this;
  }
}
?>

U ovom primeru redefinišemo metodu orderBy() da ne radi ništa, ali koristimo dodatnu metodu orderByForReal() koja implementira sortiranje po rastućem redosledu. Obe metode vraćaju objekat upita, kako se ne bi izgubio već kreirani objekat.

Bilo koji modul može definisati proširenje. Jezgro Drupala pruža dva dobra proširenja: PagerDefault i TableSort.

Podrška za više baza podataka

Metoda extend() funkcioniše slično kao db_select, proširenje traži ime klase sa sufiksom baze podataka. Stoga možete definisati ExampleExtender_pgsql kao i ExampleExtender, koji će se koristiti ako postoji.