任意のテンプレートへのブロックの挿入(drupal insert block into template)
Drupal 8
twig テンプレートでは PHP コードを呼び出せないため、既に用意されたブロックをテンプレートに渡す必要があります。ノードテンプレートに変数を渡す必要がある場合は、テーマで themename_preprocess_node() 関数を使用でき、page テンプレートには themename_preprocess_page() を使用します。変数を twig テンプレートに渡し、その中でこの変数を出力します。
管理画面で作成したブロック
$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
themename_preprocess_node() 関数(ノードテンプレート)では、このブロックを次のように出力できます。
function themename_preprocess_node(&$variables) {
$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
}
node.html.twig テンプレートで、ブロックを出力できます。
{{ block_output }}
プラグインで作成したブロック
このようなブロックも管理画面で作成したブロックと同じように出力できますが、出力用のコードが少し異なります。
$block_manager = \Drupal::service('plugin.manager.block');
// ここにブロックの独自の設定を記述できます。
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// 一部のブロックはさまざまな表示権限を持つ場合があります。
$access_result = $block_plugin->access(\Drupal::currentUser());
// ブロックへのアクセスがない場合は空の配列を返します。
if ($access_result->isForbidden()) {
return [];
}
$render = $plugin_block->build();
// ここでキャッシュタグやコンテキストを追加する必要があるかもしれません。
// render()、::getCacheTags、::getCacheContexts メソッドでキャッシュタグとコンテキストを追加することも可能です。
return $render;
コメントなしの同じコード:
$block_manager = \Drupal::service('plugin.manager.block');
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
$access_result = $block_plugin->access(\Drupal::currentUser());
if ($access_result->isForbidden()) {
return [];
}
$render = $plugin_block->build();
return $render;
Drupal 7
Drupal 7 では関数は同じですが、パラメータが少し異なります。block、view の 2 つのパラメータの代わりに、1 つの block_view を使用します。
print render(module_invoke('block', 'block_view', '12'));
views の場合、ブロックの挿入は次のようになります。
print render(module_invoke('views', 'block_view', 'feedbacks-block'));
このように Drupal 7 で view ブロックを挿入します。今度は最初のブロックの delta にブロック番号がなく、単に feedbacks-block と書くことに注意してください。
Drupal 6
必要な場所にブロックを挿入するには、module_invoke() 関数を使用します。
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
例えば、管理画面で作成したブロックを挿入する必要がある場合は、次のコードを使用します。
$block = module_invoke('block', 'block', 'view', 12);
print $block['content'];
12 はブロックの番号、その delta です。
views ブロックを挿入する場合は、次のようにします。
$block = module_invoke('views', 'block', 'view', 'feedbacks-block_1');
print $block['content'];
feedbacks-block_1 は view でのブロックの名前で、feedbacks は view の名前、block_1 はこの view でのディスプレイの名前です。