Een block definiëren in een Drupal-module
Deel V van Praktische handleiding voor het maken van basis Drupal 8-modules
Van .info tot tests, alleen de basis
Herinner je je nog dat ik aan het begin van deze les zei dat we een block met een formulier zouden definiëren? Wel, dit is het moment om dat te doen.
/src/Form/LoremIpsumBlockForm.php
<?php namespace Drupal\loremipsum\Form; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; /** * Lorem Ipsum block form */ class LoremIpsumBlockForm extends FormBase { /** * {@inheritdoc} */ public function getFormId() { return 'loremipsum_block_form'; }
Dit bestand lijkt sterk op het configuratieformulier, behalve dat het de klasse FormBase uitbreidt.
Het heeft ook een buildForm()-methode die er ongeveer zo uitziet:
/** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { // Hoeveel paragrafen? $options = array_combine(range(1, 10), range(1, 10)); $form['paragraphs'] = [ '#type' => 'select', '#title' => $this->t('Paragraphs'), '#options' => $options, '#default_value' => 4, '#description' => $this->t('How many?'), ]; // Hoeveel zinnen? $form['phrases'] = [ '#type' => 'textfield', '#title' => $this->t('Phrases'), '#default_value' => '20', '#description' => $this->t('Maximum per paragraph'), ]; // Submit. $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Generate'), ]; return $form; }
Deze methode wordt gebruikt om het formulier in het block te plaatsen waarmee gebruikers kunnen aangeven hoeveel dummytekst ze willen genereren.
Vergeet ook de validateForm() en submitForm()-methodes niet:
/** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { $phrases = $form_state->getValue('phrases'); if (!is_numeric($phrases)) { $form_state->setErrorByName('phrases', $this->t('Please use a number.')); } if (floor($phrases) != $phrases) { $form_state->setErrorByName('phrases', $this->t('No decimals, please.')); } if ($phrases < 1) { $form_state->setErrorByName('phrases', $this->t('Please use a number greater than zero.')); } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $form_state->setRedirect('loremipsum.generate', [ 'paragraphs' => $form_state->getValue('paragraphs'), 'phrases' => $form_state->getValue('phrases'), ]); } }
En nu het eigenlijke block.
<?php namespace Drupal\loremipsum\Plugin\Block; use Drupal\Core\Access\AccessResult; use Drupal\Core\Block\BlockBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Session\AccountInterface; /** * Provides a Lorem ipsum block with which you can generate dummy text anywhere. * * @Block( * id = "loremipsum_block", * admin_label = @Translation("Lorem ipsum block"), * ) */ class LoremIpsumBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { // Return the form @ Form/LoremIpsumBlockForm.php. return \Drupal::formBuilder()->getForm('Drupal\loremipsum\Form\LoremIpsumBlockForm'); }
De klasse LoremIpsumBlock breidt BlockBase uit en heeft daardoor vier methodes die moeten worden geïmplementeerd: build(), blockAccess(), blockForm() en blockSubmit(). De eerste geeft gewoon het formulier weer dat we in de vorige stap hebben gedefinieerd.
Vervolgens regelen we de toegangscontrole:
/** * {@inheritdoc} */ protected function blockAccess(AccountInterface $account) { return AccessResult::allowedIfHasPermission($account, 'generate lorem ipsum'); }
Definieer ons blockformulier voor het admin-scherm van het block:
/** * {@inheritdoc} */ public function blockForm($form, FormStateInterface $form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); return $form; }
De submit handler:
/** * {@inheritdoc} */ public function blockSubmit($form, FormStateInterface $form_state) { $this->setConfigurationValue('loremipsum_block_settings', $form_state->getValue('loremipsum_block_settings')); } }
Ons block zou nu moeten werken.