Dołącz częściowy szablon

19

Próbuję użyć Drupala 8 z niestandardowym motywem, ze względu na duże różnice w strukturze dla moich wymagań Mam stronę - front.twig.html i page.twig.html, chciałbym utworzyć części szablonu, jak używane w phrozn oder w normalnym projekcie Symfony2, na przykład footer.html.twig i header.html.twig. Te szablony są zapisywane w podkatalogu / części /.

Ale kiedy wywołuję te szablony jak zwykle, po prostu otrzymuję ciąg z nazwą szablonu.

Na przykład:

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

Zwraca nazwę pliku jako ciąg znaków:

parts/footer.html.twig

Można to zrobić za pomocą Drupala 8?

felipep
źródło

Odpowiedzi:

33

Nie można tworzyć ścieżek względnych, wszystkie ścieżki muszą pochodzić z katalogu głównego Drupal lub być oparte na ścieżce z nazwami do katalogu „szablonów”: https://www.drupal.org/node/2143557 .

Unikałbym „z katalogu głównego Drupala” i korzystałbym z przestrzeni nazw, przynajmniej do momentu rozwiązania https://www.drupal.org/node/2291449 .

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

Edycja: Jeśli chcesz przekazać dodatkowe argumenty dla pętli lub dla sprawdzenia niektórych zmiennych do dołączonego twigszablonu, powinieneś napisać w ten sposób:

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

Edycja: Teraz, gdy https://www.drupal.org/node/2291449 zostało zatwierdzone, możesz także:

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

Zobacz https://www.drupal.org/node/2369981, dlaczego zobaczyłeś nazwę pliku jako ciąg zamiast pomocnego wyjątku.

Cottser
źródło
Co z includeprzekazywaniem wartości? Załóżmy, że chciałbym dołączyć image-formatteri przekazać urlwartość null, aby uniknąć tworzenia połączonego obrazu.
SaidbakR
Przykłady podane w tej odpowiedzi wydają się nie działać.
arnoldbird
3
Pamiętaj, że @mythemerozwiązuje to ścieżkę mytheme+ ciągu /templates. Innymi słowy, @mythemerozwiązuje do mytheme/templateskatalogu.
Daniels,
W celu dalszego wyjaśnienia komentarza @ Daniels. Jeśli niestandardowy motyw nosi nazwę mytheme i znajduje się w „themes / custom / mytheme”, przestrzeń nazw Twig jest przekształcana@mytheme w „themes / custom / mytheme / templates” . Uwzględnienie szablonu znajdującego się w @mytheme/fragments/footer.html.twigoznacza, że ​​rozwiąże się on jako „themes / custom / mytheme / templates / fragments / footer.html.twig”
ec0g
15

Użyj pełnej ścieżki do katalogu motywów. Jeśli używasz przestrzeni nazw, musisz ją zmienić, jeśli przeniesiesz kod do innej witryny lub motywu.

To powinno działać:

{% include directory ~ '/templates/parts/footer.html.twig' %}
André
źródło
jest to bardzo przydatne podczas wykonywania pod-tematów. Ustaw to w motywie nadrzędnym, a następnie umieść wersję w katalogu szablonów motywu podrzędnego.
Andrew Killen
To jedyna odpowiedź, która zadziałała dla mnie.
arnoldbird
5

Możliwe jest również użycie tablicy przez Twiga do stworzenia rezerwy, gdy plik nie istnieje.

Na przykład. Jeśli footer.html.twig nie jest dostępny, zostanie użyta defaultfooter.html.twig.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Łącząc to z użyciem zmiennych w nazwach plików, możesz dołączyć różne pliki w zależności od pewnego rodzaju kontekstu.

Uwaga: Nadal próbuję ustalić, czy jest to najlepsza praktyka, czy nie.

granticusiv
źródło
5

Uwaga: po withsłowie kluczowym można przekazywać zmienne :

{# 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 %}

Zobacz dokumentację Twig http://twig.sensiolabs.org/doc/tags/include.html

Raphael Larrinaga
źródło
1

Dla Drupala 8

Dołączenie pliku gałązki do motywu podczas wykonywania programu {% include 'FILE_NAME.html.twig' %}Drupal oczekuje, że PLIK zostanie umieszczony w bieżącym katalogu motywów. Połóż to i zacznie działać.

Dołączanie pliku gałązki do modułu

Jeśli chcesz dodać go do MODUŁU, musisz zadeklarować go w funkcji TEMAT. W pliku .module po prostu dodaj:

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

Następnie umieść plik Twig w YOUR_MODULE / template / FILE_NAME.html.twig

Karim Rachadi
źródło
To nieprawidłowa informacja o ścieżce. Aby dołączyć plik z modułu z zaczepem kompozycji, potrzebujesz innego sposobu: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} Nie zapominaj, że pliki szablonów muszą być w 'yourModuleName / templates /'.
Verter