web-dev-qa-db-ja.com

Drupal 8ビューテンプレートの個々のフィールドにアクセスする

比較的シンプルであると思う何かをするのに問題がありますdrupal 8ビュー。

Countriesというコンテンツタイプがあります。私のホームページの3つの最新の国ノードをビューブロックに表示したいと思います。各国は、コンテナーdivに「views-row」というクラスで表示されます。私はviews--view--unformatted--countries--block_1.tplを使用して出力をテンプレート化しています。

次のマークアップのようなものを出力したいと思います:

<a class="view-row-1" href="/link/to/node">
    <img src="source-of-teaser-image.png">
    <h3>Title of node</h3>
</a>

<a class="view-row-2" href="/link/to/node">
    <img src="source-of-teaser-image.png">
    <h3>Title of node</h3>
</a>

<a class="view-row-3" href="/link/to/node">
    <img src="source-of-teaser-image.png">
    <h3>Title of node</h3>
</a>

私が抱えている問題は、テンプレートの個々のフィールドにアクセスすることです。表示モードを使用すると、個々のフィールドにアクセスできます。ビューで「フィールドを表示」を選択すると、「ビュー結果カウンター」と「パス」のフィールドを追加できます。これにより、「ビュー行N」クラスを追加して、タグをノードにリンクできます。 、しかし私はフィールドに個別にアクセスすることができません。私は{{row.content}}変数を持っていますが、変数(たとえば、row.content.field_name)をさらに掘り下げようとしても何も得られず、{{dump(row.content)}}を呼び出すとWebサイトがクラッシュします。

これを2つの理由で表示モードとして出力できません。表示モードで「表示結果カウンター」または「パス」フィールドにアクセスできません。これらの変数があったとしても、一部のフィールドは他のフィールド内にネストされます(画像とタイトルは内にネストされます)

これは本当に簡単なはずです。

<a class="view-row-{{ row.content.view_result_counter }}" href="{{ row.content.path }}">

など、私は考えられるすべてのものを試しました。私は完全に間違った道を進んでいますか? Twigそして私は今のところうまくいっていません...

9
Kaizen9001

私はキントを使用する方法を考え出しました。

Views-view-unformatted.html.twig内で、次のコードを使用して個々のフィールドを表示します。

{% for row in rows %}

{{ row.content['#view'].style_plugin.render_tokens[ loop.index0 ]['{{ YOUR_FIELD_NAME }}'] }}

{% endfor %}
14
Ibrahim Samir

期待どおりかどうかはわかりませんが、フィールドテンプレートをオーバーライドできます。

  1. 有効にするTwigデバッグ: https://www.drupal.org/node/1903374
  2. ブラウザでページを検査します(サイトがデバッグモードの場合、各要素のテンプレートへのパスを含むコメントがhtmlにあります)。たとえば、これはフィールドテンプレートです:core/themes/stable/templates/views/views-view-fields.html.twig
  3. 必要なテンプレートをテーマフォルダにコピーします
  4. マークアップを追加または変更します。

{{ dump(variable) }}または{{ kint(variable) }}を使用してテンプレートをデバッグできます

0
fadehelix

解決策は、ビューフィールドテンプレートを使用するだけです。

Themes/templatesフォルダーの下に新しいテンプレートを作成しました。

views-view-fields--VIEW-NAME.html.twig

これで、次のようにフィールドの値にアクセスできます。

{{ fields.field_NAME.content }}
0
Viswa

あなたのケースではコンテンツ/ビューモードを使用できます。

1 /「views-view-unformatted.html.twig」では、「for」ループで「loop.index」を使用して現在の行のインデックスを取得し、「row_classes」変数に追加できます。

2/twigノードのテンプレートでは、次のようなものを使用できます。

<a href="{{ path('entity.node.canonical', {'node': node.id}) }}">
    {{ content.field_img }}
    {{ node.getTitle()}}
</a>

3 /おそらく余分なhtmlを取得しますが、関連するテンプレートをオーバーライドすることで、そのほとんどを取り除くことができます。

0
progzy

あなたの場合、views-view-unformatted--countries--block_1.htmlの代わりにviews-view-fields--countries--block_1.html.twigを使用する必要があります。 twigファイル。

ビューフィールドテンプレートは、結果のすべての行で反復します。あなたのviews-view-fields--countries--block_1.html.twigは以下のコードを含む必要があります-

<div>
  <a class="view-row" href="{{variable-to-print-path }}">
   <img src="{{ image-path }}">
   <h3>{{ fields.title.content</h3>
  </a>
</div>

-{{kint(fields)}}のようなkint関数を使用して、fields配列を確認できます。

Kint関数の出力から画像パスとアンカーパス変数を確認します。

これをviews-view-unformatted--countries--block_1.htmlで行いたい場合。小枝、それからあなたは以下のようなフィールド値にアクセスできます-

{% for row in rows %}
  {% set photo = file_url(row['content']['#row']._entity.field_page_photo.entity.fileuri) %}          
  <li><img src={{ photo }} class="img-responsive img-circle"></li>
{% endfor %}
0
Renuka Kulkarni