it-swarm.com.de

Entitätsdruck erhält Variable in twig Vorlage

Ich verwende Entity Print und möchte Knotenvariablen in meiner Vorlage twig) erhalten, damit ich sie wie {{content.field_name}} aufrufen kann.

Ich habe versucht, eine Vorverarbeitungsfunktion zu verwenden, bin mir aber nicht sicher, ob ich die Dinge gut mache.

Angenommen, ich habe eine twig Vorlage namens entity-print.html.twig, hier die Vorverarbeitungsfunktionen, die ich ausprobiert habe:

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

Ich habe es auch versucht

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

Ich rufe field_name mit all dem auf twig Variable zum Debuggen:

   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 }}

Nichts kommt. Was mache ich falsch ? Muss ich ein benutzerdefiniertes Modul erstellen?

1
Aporie

Sieht so aus, als müssten Sie Entity Print in Drupal 8 erneut überprüfen. Ich verwende das Modul Entity Print und es funktioniert einwandfrei. Hier Es gibt einige Hinweise, die ich unten empfehlen würde. Ihr ursprünglicher Beitrag befasst sich mit dem Drucken von Knotenvariablen in twig-Vorlagen

  1. Navigieren Sie in Ihrem Inhaltstyp zu Anzeige verwalten -> Benutzerdefinierte Anzeigeeinstellungen erweitern -> PDF aktivieren. Dadurch wird ein PDF -Ansichtsmodus (der zum Drucken verwendet wird) erstellt.
  2. Erstellen Sie eine twig Vorlagenknoten - Artikel - pdf.html.twig (Artikel durch Maschinennamen Ihres Inhaltstyps ersetzen)
  3. Aktualisieren Sie your_theme.info.yml und your_theme.libraries.yml wie in Entity Print in Drupal 8 vorgeschlagen, damit Sie das Thema steuern und eine CSS-Datei nur zum Drucken zuweisen können
  4. Kopieren Sie die Datei entity-print.html.twig und fügen Sie sie Ihrem Unterthema hinzu
  5. Mit node - article - pdf.html.twig können Sie jede benötigte Variable steuern. Ich empfehle jedoch, zuerst den Ansichtsmodus PDF] zu verwenden, um zu sehen, was er für Sie tun kann.

Ich habe noch keine Vorverarbeitungsfunktion verwendet, und Sie sollten diese nur benötigen, wenn Sie zusätzliche Verarbeitung benötigen. Mit den Ansichtsmodellen PDF), entity-print.html.twig und den Vorlagen node-article-pdf.html.twig können Sie nach Bedarf drucken.

Letztendlich sollten Sie den Ansichtsmodus PDF) verwenden, damit Sie den Ansichtsmodus PDF) verwalten können (Klassen, Divs, Reihenfolge, Felder hinzufügen/ausblenden/entfernen, usw.) über die Benutzeroberfläche. Ich habe festgestellt, dass das Verwalten, welche Felder durch Code angezeigt werden, umständlich sein kann, wenn Sie viel haben. Der Ansichtsmodus kann viel von dem verarbeiten, was Sie benötigen, aber Sie müssen zuerst den PDf-Ansichtsmodus aktivieren.

Beispiel für 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>

Beispielknoten - Artikel - pdf.html.twig:

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

Wenn Sie eine Vorverarbeitungsfunktion schreiben, lautet der korrekte Name der Funktion THEMENAME_preprocess_entity_print(); Ersetzen Sie THEMENAME durch den Computernamen des Themas, das es implementiert. Wenn dies der Fall ist, was in der Vorverarbeitungsfunktion, die Sie als $vars['field_name'] Festgelegt haben, wobei $vars Das Array ist, das als Referenz auf die Vorverarbeitungsfunktion übergeben wird, ist es als {{ field_name }} In zugänglich die Twig Vorlagendatei. Siehe zum Beispiel template_preprocess_node() und node.html.twig : Wie die Funktion eingestellt ist $variables['node'] Ist als {{ node }} In der Vorlagendatei verfügbar.

Stellen Sie sicher, dass Sie den richtigen Dateinamen für die Vorlage verwenden.

2
kiamlaluno

Ich denke, dies ist das Problem. Sie versuchen nur, den Knoten von der Route abzurufen. Sie befinden sich nicht auf einer Knotenroute, sondern auf einer entity_print-Route, sodass der Knoten nicht verfügbar ist.

Als Randnotiz sollten Sie immer überprüfen, ob das Feld vorhanden ist, bevor Sie versuchen, den Wert abzurufen. Bevor Sie so etwas versuchen:

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

Sie sollten so etwas tun:

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

Aber in diesem Fall würde dies den Fehler wahrscheinlich nicht einmal verhindern, da $ node (oder $ entity) hier nicht einmal ausgefüllt ist.

Für die Vorverarbeitungsfunktionen von entity_print habe ich im Grunde genommen die Zeichenfolgen-URL analysiert. Ihr Druckpfad lautet etwa/print/pdf/{entity_type}/{entity_id} und enthält alle benötigten Informationen.

/**
 * 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;
    }
  }
}

Jetzt können Sie auf 'field_name' in Ihrer twig-Datei nur mit {{field_name}} zugreifen, aber überprüfen Sie erneut, ob es ausgefüllt ist, bevor Sie versuchen zu drucken, oder Sie könnten einen anderen Fehler erhalten.

entity-print.html.twig

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

Dies setzt natürlich voraus, dass 'Feldname' ein Einzelwertfeld ist, keine Entitätsreferenz oder eine andere Art von komplexem Feld.

1
scottsawyer