Inclure un modèle partiel

19

J'essaie d'utiliser Drupal 8, avec un thème personnalisé, en raison de grandes différences de structure pour mes besoins J'ai une page - front.twig.html et une page.twig.html, je voudrais créer des parties de modèle comme utilisé dans phrozn oder dans un projet Symfony2 normal, par exemple un footer.html.twig et un header.html.twig. Ces modèles sont enregistrés dans un sous-répertoire / parts /.

Mais quand j'appelle ces modèles comme d'habitude, je reçois juste une chaîne avec le nom du modèle.

Par exemple:

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

Renvoie le nom du fichier sous forme de chaîne:

parts/footer.html.twig

Est-il possible de le faire avec Drupal 8?

felipep
la source

Réponses:

33

Vous ne pouvez pas faire de chemins relatifs, tous les chemins doivent provenir de la racine Drupal ou être basés sur le chemin de l'espace de noms vers votre répertoire 'templates': https://www.drupal.org/node/2143557 .

J'éviterais «de la racine Drupal» et utiliserais des espaces de noms, au moins jusqu'à ce que https://www.drupal.org/node/2291449 soit résolu.

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

Edit: Si vous voulez passer des arguments supplémentaires pour la boucle ou pour vérifier quelques vars dans votre twigmodèle inclus , vous devez écrire de cette façon:

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

Edit: Maintenant que https://www.drupal.org/node/2291449 a été validé, vous pouvez également faire:

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

Voir https://www.drupal.org/node/2369981 pour savoir pourquoi vous avez vu le nom de fichier sous forme de chaîne au lieu d'une exception utile.

Cottser
la source
Qu'en est- includeil de la transmission de valeurs? Supposons que je souhaite inclure image-formatteret passer le urlnull pour éviter de créer une image liée.
SaidbakR
Les exemples fournis dans cette réponse ne semblent pas fonctionner.
arnoldbird
3
Sachez que cela @mythemerésout le chemin de mytheme+ la chaîne /templates. En d'autres termes, @mythemerésout le mytheme/templatesrépertoire.
daniels
Pour clarifier davantage le commentaire de @daniels. Si votre thème personnalisé est nommé mythème et se trouve dans «thèmes / personnalisé / mythème», l'espace de noms Twig se @mythemerésout en «thèmes / personnalisé / mythème / modèles» . Inclure un modèle situé à @mytheme/fragments/footer.html.twigsignifie qu'il se résoudra en 'thèmes / personnalisé / mythème / modèles / fragments / footer.html.twig'
ec0g
15

Utilisez un chemin d'accès complet au répertoire du thème. Si vous utilisez l'espace de noms, vous devrez le changer si vous apportez le code à un autre site ou thème.

Cela devrait fonctionner:

{% include directory ~ '/templates/parts/footer.html.twig' %}
André
la source
c'est très pratique lors de la sous-thématisation. Définissez cela dans votre thème parent, puis ayez une version dans le répertoire de modèles du thème enfant.
Andrew Killen
C'est la seule réponse qui a fonctionné pour moi.
arnoldbird
5

Il est également possible d'utiliser l'utilisation d'un tableau par Twig pour créer un repli lorsque le fichier n'existe pas.

Par exemple. Si footer.html.twig n'est pas disponible, defaultfooter.html.twig serait utilisé.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Combinez cela avec l'utilisation de variables dans les noms de fichiers et vous pouvez inclure différents fichiers en fonction d'une sorte de contexte.

Nb: J'essaie toujours de déterminer si c'est la meilleure pratique ou non.

granticusiv
la source
5

Notez que vous pouvez transmettre des variables après le withmot clé:

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

Voir la documentation Twig http://twig.sensiolabs.org/doc/tags/include.html

Raphael Larrinaga
la source
1

Pour Drupal 8

Inclure un fichier de brindilles dans le thème lorsque vous effectuez un {% include 'FILE_NAME.html.twig' %}Drupal s'attend à ce que votre FICHIER se trouve dans votre répertoire de thèmes actuel. Il suffit de le mettre là et ça va fonctionner.

Inclure un fichier de brindille dans votre module

Si vous souhaitez l'ajouter dans un MODULE, vous devez le déclarer dans la fonction THEME. Dans votre fichier .module, ajoutez simplement ce qui suit:

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

Ensuite, placez votre fichier Twig dans YOUR_MODULE / template / FILE_NAME.html.twig

Karim Rachadi
la source
Ce sont des informations erronées sur le chemin. Pour inclure le fichier du module avec le hook de thème, vous avez besoin d'une autre méthode: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} N'oubliez pas, que les fichiers de modèles doivent être dans 'yourModuleName / templates /'.
Verter