小枝テンプレートでプログラムでブロックをレンダリングする


28

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());

いくつか試してみました。最初に小枝テンプレートでそれをやろうとしましたが、小枝テンプレートで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テンプレート内にブロックをレンダリングしますか?

回答:


47

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の標準ブロックプラグインを使用)を使用することもできます。


ご回答ありがとうございます。AまたはBと一緒に行きたいです。リージョンは機能しますが、リージョンの使用は避けたいです。私が持っている唯一の問題は、twigテンプレートでblock_outputを呼び出すときにエラーが発生することです-「予期しないタグ名「block_output」なので、preprocess_page関数で作成した変数を使用可能にする方法がわかりません。私はそれを解決しようとします
リックバーグマン

{%?を使用しているように聞こえます {{block_output}}を使用します。
ベルディール

はい、それでした!まだ小枝のこつを得ようとしています。ありがとう。
リックバーグマン

Drupal 8.0.0からentityManagerは非推奨になりました。代わりにentityTypeManagerを使用してください。
フィリップマイケル

このコードはどこに置きますか?$ block = \ Drupal \ block \ Entity \ Block :: load( 'your_block_id'); $ variables ['block_output'] = \ Drupal :: entityManager()-> getViewBuilder( 'block')-> view($ block); ありがとうございました!

11

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

1
これが私にとっての解決策であり、最も簡単な解決策でした。
ギヨームボワ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.