web-dev-qa-db-ja.com

プログラムでビューをレンダリングし、ノードフィールドとして設定する方法は?

カスタムビューをレンダリングし、結果をノードのコンテンツとして配置しようとしています。

これが私のコードです

function my_theme_preprocess_node(&$variables)
{
    if (isset($variables['node']) && $variables['node']->getType() == 'custom_type') {
        $reference_view = $variables['node']->field_reference_view->first();
        if (!empty($reference_view)) {
            $view_name = $reference_view->getValue()['value'];
            $view = \Drupal\views\Views::getView($view_name);
            $view->setArguments(array());
            $view->setDisplay('block');
            $view->preExecute();
            $view->execute();
            $variables['embedded_view'] = $view->buildRenderable();

        }
    }

}

しかし、このコードはデバッグメッセージのみを表示し、twigテンプレートファイルで出力を取得しようとすると、空になります

    {{ node.embedded_view }}

私のコードの何が問題になっていますか? twigテンプレートファイルでビューを印刷するために、ビューをレンダリングしてノードのコンテンツまたは単にノードフィールドとして設定するにはどうすればよいですか。

2
HelloMufecayo

変数参照が正しくないためです。そのはず:

{{ embedded_view }}

$ variables配列に$variables['embedded_view']として追加したので。

別の方法として、 Twig Tweak モジュールを取得できます。 docsページの例:

{# You can pass arguments to the view if needed. #}
  <dt>View:</dt>
  <dd>{{ drupal_view('view_name', 'page_1') }}</dd>
3
Kevin

私は、ビューモードでフィールドを配置するのが簡単で非常に簡単な pseudo-field を作成する方が良いと思います。

ノードテンプレートのみを使用できるのに、なぜ2つのテンプレートを作成するのですか?

テンプレートファイルは、次の場合にのみ検討する必要があります。

リージョンの追加と編集。グローバルレイアウトの変更。レイアウト構造のカスタマイズ。

なぜ疑似フィールドが役立つのですか?

疑似フィールドは、特定のエンティティのコンテンツと一緒にレンダリングする必要があるコンテンツまたはデータがある場合に最適です。また、テンプレートやプリプロセッサ内でハックしてこれらすべてをハードコードしたくないので、疑似フィールドを使用して、これに対する何らかの制御をUIに公開できます。つまり、コアのドラッグアンドドロップ機能を使用して、通常のエンティティフィールドに対するそれらの可視性と位置を制御できます。

例:

/**
 * Implements hook_entity_extra_field_info().
 */
function MY_MODULE_entity_extra_field_info() {
  $extra = [];

  $extra['node']['custom_type']['display']['pseudo_field_name'] = array(
    'label' => t('My own pseudo-field'),
    'description' => t('My pseudo-field'),
    'weight' => 100,
    'visible' => FALSE,
  );

  return $extra;
}

/**
 * Implements hook_ENTITY_TYPE_view().
 */
function MY_MODULE_node_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
  // Creating the pseudo-field     
  $reference_view = $entity->field_reference_view->first();
  $view_name = $reference_view->getValue()['value'];
  $view = \Drupal\views\Views::getView($view_name);

  if (is_object($view)) {
    $view->setArguments([]);
    $view->setDisplay('block');
    $view->preExecute();
    $view->execute();
    $content = $view->buildRenderable('block', $args);
  }

  $build['pseudo_field_name'] = $content;
}

キャッシュを消去してお楽しみください;-)

enter image description here

参照:

2