Ajouter un formulaire de configuration pour le bloc
Maintenant, disons que nous voulons ajouter la possibilité pour le constructeur de site d'entrer une partie de la configuration pour chaque instance de notre bloc personnalisé. Gardez toujours à l'esprit que toutes les configurations de construction de site dans Drupal 8 peuvent être exportées depuis le site de développement et importées sur le site de production (connu sous le nom de Gestion de la configuration). Vous, en tant que créateur de modules, pouvez également fournir une configuration par défaut pour préremplir automatiquement le formulaire lorsque le créateur du site crée un nouveau bloc.
Dans la classe existante HelloBlock de la page précédente, ajoutez ces instructions « use » après celles déjà présentes :
use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormStateInterface;
Mettez à jour la déclaration de la classe pour inclure cette nouvelle interface "implémentation BlockPluginInterface" :
class HelloBlock extends BlockBase implements BlockPluginInterface {
Puis ajoutez la méthode suivante à la classe. Un fichier complet similaire se trouve ici, mais notez que le nom du formulaire et les noms de configuration ne correspondent pas à ce guide.
Ce code va seulement ajouter le formulaire, le traitement du formulaire et la sauvegarde des résultats suivront dans les pages suivantes.
/** * {@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('Qui'), '#description' => $this->t('À qui voulez-vous dire bonjour ?'), '#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '', ]; return $form; }
Dans cet exemple, le formulaire est d'abord défini en appelant la méthode parente avec l'instruction de code suivante : $form = parent::blockForm($form, $form_state);
. Ensuite, nous ajoutons un nouveau champ au formulaire. Ce processus est appelé polymorphisme et constitue un des avantages importants de l'utilisation des méthodes de la programmation orientée objet (POO).
Ensuite, nous devons indiquer à Drupal de sauvegarder les valeurs de notre formulaire dans la configuration de ce bloc. Voici un exemple :
/** * {@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']; }
Pour voir le formulaire, allez à l'instance précédemment ajoutée dans admin-> Structure-> Disposition des blocs et cliquez sur Configurer pour le bloc (Hello World).
Pour ajouter plusieurs, envoyez-les au même formulaire.
/** * {@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('Qui'), '#description' => $this->t('À qui voulez-vous dire bonjour ?'), '#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '', ]; $form['actions']['custom_submit'] = [ '#type' => 'submit', '#name' => 'custom_submit', '#value' => $this->t('Envoi personnalisé'), '#submit' => [[$this, 'custom_submit_form']], ]; return $form; }
Nouvelle action d'envoi personnalisée :
/** * Actions personnalisées à l'envoi. */ public function custom_submit_form($form, FormStateInterface $form_state) { $values = $form_state->getValues(); // Effectuer les actions requises. }