9.7. Plugin in Drupal. Come aggiungere un blocco programmaticamente.
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
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');
}
}
Visualizzeremo il nostro blocco nel regina Left Sidebar o in un'altra colonna, dove sarà comodo per te.
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.
Ora che il nostro blocco è visualizzato, vediamo come funziona il codice per aggiungere un blocco:
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:
Qui puoi vedere il nostro campo "Name", che abbiamo aggiunto nel metodo blockForm()
:
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