Configuratieformulier toevoegen voor het blok
Laten we nu zeggen dat we de mogelijkheid willen toevoegen voor de sitebouwer om een deel van de configuratie in te voeren voor elk exemplaar van ons aangepaste blok. Houd altijd in gedachten dat alle sitebouwconfiguraties in Drupal 8 kunnen worden geëxporteerd van de ontwikkelsite en geïmporteerd op de live-site (bekend als Configuratiebeheer). Jij, als modulebouwer, kunt ook een standaardconfiguratie aanbieden om het formulier automatisch in te vullen wanneer de sitebouwer een nieuw blok aanmaakt.
Voeg in de bestaande klasse HelloBlock van de vorige pagina deze use-statements toe, aansluitend op de al bestaande:
use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormStateInterface;
Werk de klasse-definitie bij om de nieuwe "implements BlockPluginInterface" op te nemen:
class HelloBlock extends BlockBase implements BlockPluginInterface {
Voeg daarna de volgende methode toe aan de klasse. Een soortgelijk, volledig bestand bevindt zich hier, maar let erop dat de formuliernaam en configuratienamen niet overeenkomen met deze handleiding.
Deze code zal alleen het formulier toevoegen, de verwerking van het formulier en het opslaan van de resultaten volgen op de volgende pagina’s.
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
$config = $this->getConfiguration();
$form['hello_block_name'] = [
'#type' => 'textfield',
'#title' => $this->t('Who'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
];
return $form;
}
In dit voorbeeld wordt het formulier eerst gedefinieerd door te verwijzen naar zijn bovenliggende klasse met de volgende code-instructie $form = parent::blockForm($form, $form_state );. Vervolgens voegen we een nieuw veld toe aan het formulier. Dit proces wordt polymorfisme genoemd en is een van de belangrijke voordelen van het gebruik van methoden van objectgeoriënteerd programmeren (OOP).
Daarna moeten we Drupal aangeven dat de waarden uit ons formulier moeten worden opgeslagen in de configuratie voor dit blok. Hier is een voorbeeld:
/**
* {@inheritdoc}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
parent::blockSubmit($form, $form_state);
$values = $form_state->getValues();
$this->configuration['hello_block_name'] = $values['hello_block_name'];
}
Om het formulier te bekijken, ga naar het eerder toegevoegde exemplaar in Beheer -> Structuur -> Bloklay-out en klik op Configureer voor het (Hello World) blok.
Om meerdere submits aan hetzelfde formulier toe te voegen:
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
$config = $this->getConfiguration();
$form['hello_block_name'] = [
'#type' => 'textfield',
'#title' => $this->t('Who'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
];
$form['actions']['custom_submit'] = [
'#type' => 'submit',
'#name' => 'custom_submit',
'#value' => $this->t('Custom Submit'),
'#submit' => [[$this, 'custom_submit_form']],
];
return $form;
}
Nieuwe aangepaste submit-actie
/**
* Custom submit actions.
*/
public function custom_submit_form($form, FormStateInterface $form_state) {
$values = $form_state->getValues();
// Voer de vereiste acties uit.
}