web-dev-qa-db-ja.com

PHP in Drupal 8?Twig?

Drupal 7でDisplay Suiteを使用するPHPロジックをカスタムDisplay Suiteフィールドに簡単に追加できます。 Drupal 8ではPHPは許可されていません。 Drupal 8のDisplay Suiteフィールドにロジックをプログラムするにはどうすればよいですか?

例として、単純なif/thenステートメントを使用してノードフィールドを表示/非表示にします。 Twigをフィールドに埋め込もうとしましたが、実行されません。プレーンテキストとして表示されるだけです。

これは私のサンプルコードです{# This is a test comment. #}

3
Ben Stark

twigでフィールドを非表示にするのは非常に簡単です。フィールドに次のような値があるかどうかを確認できます。

{% if node.field_foo is not empty %}
  {{ content.field_foo }}
{% endif %}

PHPファイルからraw twigを実行することも、Twigを注入してフィールドフォーマッタを介して解析することもできません(とにかく、多くの作業がないといけません) )。

ノードオブジェクトのチェックとコンテンツ配列のレンダリングの違いに注意してください。

あなたはエンティティオブジェクトに対してチェックを行い、never(私の意見では)レンダー配列を実行したいとします。上記のコードでは、フィールドに値がある場合、条件は真です。特定の文字列の値をcheckしたい場合は、プリプロセスフックに適しています。

レンダリングされるtwigテンプレートが段落であり、Nodeテンプレートではない場合はどうなりますか?大した違いはありません:

{% if paragraph.field_foo is not empty %}
  {{ content.field_foo }}
{% endif %}

さらに筋肉が必要な場合は、ロジックをmytheme.themeのプリプロセスフックに移動し、PHPを何でも使用できるようにして、新しい変数をTwigに注入することをお勧めしますファイル。

function mytheme_preprocess_node(&$variables) {
  $variables['show_foo_field'] = FALSE;

  // if field ...
  // and maybe some more conditions?
  $variables['show_foo_field'] = TRUE;
  // end if...
}

次に、twigテンプレートで...

{% if show_foo_field %}
  {{ content.field_foo }}
{% endif %}

さて、あなたはあなたがDisplay Suiteを使用していると言います-私は個人的に、あなたが求めているようなUIを通じて状態やコードを注入しません。しかし、私が知っていることの1つ Display Suiteは、(最後に見たとき)前処理呼び出しの大部分をハイジャックする傾向がある -ノードを呼び出すための適切な前処理フックのドキュメントまたはAPIを確認してください。

Displayスイートの現在のフックは、.api.phpファイルで確認できます

twigデバッグを確実に有効にして、HTMLソース内のTwigテンプレートの命名パターンが何であるか(推奨)を確認できるようにし、mytheme_preprocess_nodeが起動しない可能性があることに注意してください。正しいDSフックを見つける必要があります。

1
Kevin