Le bloc "likes" version configurable
1. Utilisation de la classe BlockPluginInterface
L'ajout, dans l'entête du fichier "dh_like_block.php" de la ligne :
use Drupal\Core\Block\BlockPluginInterface ;
nous permet d'utiliser, parmi les les fonctions de la classe BlockPluginInterface, les fonctions :
2. La propriété $configuration
La propriété "protected $configuration" de la classe BlockBase mémorise sous forme de tableau (array) les informations de configuration du bloc. Ce tableau contient par défaut l'id du bloc et son titre. Dans l'extrait ci-dessous du code de la fonction submitForm(), on ajoute à la propriété $configuration, les valeurs 'isSubtitle' et 'subtitle' lors de la soumission du formulaire.
En PHP POO, la syntaxe "$this->configuration = $value" permet de stocker dans la propriété $configuration de la classe courante le contenu de la variable $value (on ne précise pas de signe $
avant le nom de la propriété).
$this->configuration['subtitle'] = $values['subtitle'] ;
$this->configuration['isSubtitle'] = $values['isSubtitle'] ;
Le code ci-dessous permet dans la fonction build() de tester l'existence et la longueur du sous-titre.
if ($this->configuration['isSubtitle'] == 'Oui'
&& strlen($this->configuration['subtitle'])>0)
{
//
}
3. Le formulaire de configuration
Dans le code suivant, la fonction" blockForm()" récupère le formulaire de configuration de la classe mère.
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
return $form;
}
Il ne reste qu'à compléter le corps de cette fonction en ajoutant le code pour les nouveaux éléments du formulaire : "boutons radio", "cases à cocher", "champ de saisie"... (cf. §1 du billet le bloc des likes)
4. La validation des paramètres
public function blockValidate($form, FormStateInterface $form_state) {
}
5. La sauvegarde des paramètres
public function blockValidate($form, FormStateInterface $form_state) {
parent::blockSubmit($form, $form_state);
}
$this->configuration['subtitle'] = $values['subtitle'] ;
$this->configuration['isSubtitle'] = $values['isSubtitle'];
5. L'utilisation de ces paramètres
if ($this->configuration['isSubtitle'] == 'Oui'
&& strlen($this->configuration['subtitle'])>0)
{
$sousTitre = [
'#type' => 'html_tag',
'#tag' => 'h2',
'#value' => $this->configuration['subtitle'],
];
}
Il faut bien sûr ajouter le code
'#sousTitre' =>$sousTitre,
dans le renderable array de "build()" et mettre à jour les fichiers "dh-like-block.html.twig" et "dh_like.module" pour prendre en compte cette variable supplémentaire du "renderable array".
<?php
namespace Drupal\dh_like\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
//pour compléter le formulaire de config dans le menu d'administration
use Drupal\Core\Block\BlockPluginInterface;
/**
* Provides a 'dh_like' Block.
*
* @Block(
* id = "dh_like_block",
* admin_label = @Translation("Le bloc Like (dh)"),
* category = @Translation("Social network"),
* )
*/
class dh_like_block extends BlockBase {
/**
* @return int
*/
public function getCacheMaxAge() {
return 0;
}
/**
* {@inheritdoc}
*/
public function build() {
//Génére le sous titre du bloc
if ($this->configuration['isSubtitle']=='Oui' && strlen($this->configuration['subtitle'])>0){
$sousTitre = [
'#type' => 'html_tag',
'#tag' => 'h2',
'#value' => $this->configuration['subtitle'],
];
}
// Get the like/dislike buttons.
$like_button_form = \Drupal::formBuilder()->getForm(\Drupal\dh_like\Form\LikeForm::class);
$dislike_button_form = \Drupal::formBuilder()->getForm(\Drupal\dh_like\Form\DisLikeForm::class);
// renderable array
return [
'#theme' => 'dh_like_block',
'#data' => [
'like_button' => $like_button_form,
'dislike_button' => $dislike_button_form,
],
'#sousTitre' =>$sousTitre,
'#config' => $this->configuration,
'#attached' => [
'library' => [
'dh_like/custom',
],
],
];
}
/**
* {@inheritdoc}
* Pour compléter le formulaire de configuration affiché lorsqu'on ajoute le bloc à une région
*/
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
//
$form['isSubtitle'] = [
'#type' => 'radios',
'#title' => $this->t('Voulez-vous une sous-titre ?'),
'#default_value' => isset($this->configuration['isSubtitle']) ? $this->configuration['isSubtitle'] : "Oui",
'#options' => [
"Oui"=>$this->t('Oui'),
"Non"=>$this->t('Non')
],
'#required'=>true,
'#attributes' => [
'data-n' => 'isSubtitle',
],
];
//
$form['subtitle'] = [
'#type' => 'textfield',
'#title' => $this->t('Ajout d\' un sous-titre'),
'#description' => $this->t('Indiquez votre sous-titre !'),
'#default_value' => isset($this->configuration['subtitle']) ? $this->configuration['subtitle'] : '',
'#states' => [
//show this textfield only if the radio 'Oui' is selected above
'visible' => [
':input[data-n="asksubtitle"]' => ['value' => "Oui"],
],
],
];
return $form;
}
/**
* {@inheritdoc}
* Vérification de la validité des paramètres saisis
*/
public function blockValidate($form, FormStateInterface $form_state) {
// récupération des paramètres
$subtitle = $form_state->getValue('subtitle');
$isSubtitle = $form_state->getValue('isSubtitle');
//
if ($isSubtitle=="Oui" && strlen($subtitle)==0) {
// pas de sous-titre saisi donc erreeur
$form_state->setErrorByName('subtitle', t('Saisissez au moins un caractère !'));
}
}
/**
* {@inheritdoc}
* Elle renregistre automatiquement en BdD la configuration les valeurs saisie par le formulaire
*/
public function blockSubmit($form, FormStateInterface $form_state) {
// sauver les paramètres des éléments standards du formulaire
parent::blockSubmit($form, $form_state);
// sauver les paramètres complémentaires propre au module
$values = $form_state->getValues();
$this->configuration['subtitle'] = $values['subtitle'];
$this->configuration['isSubtitle'] = $values['isSubtitle'];
// pour éventuel debug affichage dans status
foreach ($form_state->getValues() as $key => $value) {
if (!is_array($value)){
\Drupal::messenger()->addMessage($key . ': ' . $value);
}else{
foreach ($value as $k=>$v){
\Drupal::messenger()->addMessage($k . ': ' . $v);
}
}
}
}
}