web-dev-qa-db-fra.com

crochet pour modifier les blocs personnalisés?

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:

enter image description here

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é:

enter image description here

Et ici, je l'ai placé dans la mise en page:

enter image description here

Et bien sûr, j'ai vidé le cache plusieurs fois pour en arriver là.

Qu'est-ce que je fais mal?

3
user1359

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:

enter image description here

Bonne chance!

12
Stefanos Petrakis

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.

3
Ismail Cherri

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:

enter image description here

3
berramou

Oui, vous devriez voir les ID de vos blocs personnalisés. Voici quelques choses que vous pouvez essayer:

  • Assurez-vous que le bloc personnalisé est bien défini et placé sur votre page Gérer les blocs.
  • Assurez-vous que votre bloc personnalisé est réellement visible sur la page? Renvoyez une sortie temporaire comme "foo" de votre plugin de bloc personnalisé et assurez-vous que le "foo" est visible sur la page.
  • Essayez de supprimer temporairement le cache de votre bloc en ajoutant $build['#cache']['max-age'] = 0; À la sortie de votre bloc.
  • Drush drush cr Ou videz le cache et voyez si votre bloc personnalisé est visible.
  • Vérifiez les règles de visibilité de votre bloc personnalisé dans la configuration de bloc. Essayez de supprimer temporairement toutes les règles de visibilité et voyez si le bloc apparaît.
  • Si vous avez mis en œuvre des règles d'accès aux blocs, essayez de les désactiver pour voir si votre bloc devient visible.
  • Plusieurs blocs peuvent avoir le même Base ID. Essayez de faire $block->getPluginId() ou $block->id(). Dans votre cas, il devrait vous donner un élément comme block_content:UUIDUUID 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.

1
Jigarius

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'); } }

0
Ajay Gadhavana