web-dev-qa-db-ja.com

twigテンプレートのエンティティ印刷取得変数

エンティティプリントを使用していて、twigテンプレートでノード変数を取得したいので、{{content.field_name}}のように呼び出すことができます。

前処理関数を使用してみましたが、うまく機能しているかわかりません。

私がtwigというテンプレートentity-print.html.twigを持っていると仮定すると、ここで私が試した前処理関数:

function THEMENAME_template_preprocess_entity_print(&$vars) {
    $vars['field_name'] = $entity->get('field_name')->getValue();
  }

私も試しました

  function THEMENAME_template_preprocess_entity_print(&$vars) {
    $vars['field_name'] = $entity->get('field_name')->value;
  }

twig変数をデバッグ目的で使用して、field_nameを呼び出しています。

   1 {{ content.field_name.0 }}
   2 {{ content.field_name.value }}
   3 {{ content.field_name.0.value }}
   4 {{ field_name.content }}
   5 {{ content.field_name[0] }}
   6 {{ node.field_name.value }}

何も来ない。何が悪いのですか?カスタムモジュールを作成する必要がありますか?

1
Aporie

Entity Print in Drupal 8 をもう一度確認する必要があるようです。私は Entity Print モジュールを使用しており、正常に動作します。ここで以下は、私がお勧めするいくつかのポインタです。元の投稿は、twigテンプレートのノード変数の印刷に関するものです

  1. コンテンツタイプで、[ディスプレイの管理]-> [カスタムディスプレイ設定の拡張]-> [PDFを有効にする]に移動します。これによりPDF表示モード(印刷に使用される)が作成されます)
  2. twig template node--article--pdf.html.twig(記事をコンテンツタイプのマシン名に置き換えます)を作成します)
  3. Entity Print in Drupal 8 で提案されているようにyour_theme.info.ymlとyour_theme.libraries.ymlを更新して、テーマを制御し、印刷専用のcssファイルを割り当てることができるようにします
  4. Entity-print.html.twigをコピーしてサブテーマに追加します
  5. Node--article--pdf.html.twigを使用すると、必要な変数を制御できます。ただし、PDF表示モードを最初に使用して、何ができるかを確認することをお勧めします。

私はまだ前処理関数を使用していませんが、追加の処理が必要な場合にのみ必要です。 PDF表示モード、entity-print.html.twig、およびnode--article--pdf.html.twigテンプレートを使用すると、必要に応じて印刷できます。

最終的には、PDF表示モードを使用して、PDF表示モード(クラスの追加、div、順序、フィールドの追加/非表示/削除)、など)UIを使用します。コードを使用してどのフィールドを表示するかを管理するのは、多くの場合面倒であることがわかりました。ビューモードは必要なものの多くを処理できますが、最初にPDfビューモードを有効にする必要があります。

Entity-print.html.twigのサンプル

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>{{ title }}</title>
  {{ entity_print_css }}
</head>
<body>
  <div class="optional_class">
      {{ content }}
  </div>
</body>
</html>

サンプルノード--article--pdf.html.twig:

<article class="optional_class_wrapper">
  {{ content.field_name }}
  {{ content.body }}
  {{ label }} 
  {{ content.field_name.0.value }}
</article>
3
usernameabc

プリプロセス関数を記述している場合、関数の正しい名前はTHEMENAME_preprocess_entity_print()です。 THEMENAMEを、それを実装するテーマのマシン名に置き換えます。これが当てはまる場合、$vars['field_name']として設定した前処理関数で、$varsは前処理関数への参照として渡される配列で、Twigテンプレートファイルで{{ field_name }}としてアクセスできます。例を参照してください template_preprocess_node() および node.html.twig :関数が$variables['node']として設定するものは、テンプレートファイルで{{ node }}として使用できます。

テンプレートには正しいファイル名を使用してください。

2
kiamlaluno

これは問題だと思います。ルートからノードを取得しようとしていますが、ノードルートではなく、entity_printルートにいるため、ノードを使用できません。

補足として、値を取得する前に、フィールドが存在することを常に確認する必要があります。このようなことを試す前に:

$vars['field_name'] = $entity->get('field_name')->getValue();

あなたはこのようなことをするべきです:

if ($node->hasField('field_name') && !$node->field_name->isEmpty()) {
  $vars['field_name'] = $entity->get('field_name')->getValue();
}

しかし、この場合、$ node(または$ entity)がここに入力されていないので、おそらくエラーを防ぐことさえできません。

Entity_printプリプロセス関数に対して私が行った手段は、基本的に文字列URLを解析することです。印刷パスは/ print/pdf/{entity_type}/{entity_id}のようなもので、必要なすべての情報が含まれています。

/**
 * Implements HOOK_preprocess_entity_print__entity().
 */
function THEME_preprocess_entity_print__node(array &$variables) {
  $route = \Drupal::routeMatch();
  $entity_type = $route->getParameter('entity_type');
  $entity_id = $route->getParameter('entity_id');
  // double check that you are printing a node, not a view or something else.
  if ($entity_type == 'node') {
    $node = \Drupal::entityTypeManager->getStorage('node')->load($entity_id);
    if ($node->hasField('field_name') && !$node->field_name->isEmpty()) {
      $variables['field_name'] = $node->field_name->value;
    }
  }
}

{{field_name}}を使用するだけでtwigファイルの 'field_name'にアクセスできるようになりましたが、もう一度印刷する前にデータが入力されていることを確認してください。そうしないと、別のエラーが発生する可能性があります。

entity-print.html.twig

{% if field_name %}
  {{ field_name }}
{% endif %}

もちろん、これは「field_name」が単一の値フィールドであり、entity_referenceやその他の種類の複雑なフィールドではないことを前提としています。

1
scottsawyer