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
HelloBlocke/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
.phpdeve 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,
myModulenon 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».