Insertion d’un bloc dans n’importe quel template (Drupal insert block into template)
Drupal 8
Dans un template Twig, il n’est pas possible d’exécuter du code PHP directement. Il faut donc passer un bloc déjà préparé au template. Si vous devez transmettre une variable à un template de nœud, vous pouvez utiliser la fonction themename_preprocess_node() dans votre thème, ou pour un template de page, themename_preprocess_page(). Vous transmettez la variable au template Twig, puis vous l’affichez dans celui-ci.
Blocs créés via l’interface d’administration
$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
Pour la fonction themename_preprocess_node() (template node), vous pouvez afficher ce bloc ainsi :
function themename_preprocess_node(&$variables) {
$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
}
Dans le template node.html.twig, vous affichez ensuite le bloc :
{{ block_output }}
Blocs créés via plugins
Ces blocs peuvent être affichés de la même façon que ceux créés via l’administration, mais le code est un peu différent :
$block_manager = \Drupal::service('plugin.manager.block');
// Vous pouvez définir vos configurations ici.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Certains blocs peuvent avoir des restrictions d'accès.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Renvoie un tableau vide si l'accès est refusé.
if ($access_result->isForbidden()) {
return [];
}
$render = $plugin_block->build();
// Vous pouvez ajouter ici des tags ou contextes de cache.
// Ces tags et contextes peuvent aussi être définis dans les méthodes render(), ::getCacheTags(), ::getCacheContexts().
return $render;
Sans les commentaires :
$block_manager = \Drupal::service('plugin.manager.block');
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
$access_result = $plugin_block->access(\Drupal::currentUser());
if ($access_result->isForbidden()) {
return [];
}
$render = $plugin_block->build();
return $render;
Drupal 7
Pour Drupal 7, la fonction est similaire, mais les paramètres diffèrent légèrement. Au lieu de deux paramètres block et view, on utilise un seul paramètre block_view :
print render(module_invoke('block', 'block_view', '12'));
Pour un bloc Views, l’insertion ressemble à ceci :
print render(module_invoke('views', 'block_view', 'feedbacks-block'));
Notez que pour le delta du bloc, on utilise directement le nom du bloc Views, sans numéro, ici feedbacks-block.
Drupal 6
Pour insérer un bloc à l’endroit voulu, utilisez la fonction module_invoke() :
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
Par exemple, pour insérer un bloc créé via l’administration, utilisez ce code :
$block = module_invoke('block', 'block', 'view', 12);
print $block['content'];
Où 12 est le numéro (delta) du bloc.
Pour insérer un bloc Views, faites comme ceci :
$block = module_invoke('views', 'block', 'view', 'feedbacks-block_1');
print $block['content'];
Où feedbacks-block_1 est le nom du bloc dans la vue, feedbacks est le nom de la vue, et block_1 est le nom de l’affichage dans cette vue.