Comment rendre un type de bloc personnalisé (block_content) par programme avec une vue d'affichage spécifique?
Dans hook_preprocess_page()
ajoutez le code suivant.
$block_entity = Drupal\block_content\Entity\BlockContent::load(BLOCK_ID);// BLOCK_ID
$block_view = \Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block_entity, 'DISPLAY_VIEW_NAME');
if ($block_view) {
$variables['page']['my_block'] = $block_view;
}
Dans votre modèle Twig, imprimez le bloc avec le code suivant.
{% if page.my_block %}
{{ page.my_block }}
{% endif %}
Si votre bloc est personnalisé, cela a fonctionné pour moi:
$customblock = \Drupal::service('plugin.manager.block')->createInstance('{id of block here}', []);
Ensuite, vous pouvez l'imprimer à partir de votre pré-processus comme suit:
if(isset($customblock) && !empty($customblock)) {
$variables['logo'] = $customblock->build();
}
Lorsque vous avez créé votre bloc, vous auriez défini l'ID ici:
/**
* Provides a 'Logo' Block.
*
* @Block(
* id = "logo",
* admin_label = @Translation("Logo"),
* category = @Translation("Header"),
* )
*/
Cependant, cette méthode empêche l'affichage des liens contextuels. Pour contourner ce problème, vous pouvez procéder comme suit:
$Block = \Drupal\block\Entity\Block::load($id);
if(isset($Block) && !empty($Block)) {
$Block = \Drupal::entityTypeManager()->getViewBuilder('block')->view($Block);
}
Remarque: le bloc doit être placé dans une région de la page de présentation du bloc (mais peut être défini sur Désactivé) et l'ID $ est égal à l'instance de ce bloc, PAS ce que vous avez défini dans le fichier .php. Cela peut être trouvé en survolant l'un des liens de bloc dans la disposition des blocs.
Si vous avez créé le bloc en tant que vue, vous pouvez utiliser views_embed_view dans votre fonction template_preprocess_page, quelque chose comme:
$variables['my_block'] = views_embed_view('view_machine_name', 'block_machine_name');
Sous dans les noms de machine View et block. Le nom de la vue est visible dans admin/structure/views et le nom de la machine du bloc dans les paramètres avancés du bloc spécifique (par défaut, 'block_1').