Fügen Sie eine Teilvorlage hinzu

19

Ich versuche, Drupal 8 mit einem benutzerdefinierten Thema zu verwenden. Aufgrund der großen Strukturunterschiede für meine Anforderungen habe ich eine Seite - front.twig.html und eine Seite.twig.html. Ich möchte Schablonenteile erstellen, wie sie in verwendet werden phrozn oder in einem normalen Symfony2-Projekt, zum Beispiel eine footer.html.twig und eine header.html.twig. Diese Vorlagen werden in einem Unterverzeichnis / parts / gespeichert.

Aber wenn ich diese Vorlagen wie gewohnt aufrufe, erhalte ich nur eine Zeichenfolge mit dem Namen der Vorlage.

Beispielsweise:

{# in page.html.twig or page--front.html.twig #}
{% include 'parts/footer.html.twig' %} 

Liefert den Dateinamen als String:

parts/footer.html.twig

Kann man das mit Drupal 8 machen?

felipep
quelle

Antworten:

33

Sie können keine relativen Pfade erstellen. Alle Pfade müssen entweder aus dem Drupal-Stammverzeichnis stammen oder auf dem Pfad mit Namespace zu Ihrem Vorlagenverzeichnis basieren: https://www.drupal.org/node/2143557 .

Ich würde "von der Drupal-Wurzel" vermeiden und Namespaces verwenden, zumindest bis https://www.drupal.org/node/2291449 aufgelöst ist.

{% include '@mytheme/parts/footer.html.twig' %}

Bearbeiten: Wenn Sie zusätzliche Argumente für die Schleife oder zum Überprüfen einiger Variablen an Ihre enthaltene twigVorlage übergeben möchten, sollten Sie folgendermaßen schreiben:

{% include '@mytheme/includes/form-block.html.twig' with {dog: true} %}

Bearbeiten: Nachdem https://www.drupal.org/node/2291449 festgeschrieben wurde, können Sie auch Folgendes tun:

{% include 'footer.html.twig' %}

Unter https://www.drupal.org/node/2369981 erfahren Sie, warum Sie den Dateinamen anstelle einer hilfreichen Ausnahme als Zeichenfolge gesehen haben.

Cottser
quelle
Was ist mit includeWerten und deren Weitergabe? Angenommen, ich möchte image-formatterdie urlNull einschließen und übergeben , um zu vermeiden, dass ein verknüpftes Bild erstellt wird.
SaidbakR
Die Beispiele in dieser Antwort scheinen nicht zu funktionieren.
Arnoldbird
3
Beachten Sie, dass @mythemein den Pfad mythemeder Zeichenfolge aufgelöst wird /templates. Mit anderen Worten, wird @mythemein das mytheme/templatesVerzeichnis aufgelöst.
Daniels
Um den Kommentar von @daniels weiter zu verdeutlichen. Wenn Ihr benutzerdefiniertes Thema mytheme heißt und sich unter 'themes / custom / mytheme' befindet, wird der Twig-Namespace @mythemein 'themes / custom / mytheme / templates' aufgelöst . Einschließlich einer Vorlage an sich @mytheme/fragments/footer.html.twigMittel , um es lösen wird ‚Themen / custom / mytheme / templates / Fragmente / footer.html.twig‘
ec0g
15

Verwenden Sie einen vollständigen Pfad zum Themenverzeichnis. Wenn Sie den Namespace verwenden, müssen Sie ihn ändern, wenn Sie den Code auf eine andere Site oder ein anderes Thema übertragen.

Das sollte funktionieren:

{% include directory ~ '/templates/parts/footer.html.twig' %}
André
quelle
Dies ist sehr praktisch, wenn Sie Unterthemen erstellen. Stellen Sie dies in Ihrem übergeordneten Thema ein und legen Sie dann eine Version im Vorlagenverzeichnis des untergeordneten Themas fest.
Andrew Killen
Dies ist die einzige Antwort, die für mich funktioniert hat.
Arnoldbird
5

Es ist auch möglich, Twigs Verwendung eines Arrays zu verwenden, um einen Fallback zu erstellen, wenn die Datei nicht vorhanden ist.

Z.B. Wenn footer.html.twig nicht verfügbar ist, wird defaultfooter.html.twig verwendet.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Kombinieren Sie dies mit der Verwendung von Variablen in den Dateinamen, und Sie können je nach Kontext unterschiedliche Dateien einfügen.

Nb: Ich versuche immer noch herauszufinden, ob dies die beste Vorgehensweise ist oder nicht.

granticusiv
quelle
5

Beachten Sie, dass Sie nach dem withSchlüsselwort Variablen übergeben können :

{# template.html will have access to the variables from the current context and the additional ones provided #}
{% include 'template.html' with {'foo': 'bar'} %}

{% set vars = {'foo': 'bar'} %}
{% include 'template.html' with vars %}

Siehe Twig-Dokumentation http://twig.sensiolabs.org/doc/tags/include.html

Raphael Larrinaga
quelle
1

Für Drupal 8

Das Einschließen einer Zweigdatei in das Thema, wenn Sie einen {% include 'FILE_NAME.html.twig' %}Drupal ausführen, erwartet, dass sich Ihre DATEI in Ihrem aktuellen Themenverzeichnis befindet. Legen Sie es einfach dort und es wird funktionieren.

Einfügen einer Zweigdatei in Ihr Modul

Wenn Sie es einem MODUL hinzufügen möchten, müssen Sie es in der THEME-Funktion deklarieren. Fügen Sie in Ihrer .module-Datei einfach Folgendes hinzu:

<?php function YOUR_MODULE_NAME_theme($existing, $type, $theme, $path) {   
   'FILE_NAME' => [
      'variables' => [
      ],
      'template' => 'FILE_NAME',
    ], ?>

Legen Sie dann Ihre Twig-Datei in YOUR_MODULE / template / FILE_NAME.html.twig ab

Karim Rachadi
quelle
Es sind falsche Angaben zum Pfad. Um eine Datei aus einem Modul mit Theme-Hook einzuschließen, benötigen Sie einen anderen Weg: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})} Vergessen Sie nicht, dass Vorlagendateien müssen befinden sich in 'yourModuleName / templates /'.
Verter