logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

Lavorare con il database in Drupal 7 – Lezione 5 – Extenders (Estensioni)

14/10/2025, by Ivan

Le query di selezione in Drupal supportano gli extenders (estensioni). Un extender consente di aggiungere funzionalità extra a una query di selezione durante l’esecuzione. Questa funzionalità può essere un nuovo metodo o una modifica del comportamento di un metodo esistente.

Per ottenere ciò, Drupal utilizza i design pattern della programmazione orientata agli oggetti (OOP). In particolare, gli extenders implementano il Decorator Pattern, che consente di aggiungere dinamicamente nuovi comportamenti a un oggetto esistente fornendo una soluzione più flessibile rispetto all’ereditarietà diretta.

Uso degli Extenders

Per utilizzare un extender, è necessario disporre di un oggetto query. Il metodo extend() restituisce un nuovo oggetto che verrà utilizzato al posto della query originale. Ad esempio:

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

In questo esempio, viene creato un nuovo oggetto PagerDefault che incapsula la query originale e restituisce un nuovo oggetto query. La variabile $query può funzionare anche senza l’estensione, ma con l’extender guadagna funzionalità aggiuntive. È importante notare che il metodo extend() restituisce un nuovo oggetto, quindi il valore originale non viene modificato automaticamente. Ecco un esempio pratico:

<?php
$query = db_select('node', 'n');
$query
  ->fields('n', array('nid', 'title'))
  ->extend('PagerDefault')   // Questa riga restituisce un nuovo oggetto PagerDefault.
  ->limit(5);               // Funziona, perché ora è l'oggetto PagerDefault a essere chiamato.

// Poiché il risultato di extend() non è stato assegnato, $query è ancora l'oggetto Select originale.
$query->orderBy('title');

// Questa riga esegue l'oggetto Select originale, non l'estensione.
$result = $query->execute();
?>

Per evitare problemi, si consiglia di riutilizzare la stessa variabile per l’oggetto esteso:

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

In questo modo, $query avrà accesso a tutte le funzionalità delle estensioni. È anche possibile utilizzare più estensioni contemporaneamente, ma l’ordine è importante. Ad esempio, TableSort deve essere applicato dopo PagerDefault per funzionare correttamente.

Creazione di nuovi Extenders

Un extender è semplicemente una classe che implementa l’interfaccia SelectQueryInterface e accetta due parametri nel costruttore: la query di selezione e l’oggetto DatabaseConnection. L’estensione deve implementare i metodi di SelectQueryInterface e inoltrarli all’oggetto query interno passato nel costruttore.

Nella maggior parte dei casi, tuttavia, è sufficiente estendere la classe SelectQueryExtender, che si occupa automaticamente della gestione interna. In pratica, quindi, un extender è una classe che estende SelectQueryExtender. Il nome di questa classe sarà quello da specificare nel metodo extend() quando si crea la query.

La classe extender può aggiungere nuovi metodi o sovrascrivere quelli esistenti. Qualsiasi metodo non sovrascritto verrà inoltrato automaticamente all’oggetto query sottostante. Quando un metodo viene sovrascritto, l’estensione può decidere se chiamare o meno il metodo originale, ma deve comunque restituire un valore coerente con SelectQueryInterface (in genere l’oggetto query stesso o un extender).

Ecco un esempio pratico:

<?php
class ExampleExtender extends SelectQueryExtender {

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

  /**
   * Aggiunge un nuovo metodo personalizzato.
   */
  public function orderByForReal($field, $direction = 'ASC') {
    $this->query->orderBy($field, $direction);
    return $this;
  }
}
?>

In questo esempio, il metodo orderBy() è stato sovrascritto ma non aggiunge alcuna logica. Invece, il nuovo metodo orderByForReal() esegue effettivamente l’ordinamento dei record. Entrambi i metodi restituiscono l’oggetto query per mantenere la concatenazione dei metodi (chaining) senza perdere il riferimento all’oggetto esistente.

Qualsiasi modulo può dichiarare le proprie estensioni. Il core di Drupal fornisce già due estensioni molto utili: PagerDefault e TableSort.

Supporto per più database

Il meccanismo degli extender funziona in modo simile a db_select(): l’estensione cerca automaticamente una classe con un suffisso corrispondente al driver del database in uso. Ciò significa che è possibile definire, ad esempio, ExampleExtender_pgsql per PostgreSQL, oltre alla classe ExampleExtender generica, e Drupal utilizzerà automaticamente quella appropriata se disponibile.