web-dev-qa-db-ja.com

Twigテンプレートで他の(参照)ノードからのメディアエンティティイメージを表示する

私の場合、インターネットで見つかったすべてが機能しないようです。 :/一般に、ノードへの参照フィールドを持つノードによって参照される画像とプロジェクトを表示する必要があります。

私が持っています:

  • cT Ideaのノード(ここではコンテンツを表示したい)
  • cT Exampleのノード。

    1)アイデアへの参照フィールド2)メディアへの参照フィールド、画像3)CTプロジェクトへの参照フィールド

アイデアページに例を表示したいのですが、各例には次のものが表示されます:説明、画像、プロジェクトリンク

説明を表示できましたが、画像とプロジェクトを表示できません。

これがコードです

の中に *.themeファイル:

function showcase_lite_preprocess_node__idea(&$variables) {
  $current_node = $variables['node'];
  $current_node_id = $current_node->id();

  $query = \Drupal::entityQuery('node');
  $query->condition('type', 'example');
  $query->condition('status', 1);
  $query->condition('field_example_ideas', $current_node_id);
  $nids = $query->execute();
  $relatednodes = Node::loadMultiple($nids);

  if (!empty($relatednodes)) {
    foreach ($relatednodes as $related_node) {
      $related_node_image = $related_node->field_example_image->value;
      $related_node_description = $related_node->field_example_description->value;
      $related_node_project = $related_node->field_example_project->value;

      $variables['related_node_image'] = $related_node_image;
      $variables['related_node_description'] = $related_node_description;
      $variables['related_node_project'] = $related_node_project;
    }
  }
}

の中に node--idea.html.twigファイル:

{% block content %}
    {{ content }}
    {{ related_node_description }}
    {{ related_node_image }}
    {{ related_node_project }}
{% endblock %}

これには、アイデアのコンテンツとサンプルの説明のみが表示されます。

問題は、$related_node_imageおよび$related_node_projectは、Twigが期待しているものに対応していません。しかし、Kintがメモリ制限のエラーを出すため、変数内の内容を確認できません。

Drupalバージョン:8.5.3。

2
Oksana

Twigのレンダリング可能な出力を取得するには、 EntityViewBuilder :: viewMultiple() を使用します

    $variables['related_nodes'] = \Drupal::entityTypeManager()
      ->getViewBuilder('node')
      ->viewMultiple($relatednodes, $view_mode, $current_node->language()->getId());

ここで指定した表示モードで3つのフィールドを構成します。

2
4k4

これは必ずしもTwigで行う必要がありますか?フィールドフォーマッタとビューモードだけでコーディングせずにこれを実現できます。それは出版状況さえカバーします。

それとは別に、参照されたノードIDを取得するためにクエリを実行する必要はありません。ノードIDはすでにtarget_id参照フィールドの値。

$nids = [];
if (!$node->field_example_ideas->isEmpty()) {
  $references = $node->field_example_ideas->getValue();
  foreach ($references as $reference) {
    $nids[] = $reference['target_id'];
  }
}
// This will give you all node IDs.
ksm($nids);

コードなしのアプローチ:

コンテンツタイプAとコンテンツタイプBがあります。コンテンツタイプAには、コンテンツタイプBを参照するノード参照フィールドがあります。コンテンツタイプBには画像があり、簡単にするために、コンテンツタイプAに画像のみを表示し、コンテンツタイプB以外は何も表示しないようにするとします。

  1. [構造]> [コンテンツタイプ]> [B]> [表示タブの管理]に移動し、新しいビューモード(一番下)を追加するか、既存のビューモードを使用します(例:Teaser)。そこで、画像フィールド以外のすべてのフィールドを非表示にします。

  2. [構造]> [コンテンツタイプ]> [A]> [表示タブの管理]に移動し、ここで参照フィールドとして[レンダリングエンティティ]を選択してから、小さな歯車アイコンをクリックして表示モードを選択します。これで、「ティーザーとしてレンダリング」と表示されます。

  3. 完了:)


UIから実行できる場合は、テンプレートの編集を避けます

他にも、テンプレートを使用してUIをオーバーライドしないようにするコードワード「疑似フィールド」の代替手段があり、結局、UIが役に立たなくなります。上記では不十分な場合は、コメントをドロップしてください。

1
leymannx