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

9.7. Plugin in Drupal. Come aggiungere un blocco programmaticamente.

17/10/2025, by Ivan

In questo tutorial, vedremo come visualizzare i blocchi programmaticamente tramite un modulo personalizzato in Drupal 8.

Esempi di codice possono essere visualizzati su GitHub:
https://github.com/levmyshkin/drupalbook8

Iniziamo aggiungendo un file contenente una classe PHP, questo è il modo in cui i blocchi vengono creati in Drupal tramite un modulo personalizzato. Il processo di creazione del file è lo stesso di una classe per la pagina, come abbiamo fatto qui:

9.3. Creare un modulo personalizzato in Drupal. Visualizzare una pagina programmaticamente.

Solo che dobbiamo creare un file con un plugin:

modules/custom/drupalbook/src/Plugin/Block/FirstBlock.php

first block

Copia questo codice del blocco e poi analizziamo ciascuna delle parti del codice
modules/custom/drupalbook/src/Plugin/Block/FirstBlock.php:

<?php

namespace Drupal\drupalbook\Plugin\Block;
 
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
 
/**
 * Provides a block with a simple text.
 *
 * @block(
 *   id = "drupalbook_first_block_block",
 *   admin_label = @block("My first block"),
 * )
 */
class FirstBlock extends BlockBase {
  /**
   * {@block}
   */
  public function build() {
    $config = $this->getConfiguration();
 
    if (!empty($config['drupalbook_first_block_settings'])) {
      $text = $this->t('Hello @Name in block!', ['@Name' => $config['drupalbook_first_block_settings']]);
    }
    else {
      $text = $this->t('Hello World in block!');
    }
 
    return [
      '#markup' => $text,
    ];
  }
 
  /**
   * {@block}
   */
  protected function blockAccess(AccountInterface $account) {
    return AccessResult::allowedIfHasPermission($account, 'access content');
  }
 
  /**
   * {@block}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $config = $this->getConfiguration();
 
    $form['drupalbook_first_block_settings'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Name'),
      '#description' => $this->t('Who do you want to say hello to?'),
      '#default_value' => !empty($config['drupalbook_first_block_settings']) ? $config['drupalbook_first_block_settings'] : '',
    ];
 
    return $form;
  }
 
  /**
   * {@block}
   */
  public function blockSubmit($form, FormStateInterface $form_state) {
    $this->configuration['drupalbook_first_block_settings'] = $form_state->getValue('drupalbook_first_block_settings');
  }
}

block layout

Visualizzeremo il nostro blocco nel regina Left Sidebar o in un'altra colonna, dove sarà comodo per te.

sidebar first

Inizia a digitare il nome del tuo blocco e Drupal ti suggerirà automaticamente di selezionare il tuo blocco. Se il tuo blocco non è presente, controlla che il codice desiderato sia nel file giusto, e il file sia nella cartella giusta, e dopo non dimenticare di svuotare la cache.

place block

Ora che il nostro blocco è visualizzato, vediamo come funziona il codice per aggiungere un blocco:

my first block

All'inizio del file, abbiamo il namespace, per determinare dove dovrebbe trovarsi il nostro file del plugin del blocco, in modo che Drupal possa collegarlo automaticamente. Includiamo anche le classi da altri file utilizzando use.

\drupalbook\Plugin\Block;
 
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;

Successivamente, nei commenti, c'è l'annotazione. Non è necessario definire il blocco in qualche file YML, verrà caricato automaticamente da Drupal utilizzando l'annotazione.

/**
 * Provides a block with a simple text.
 *
 * @block(
 *   id = "drupalbook_first_block_block",
 *   admin_label = @block("My first block"),
 * )
 */

Qui indichiamo a @block che si tratterà di un plugin del blocco. id, admin_label saranno automaticamente acquisiti da Drupal, quindi l'ID deve essere unico. @block aiuta a tradurre l'etichetta del blocco attraverso il pannello di amministrazione di Drupal.

