Drupal 8 beta-14を使用してサイトを開発しています。さまざまな用語のビューブロックを作成しましたが、コードを使用して表示したいと思います。プログラムで表示するにはどうすればよいですか?このコードを使用してDrupal 7でそれを行うために使用されましたが、私はDrupal 8.について混乱しています。
$block = module_invoke('block', 'block_view', '4');
$text_block = render($block['content']);
ブロックには2つのタイプがあり、2つをレンダリングする方法は少し異なります。
コンテンツブロックは、インターフェイスで作成するブロックです。これらは、フィールドなどを備えたノード構成可能データ構造によく似ています。これらの1つをレンダリングする場合は、エンティティで通常行うことを実行し、エンティティをロードして、ビュービルダーでレンダリングできます。
$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;
ブロックは、さまざまなモジュールで定義されたプラグインにすることもできます。例としては、パンくずリストブロックがあります。これらをレンダリングする場合は、ブロックプラグインマネージャーを使用する必要があります。
$block_manager = \Drupal::service('plugin.manager.block');
// You can hard code configuration or you load from settings.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Some blocks might implement access check.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Return empty render array if user doesn't have access.
// $access_result can be boolean or an AccessResult class
if (is_object($access_result) && $access_result->isForbidden() || is_bool($access_result) && !$access_result) {
// You might need to add some cache tags/contexts.
return [];
}
$render = $plugin_block->build();
// In some cases, you need to add the cache tags/context depending on
// the block implemention. As it's possible to add the cache tags and
// contexts in the render method and in ::getCacheTags and
// ::getCacheContexts methods.
return $render;
2つのタイプで共有されるのはブロックです。ブロックをリージョンに挿入すると、ブロックのすべての設定を持つ構成エンティティが作成されます。場合によっては、構成エンティティを処理する方が便利です。同じブロックを構成が異なる複数のリージョンに配置できるため、ブロック構成エンティティを使用するとよりトリッキーになる可能性があります。良い点は、特定の構成でブロックをレンダリングしたい場合があることです。悪い点は、構成IDがインターフェイスをいじることによって変更される可能性があるため、ユーザーにブロックインターフェイスを使用させた後、コードが機能しなくなる可能性があることです。
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
テンプレート内のブロックのみを表示するには、前処理を使用するのが最善の方法です。
_$block = \Drupal\block\Entity\Block::load('my_block_id');
$variables['My_region'] = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
_
そして、あなたの_page.html.twig
_または_node.html.twig
_または_xxx.html.twig
_で、次のように変数My_regionを使用します。
_{% if page.My_region %}
{{ page.My_region }}
{% endif %}
_
そして、レンダリング可能な配列(カスタムモジュール)で、例としてcontent()のコントローラーカスタムに:
_public function content() {
$block = \Drupal\block\Entity\Block::load('my_block_id');
$block_content = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
return array(
'#type' => 'container',
'#attributes' => array(
'class' => array("Myclass"),
),
"element-content" => $block_content,
'#weight' => 0,
);
}
_
使用する _ DrupalはすでにD8でのレンダリングを想定しており、これは 非推奨 です。代わりにdrupal_render
_\Drupal::service('renderer')->renderRoot()
を使用する必要があります。
少し重いですが、最大面積システムを使用する方が良く、前処理からのロードブロックは追加されません。モジュールでコントローラーを使用する場合、これは正当な使用法のようです。
上の答えに加えて...ビューからブロックをレンダリングしたい場合は、少し異なる方法で行う必要があるかもしれません。
$view = views_embed_view('my_view_name', 'my_display_name');
(表示名例-> block_1)
これをtwigに渡すので、(レンダリングサービスを使用して)レンダリングする必要はありません。
したがって、変数としてtwig(この例では、コントローラの戻り値)に渡すことができます):
return [
['description' => [
'#theme' => 'your_theme_hook',
'#your_variable => $view
]
]
あなたのモジュールでは、あなたの変数のためにhook_theme()が必要です:
function hook_theme($existing, $type, $theme, $path) {
return array(
'your_theme_hook' => array(
'variables' => [
'your_variable' => NULL,
]
)
)
}
そして最後にあなたのtwigテンプレート:
{{ your_variable }}
カスタムブロックのHTMLを取得し、それを使用する必要がありました。
$con = \Drupal\block\BlockViewBuilder::lazyBuilder('bartik_search', 'full');
$d = \Drupal::service('renderer')->renderPlain($con);
print $d->__toString();
// You need a block_id! to get it just click configure in the desire block and you'll get url like this /admin/structure/block/manage/bartik_search the last part of the parameter is the block id
$block = \Drupal\block\Entity\Block::load('bartik_search');
$block_content = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
return array('#markup' => \Drupal::service('renderer')->renderRoot($block_content));
基本的に、2種類のレンダリングがあります。
レイアウトにブロックの既存のインスタンスがある場合。ブロックはtwigでレンダリングできます。
$block = Block::load('BLOCK_ID');
$variables['social_links'] = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
ブロックのインスタンスまたは構成はありません。次に、プリプロセッサで、インスタンスを作成し、ブロックを作成してレンダリングする必要があります
$block_manager = \Drupal::service('plugin.manager.block');
$config = [];
$plugin_block = $block_manager->createInstance('farmjournal_social_sharing', $config);
$render = $plugin_block->build();
$variables['farmjournal_social_sharing'] = render($render);
これはプラグインブロックで機能するようです。
$block = \Drupal\block\Entity\Block::load('some_block_id_3');
$pluin = $block->getPlugin();
$build = $pluin->build();
$build['#weight'] = 4;
$form['block'] = $build;