web-dev-qa-db-ja.com

twigテンプレートでの比較

次のようなカスタムコンテンツタイプのリストフィールドがあります。

フィールドマシン名は:field_app_os

key|label
Win|Windows
Android|Android

Twigテンプレートでkeyにアクセスするには、content.field_app_osまたは Twig Field Value で、両方の出力はAndroidです。

Twig Field Valueは、Drupal 8 themersがフィールドレンダーアレイから部分的なデータを取得することを可能にします。レンダーアレイに深くドリルしたり、プリプロセス関数を使用したりせずに、出力をより詳細に制御できます。
フィルター:
-field_label:フィールドラベルの値を返します。
-field_value:フィールドラッパーなしでフィールド値のレンダー配列を返します。

/* with use of Twig Field Value module */
{{ content.field_app_os|field_value }}  {# outputs 'Android' #}

 /* without use of Twig Field Value module */
{{ content.field_app_os }}  {# outputs 'Android' #}

ただし、単純な比較を行うと、両方の出力はFalseになります。

{% set app_os = content.field_app_os|field_value %}
{{ kint(app_os == 'Android') }} {# outputs 'bool FALSE' #}

または私が使用するとき:

{% set app_os = content.field_app_os %}
{{ kint(app_os == 'Android') }} {# outputs 'bool FALSE' #}

私のコードの何が問題になっていますか?

1
Mojtaba Reyhani

{{content}}はレンダー配列です。ここにキー/ラベルペアのラベルがあります。

{{ content.field_app_os[0]['#markup'] }}

しかし、これはロジックにとって理想的ではありません。

  1. たとえば、レイアウトモジュールをインストールすると、レンダーアレイ内の位置が変わる可能性があります。
  2. #markupの内容は、フィールドフォーマッタが表示モードでどのように構成されているかによって異なります。
  3. ラベルは翻訳可能であるため、多言語サイトではロジックが壊れます。

したがって、データベースの値は次の場所で使用する方が適切です。

{{ node.field_app_os.value }}

これは、キーとラベルのペアの最初の部分であり、変換できません。ビューモードでのフィールドの構成方法に関係なく、値にアクセスできます。

2
4k4