web-dev-qa-db-fra.com

Placer la région de bloc dans le modèle de nœud

J'essaie de placer une région de bloc à l'intérieur d'un type de contenu d'actualités, mais elle ne s'affiche pas.

nœud - news.html.twig:

<article{{ attributes }} class="portal-article">

  <h1 class="article-title">{{node.label}}</h1>

  <p class="article-date">{{ date }}</p>

  <div class="article-main-content">
    {{ content }}
  </div>

  <div class="article-sidebar">
      {{ page.article_sidebar }}
  </div>

</article>

Comment obtenir le rendu du bloc à l'intérieur d'un nœud?

5
Evan

C'est probablement la solution, "Rendre le contenu de la région disponible pour les modèles de nœuds dans Drupal 8": http://atendesigngroup.com/blog/making-region-content-available- node-templates-drupal-8


Remplacez "THEME" par le nom de votre thème ci-dessous:

/**
* Implements hook_preprocess_node() for NODE document templates.
*/
function THEME_preprocess_node(&$variables) {
  // Allowed view modes
  $view_mode = $variables['view_mode']; // Retrieve view mode
  $allowed_view_modes = ['full']; // Array of allowed view modes (for performance so as to not execute on unneeded nodes)

  // If view mode is in allowed view modes list, pass to THEME_add_regions_to_node()
  if(in_array($view_mode, $allowed_view_modes)) {
    // Allowed regions (for performance so as to not execute for unneeded region)
    $allowed_regions = ['primary_content'];
    THEME_add_regions_to_node($allowed_regions, $variables);
  }
}

/**
* THEME_add_regions_to_node
*/

function THEME_add_regions_to_node($allowed_regions, &$variables) {
  // Retrieve active theme
  $theme = \Drupal::theme()->getActiveTheme()->getName();

  // Retrieve theme regions
  $available_regions = system_region_list($theme, 'REGIONS_ALL');

  // Validate allowed regions with available regions
  $regions = array_intersect(array_keys($available_regions), $allowed_regions);

  // For each region
  foreach ($regions as $key => $region) {

    // Load region blocks
    $blocks = entity_load_multiple_by_properties('block', array('theme' => $theme, 'region' => $region));

    // Sort ‘em
    uasort($blocks, 'Drupal\block\Entity\Block::sort');

    // Capture viewable blocks and their settings to $build
    $build = array();
    foreach ($blocks as $key => $block) {
      if ($block->access('view')) {
        $build[$key] = entity_view($block, 'block');
      }
    }

    // Add build to region
    $variables[$region] = $build;
  }
}

Après avoir effacé les caches, je peux maintenant imprimer le contenu spécifié dans la disposition des blocs de Drupal en utilisant mes fichiers de modèle de nœud. Par exemple, si j'ai spécifié primary_content dans $ allowed_regions, je peux y accéder via node - node_type.html.twig avec:

{{ primary_content }}
5
Alberto Silva

Comme indiqué dans les commentaires, les blocs ne sont pas à la portée des nœuds. Les nœuds sont généralement situés dans une région généralement appelée "région de contenu principal" ou simplement "contenu principal".

Les blocs pourraient également être situés dans la région "Contenu principal" susmentionnée, mais ils sont plus susceptibles d'être trouvés autour de cela --- Dans ce que j'aime appeler "Régions périphériques", qui est en fait n'importe quelle région en plus du "Contenu principal".

Si vous souhaitez modifier la disposition des nœuds de base dans Drupal 8 (ou 7) notez qu'il n'est pas nécessaire de personnaliser les fichiers de modèle pour cela, vous pouvez bien utiliser l'interface graphique pour cela. Je ne voudrais pas ne conseille pas d'utiliser le gestionnaire de pages mais en utilisant le module " Paragraphs " qui vous donne des mises en page réactives pour les mobiles pour les nœuds , qui sont donc conformes à l'attitude réactive mobile-first de Drupal 8.

1
JohnDoea