web-dev-qa-db-ja.com

プログラムでブロックをtwigテンプレートにレンダリングします

私のpage.html.twigテンプレートでビューブロックをレンダリングする必要があります。 D7ではこれを行います:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

Drupal 8では、module_invokeは非推奨であり、これを使用することをお勧めします:(ブロックの名前を2番目のパラメーターとして追加しました)

Drupal::moduleHandler()->invoke($block, 'views_block__blog_block_1', $args = array());

いくつか試しました。最初にtwigテンプレートでそれをやろうとしましたが、twigテンプレートでphp関数を呼び出す方法がわからないので、それはわかりませんでしたあまりにも。

次に、.themeファイルのpreprocess_page()関数で関数を呼び出しましたが、機能させる前に、twigテンプレート内で変数を機能させるために、もっと簡単なことを試みましたたとえば、どちらも機能しません。

.themeファイルのtemplate_preprocess_page(&$ vars)関数で:

$test = 'Hello World';
$vars['$my_var'] = $test;

twigテンプレート内でmy_varを呼び出そうとしましたが、機能せず、「サイトにエラーがあります。管理者に連絡してください」というエラーメッセージが表示されました。

要約すると、ここに私の質問があります:

  1. twigテンプレート内で変数を使用できるようにするにはどうすればよいですか?
  2. twigテンプレート内で関数を呼び出すにはどうすればよいですか?
  3. .themeファイルまたはtwigテンプレート内にブロックをレンダリングしますか?
28
Rick Bergmann

Module_invoke()で間違った方向に進んでいます。これは、{$ module_name} _block_view()関数を呼び出す方法です。

それが変更されたという事実は重要ではありません、重要なのは、ブロックシステムが8.xで完全に変更され、現在プラグインと構成エンティティを使用していることです。これらの関数はもう存在しません。

いくつかのオプションがあります。

a)既存のブロック構成エンティティを再利用して表示します。非常に簡単ですが、その構成が存在する必要があります。無効なブロックとして。

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  ->getViewBuilder('block')
  ->view($block);

b)ブロックプラグインインスタンスを直接作成し、構成を渡します(ブロックプラグインIDと構成は、エクスポートされたブロック構成エンティティで簡単に見つけることができます)。欠点は、レンダーキャッシュを取得できないことですが、既にキャッシュされている場所(ノードテンプレートなど)に表示しても、それは重要ではありません。

$variables['block_output'] = \Drupal::service('plugin.manager.block')
  ->createInstance($plugin, $configuration)
  ->build();

c)ビューの場合、ビューを直接ロードして表示することもできます。

d)アプローチを完全に再考し、ブロック領域または ページマネージャー (8.xの標準ブロックプラグインを使用)を使用することもできます。

48
Berdir

Drupal 8の場合、これはpreprocess_hookでブロックプラグイン(つまり、カスタムモジュールで作成したプラグイン)をレンダリングするために機能します。

function mymodule_preprocess_something(array &$variables) {
  $customblock = \Drupal::service('plugin.manager.block')->createInstance('my_custom_block', []);
  $variables['content']['custom_block_output'] = $customblock->build();
}

次に、これをtwigテンプレートで次のようにレンダリングできます。

{{ content.custom_block_output }}

注:これにより、ブロックの一般的なバージョンが読み込まれます。 (/ admin/structure/blockで作成した後で)ブロックのインスタンスを変数とともにロードする場合は、次のようにロードする必要があります。

    // Load Instance of custom block with variables
    $example_block = \Drupal::entityManager()->getStorage('block')->load('example_block_machine_name');
    if (!empty($example_block)){
      $example_block_content = \Drupal::entityManager()
        ->getViewBuilder('block')
        ->view($example_block);
      if ($example_block_content) {
        // Add block content to build array
        $variables['content']['custom_block_output'] = $example_block_content;
      }
    }
12
oknate

そのために Twig Tweakmodule を使用できます。その後、次の構文を使用できます。

  <dd>{{ drupal_block('myblock') }}</dd>

関連: プログラムでブロックを配置するにはどうすればよいですか?

6
kenorb