web-dev-qa-db-fra.com

Rendre un bloc personnalisé à l'aide du modèle block.html.twig

J'essaie de rendre un bloc de contenu personnalisé par programme (créé via l'interface utilisateur de la bibliothèque de blocs personnalisés) et j'aimerais que le bloc soit rendu à l'aide de block.html.twig comme il le ferait si je le plaçais dans une région de thème. J'ai le bloc placé dans une région désactivée et je peux obtenir le champ de corps de bloc à rendre par programme, mais il n'est pas encapsulé dans le modèle de bloc habituel et n'inclut pas le titre du bloc. J'utilise le code pour rendre un "bloc de contenu" à partir de la réponse acceptée ici: Comment puis-je afficher par programme un bloc?

$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;

Si je comprends bien, j'ai besoin de rendre l'instance du bloc personnalisé que j'ai placé à l'intérieur de la région désactivée, donc je m'attendrais à devoir utiliser le nom de machine de cette instance. J'ai fait beaucoup de recherches et je n'ai rien trouvé. Il est étrange que personne d'autre ne semble vouloir rendre le bloc avec le titre dans le modèle block.html.twig.

2
maskedjellybean

Ok, j'espérais une réponse qui n'impliquerait pas l'installation d'un module parce que cela semble être une tâche simple, mais après un certain point, il suffit de céder. Le module Twig Tweak peut faire ce que je demande très facilement. Après l'installation, dans un modèle où vous souhaitez rendre le bloc, ajoutez ceci:

{{ drupal_entity('block', 'BLOCK_CONFIG_MACHINE_NAME') }}

où BLOCK_CONFIG_MACHINE_NAME est le nom de la machine du bloc que vous avez configuré dans/admin/structure/block /

Cela rendra le bloc en utilisant block.html.twig et affichera le titre que vous avez configuré.

Documentation: https://www.drupal.org/docs/8/modules/twig-Tweak/rendering-blocks-with-twig-Tweak

2
maskedjellybean

BlockContent est la seule entité de Drupal n'ayant pas de modèle propre. Vous devez donc l'encapsuler vous-même dans un modèle:

$block = \Drupal\block_content\Entity\BlockContent::load($bid);
if ($block) {
  $content = \Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block);
  $build = [
    '#theme' => 'block',
    '#attributes' => [],
    '#configuration' => ['label' => 'My Block', 'label_display' => 'visible'],
    '#base_plugin_id' => 'block_content',
    '#plugin_id' => 'block_content:' . $block->uuid(),
    '#derivative_plugin_id' => $block->uuid(),
    '#id' => $block->id(),
    'content' => $content,
  ];
  return $build;
}
5
4k4