web-dev-qa-db-ja.com

ノードテンプレートにブロック領域を配置する

ニュースコンテンツタイプ内にブロック領域を配置しようとしていますが、レンダリングされません。

node--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>

ノード内でレンダリングするブロックを取得するにはどうすればよいですか?

5
Evan

これはおそらくソリューションです。「リージョンコンテンツをDrupal 8のノードテンプレートで使用できるようにする」: http://atendesigngroup.com/blog/making-region-content-available- node-templates-drupal-8


「THEME」を以下のテーマ名に置き換えます。

/**
* 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;
  }
}

キャッシュをクリアした後、ノードテンプレートファイルを使用して、Drupalのブロックレイアウトで指定されたコンテンツを印刷できるようになりました。たとえば、$ allowed_regionsでprimary_contentを指定した場合、node--node_type.html.twigを介してそれにアクセスできます。

{{ primary_content }}
5
Alberto Silva

コメントで述べたように、ブロックはノードのスコープにはありません。ノードは通常、「メインコンテンツ領域」または単に「メインコンテンツ」と呼ばれる領域にあります。

ブロックは、前述の「メインコンテンツ」領域に配置することもできますが、その周辺で見つかる可能性が高いです。実際に「メインコンテンツ」以外の任意の領域である「周辺領域」と呼んでいます。

Drupal 8(または7))の基本ノードのレイアウトを変更する場合は、テンプレートファイルをカスタマイズする必要がないことに注意してください。そのためにGUIを使用することもできます。ページマネージャーを使用することはお勧めしませんが、実際には " Paragraphs "モジュールを使用して、ノードにモバイルファーストレスポンシブレイアウトを提供します、これは、Drupal 8。

1
JohnDoea