Je rencontre un problème avec le rendu de mes blocs personnalisés et je souhaite manipuler les blocs par programme pour résoudre le problème.
J'ai utilisé cette question pour ajouter ce crochet à mon module:
function mymodule_block_view_alter(array &$build, Drupal\Core\Block\BlockPluginInterface $block) {
drupal_set_message($block->getBaseId());
}
Cependant, lorsque je navigue sur mon site, je ne vois que les identifiants de base des blocs système:
- page_title_block
- system_main_block
- help_block
- local_tasks_block
L'en-tête et le pied de page de mon site sont constitués de blocs personnalisés, je devrais donc voir leurs identifiants.
Comment accéder par programmation à mes blocs personnalisés?
Modifier voici mon code actuel:
$ cat my_block_hooks.module
<?php
function my_block_hooks_block_view_alter(array &$build, Drupal\Core\Block\BlockPluginInterface $block) {
drupal_set_message(__FUNCTION__ . "() id: " . $block->getBaseId() );
}
Et voici une capture d'écran:
Vous pouvez voir que tous les blocs système s'affichent, mais pas mon bloc personnalisé.
Il s'agit du bloc personnalisé tel que je l'ai configuré:
Et ici, je l'ai placé dans la mise en page:
Et bien sûr, j'ai vidé le cache plusieurs fois pour en arriver là.
Qu'est-ce que je fais mal?
Le type d'entité avec lequel vous traitez définit le hook que vous devez implémenter; dans ce cas, ce n'est PAS block
mais plutôt block_content
, comme le fournit le module de base " Custom Block ".
NB : Il est généralement recommandé d'utiliser des hooks plus spécifiques lorsque cela est possible, car cela aura un effet général sur les performances de votre code, c'est-à-dire que votre implémentation de hook sera être appelé moins de fois s'il est plus spécifique. Dans votre cas, au lieu de parcourir tous les blocs disponibles sur n'importe quelle page pendant le chargement de la page, vous ne parcourez que des blocs personnalisés (block_content
Entités).
Pour que votre implémentation hook_ENTITY_TYPE_view()
/ hook_ENTITY_TYPE_view_alter()
fonctionne, vous devez remplacer ENTITY_TYPE
Par block_content
. Cela devrait vous donner le code suivant (que j'ai testé et qui fonctionne):
use Drupal\block_content\Entity\BlockContent;
...
function my_block_hooks_block_content_view_alter(array &$build, BlockContent $custom_block) {
drupal_set_message(__FUNCTION__ . "() id: " . $custom_block->id() );
}
Et le résultat visuel:
Bonne chance!
Vous utilisez le bloc personnalisé intégré fourni avec Drupal. Dans votre code, vous obtenez le baseId qui est dans votre cas block_content
Et il apparaît en fait dans votre capture d'écran.
Je pense que vous devez utiliser $block->id()
à la place.
Vous pouvez utiliser getPluginId pour obtenir l'id du bloc:
function my_block_hooks_block_view_alter(array &$build, Drupal\Core\Block\BlockPluginInterface $block) {
drupal_set_message(__FUNCTION__ . "() id: " . $block->getPluginId());
}
voici le résultat:
Oui, vous devriez voir les ID de vos blocs personnalisés. Voici quelques choses que vous pouvez essayer:
$build['#cache']['max-age'] = 0;
À la sortie de votre bloc.drush cr
Ou videz le cache et voyez si votre bloc personnalisé est visible.Base ID
. Essayez de faire $block->getPluginId()
ou $block->id()
. Dans votre cas, il devrait vous donner un élément comme block_content:UUID
Où UUID
est l'ID unique du bloc personnalisé que vous avez créé dans votre bibliothèque de blocs personnalisés.L'ID de votre bloc ne s'affiche pas, c'est essentiellement comme si votre bloc n'est pas affiché sur la page.
use Drupal\block_content\Entity\BlockContent; ... function my_block_hooks_block_content_view_alter(array &$build, BlockContent $custom_block) { drupal_set_message(FUNCTION . "() id: " . $custom_block->id() ); }
Vous obtiendrez votre identifiant de bloc ici, basé sur cette condition définie et remplacerez cette sortie de bloc spécifique.
use Drupal\block_content\Entity\BlockContent; ... function my_block_hooks_block_content_view_alter(array &$build, BlockContent $custom_block) { if($custom_block->id() == 5){ $build['content']['#markup'] = Markup::create('Your text'); } }