Aller au contenu principal


Le bloc "likes" version configurable

Le fichier "dh_like_block.php" présenté dans le billet "le bloc des likes" sert de base pour la réalisation ce bloc configurable. J'y apporte les modifications décrites dans les paragraphes suivants.
Le fichier final figure dans l'onglet "dh_like_block.php" version configurable ci-dessous.
Billet créé le :
22 Mar 2023

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 :

blockForm() pour la création du formulaire de configuration ;
blockValidate() pour la validation des paramètres saisis ;
blockSubmit() pour la soumission (enregistrement automatique dans la base de données ) de ces paramètres.

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

C'est le rôle de la fonction "blockValidate()" :

public function blockValidate($form, FormStateInterface $form_state) {    
}

5. La sauvegarde des paramètres

C'est le rôle de la fonction "blockSubmit()". Dans le code qui suit, la fonction BlockSubmit exécute la fonction mère pour enregistrer la configuration des éléments standards des formulaires de configuration dans la Base de Données  du site.

public function blockValidate($form, FormStateInterface $form_state) {    
          parent::blockSubmit($form, $form_state);    
}

et,  avec le code complémentaire ci-dessous, enregistre  les nouveaux éléments de configuration (le "sous-titre" et son existence) dans la propriété $configuration :

   $this->configuration['subtitle'] = $values['subtitle'] ; 
   $this->configuration['isSubtitle'] = $values['isSubtitle']; 

5. L'utilisation de ces paramètres

 L'ajout du code qui suit, dans la fonction "buid()" (cf §1 du billet le bloc des likes),  permet par "$this->configuration() ", le test et la récupération  en BdD, des  valeurs des variables et la préparation de la variable "$sousTitre" du "renderable array".

    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".

Cliquez sur le bouton pour copier le code dans le presse papier  
    
<?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);
}
}
}
}
}