web-dev-qa-db-ja.com

プログラムでブロックを表示するにはどうすればよいですか?

Drupal 8 beta-14を使用してサイトを開発しています。さまざまな用語のビューブロックを作成しましたが、コードを使用して表示したいと思います。プログラムで表示するにはどうすればよいですか?このコードを使用してDrupal 7でそれを行うために使用されましたが、私はDrupal 8.について混乱しています。

$block = module_invoke('block', 'block_view', '4');
$text_block = render($block['content']);
35
rashidkhan

ブロックには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;
76
googletorp

テンプレート内のブロックのみを表示するには、前処理を使用するのが最善の方法です。

_$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_render_ DrupalはすでにD8でのレンダリングを想定しており、これは 非推奨 です。代わりに\Drupal::service('renderer')->renderRoot()を使用する必要があります。

少し重いですが、最大面積システムを使用する方が良く、前処理からのロードブロックは追加されません。モジュールでコントローラーを使用する場合、これは正当な使用法のようです。

16
woprrr

上の答えに加えて...ビューからブロックをレンダリングしたい場合は、少し異なる方法で行う必要があるかもしれません。

$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 }}
6
CliveCleaves

カスタムブロックのHTMLを取得し、それを使用する必要がありました。

$con = \Drupal\block\BlockViewBuilder::lazyBuilder('bartik_search', 'full');
$d   = \Drupal::service('renderer')->renderPlain($con);

print $d->__toString();
5
Eugene
// 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));
1
Adi

基本的に、2種類のレンダリングがあります。

  1. レイアウトにブロックの既存のインスタンスがある場合。ブロックはtwigでレンダリングできます。

    $block = Block::load('BLOCK_ID');
    $variables['social_links'] = \Drupal::entityTypeManager()
      ->getViewBuilder('block')
      ->view($block);
    
  2. ブロックのインスタンスまたは構成はありません。次に、プリプロセッサで、インスタンスを作成し、ブロックを作成してレンダリングする必要があります

    $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);
    
1
Wasim Khan

これはプラグインブロックで機能するようです。

$block = \Drupal\block\Entity\Block::load('some_block_id_3');
  $pluin = $block->getPlugin();
  $build = $pluin->build();
  $build['#weight'] = 4;
  $form['block'] = $build;
0
Taggart Jensen