extends BlockBase {

Estendiamo la classe BlockBase, puoi tenere premuto ctrl e fare clic su BlockBase in PhpStorm per vedere quali metodi possono essere ridefiniti nel nostro blocco, non li usiamo tutti. Puoi sovrascrivere altri metodi se necessario.

Vediamo i metodi della classe in seguito:

/**
 * {@block}
 */
protected function blockAccess(AccountInterface $account) {
  return AccessResult::allowedIfHasPermission($account, 'access content');
}

Abbiamo già trattato l'accesso alla pagina in questo articolo, nei blocchi possiamo usare gli stessi diritti di accesso:

https://drupalbook.org/ru/drupal/126-rout-s-parametrom

Qui usiamo la stessa classe AccessResult.

/**
 * {@block}
 */
public function blockForm($form, FormStateInterface $form_state) {
  $config = $this->getConfiguration();
 
  $form['drupalbook_first_block_settings'] = [
    '#type' => 'textfield',
    '#title' => $this->t('Name'),
    '#description' => $this->t('Who do you want to say hello to?'),
    '#default_value' => !empty($config['drupalbook_first_block_settings']) ? $config['drupalbook_first_block_settings'] : '',
  ];
 
  return $form;
}

Possiamo utilizzare un modulo di configurazione separato per ogni blocco che creiamo programmaticamente. Se vai nelle impostazioni del blocco:

configure block

Qui puoi vedere il nostro campo "Name", che abbiamo aggiunto nel metodo blockForm():

configure block

Usiamo la Drupal Form API per creare campi per il modulo:

https://www.drupal.org/docs/8/api/form-api

https://api.drupal.org/api/drupal/elements/8.5.x

Analizzeremo la Form API in dettaglio in futuro e creeremo un modulo pop-up a più passaggi. Per ora, puoi vedere quali altri tipi di campi puoi utilizzare usando la Form API. Ogni campo viene aggiunto tramite un array. Prova ad aggiungere altri campi al modulo del blocco.

/**
 * {@block}
 */
public function blockSubmit($form, FormStateInterface $form_state) {
  $this->configuration['drupalbook_first_block_settings'] = $form_state->getValue('drupalbook_first_block_settings');
}

Qui salviamo il valore dei campi dal modulo nella configurazione di Drupal. Tratteremo anche la configurazione in modo più dettagliato nelle lezioni successive, per ora devi solo capire che Drupal ha uno storage comune per tutte le configurazioni e tutti i moduli usano questo storage di configurazioni. Queste configurazioni possono essere trasferite da un sito all'altro. Ad esempio, se hai cambiato le impostazioni del blocco su una copia locale del sito, queste configurazioni possono essere caricate e trasferite sul sito live e le impostazioni del blocco verranno applicate sul sito live.

/**
 * {@block}
 */
public function build() {
  $config = $this->getConfiguration();
 
  if (!empty($config['drupalbook_first_block_settings'])) {
    $text = $this->t('Hello @Name in block!', ['@Name' => $config['drupalbook_first_block_settings']]);
  }
  else {
    $text = $this->t('Hello World in block!');
  }
 
  return [
    '#markup' => $text,
  ];
}

Ed ecco il metodo principale build(), che visualizza il contenuto del blocco. In questo metodo, verifichiamo la configurazione del blocco e, se abbiamo un nome, visualizziamo il testo con il nome. Presta attenzione al metodo $this->t(), che consente di tradurre il testo tramite il pannello di amministrazione di Drupal in altre lingue. Usando anche il segnaposto @Name, che ci serve per tradurre solo il testo desiderato, e non i valori dei campi che inseriamo nei moduli di configurazione. Questo ti consente di evitare linee di traduzione multiple, ad esempio se non usi un segnaposto, tutte le opzioni per il testo che passano tramite $this->t() saranno disponibili nel pannello di amministrazione per la traduzione:

Hello Josh ...
Hello Mike ...
Hello Ivan ...
e così via.

Penso che ora ti sia chiaro come visualizzare e configurare i blocchi personalizzati in Drupal 8, poi vedremo esempi più complessi utilizzando blocchi, pagine e moduli.

Esempi di codice possono essere visualizzati su GitHub:
https://github.com/levmyshkin/drupalbook8