web-dev-qa-db-fra.com

Rendre un bloc personnalisé par programme

Comment rendre un type de bloc personnalisé (block_content) par programme avec une vue d'affichage spécifique?

2
kxo

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 %}
4
kxo

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.

2
Peter Thorndycraft

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').

0
bluestraggler