エンティティプリントを使用していて、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 }}
何も来ない。何が悪いのですか?カスタムモジュールを作成する必要がありますか?
Entity Print in Drupal 8 をもう一度確認する必要があるようです。私は Entity Print モジュールを使用しており、正常に動作します。ここで以下は、私がお勧めするいくつかのポインタです。元の投稿は、twigテンプレートのノード変数の印刷に関するものです
私はまだ前処理関数を使用していませんが、追加の処理が必要な場合にのみ必要です。 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>
プリプロセス関数を記述している場合、関数の正しい名前はTHEMENAME_preprocess_entity_print()
です。 THEMENAMEを、それを実装するテーマのマシン名に置き換えます。これが当てはまる場合、$vars['field_name']
として設定した前処理関数で、$vars
は前処理関数への参照として渡される配列で、Twigテンプレートファイルで{{ field_name }}
としてアクセスできます。例を参照してください template_preprocess_node()
および node.html.twig :関数が$variables['node']
として設定するものは、テンプレートファイルで{{ node }}
として使用できます。
テンプレートには正しいファイル名を使用してください。
これは問題だと思います。ルートからノードを取得しようとしていますが、ノードルートではなく、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やその他の種類の複雑なフィールドではないことを前提としています。