Creare un blocco in un modulo Drupal in modo programmatico
I blocchi in Drupal 8 sono istanze del plugin dei blocchi.
Il Block Manager di Drupal scansiona i vostri moduli alla ricerca di classi che contengono l’annotazione @Block.
L’esempio di codice riportato di seguito utilizza l’annotazione @Block insieme alle proprietà «id» e «admin_label» per definire un blocco personalizzato.
Create il file src/Plugin/Block/HelloBlock.php
nello scheletro del modulo creato in precedenza e aggiungete il seguente codice.
Per fare in modo che il vostro sito Drupal riconosca questa nuova classe, è necessario svuotare la cache.
<?php namespace Drupal\hello_world\Plugin\Block; use Drupal\Core\Block\BlockBase; /** * Provides a 'Hello' Block. * * @Block( * id = "hello_block", * admin_label = @Translation("Hello block"), * category = @Translation("Hello World"), * ) */ class HelloBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { return [ '#markup' => $this->t('Hello, World!'), ]; } }
Per aggiungere l’«Hello block», potete andare su Struttura → Layout blocchi (admin/structure/block
) e cliccare sul pulsante «Posiziona blocco» associato a ciascuna regione disponibile.
Cliccando sul pulsante «Posiziona blocco» per una qualsiasi regione, apparirà una finestra di dialogo con l’elenco di tutti i blocchi disponibili. Per trovare rapidamente il vostro blocco, utilizzate l’opzione «Filtra per nome del blocco» oppure scorrete l’elenco fino a trovare «Hello block». In questo modo potete aggiungere qualsiasi numero di istanze del blocco personalizzato ovunque sul vostro sito.
Risoluzione dei problemi
- Il nome della classe e il nome del file devono essere identici (classe
HelloBlock
e/src/Plugin/Block/HelloBlock.php
). Se il nome della classe è diverso, il blocco apparirà nell’elenco dei blocchi disponibili, ma non potrete aggiungerlo. - Controllate sempre due volte tutti i percorsi e i nomi dei file. Il vostro file
.php
deve trovarsi nella directory corretta (/src/Plugin/Block/
), altrimenti Drupal non lo rileverà. - Se il vostro blocco non viene posizionato in una regione senza errori a schermo o nel watchdog, controllate i log degli errori PHP/Apache.
- Se il vostro blocco non è presente nell’elenco, ricordate di ricostruire le cache di Drupal (ad esempio con
drush cr
). - Assicuratevi che il nome del modulo sia tutto in minuscolo. Alcuni utenti hanno segnalato che i blocchi non vengono visualizzati per moduli con nomi in camelCase. Ad esempio,
myModule
non mostrerà mai i blocchi definiti, mentre deve esseremy_module
. Questo è stato verificato l’ultima volta in Drupal 8.8.1
Nota: utilizzo dei template Twig con i blocchi personalizzati
1. Aggiungete l’hook_theme al vostro file .module.
Nota: non chiamate la funzione di tema come «block__...» – in questo modo non verranno passate variabili ai template dei blocchi. Invece potete usare il nome del modulo come prefisso.
2. Usate «#theme» nell’array di rendering nel metodo build()
e passate le variabili allo stesso livello di «#theme», come «#varname».