Includi un modello parziale


19

Sto cercando di utilizzare Drupal 8, con un tema personalizzato, a causa delle grandi differenze di struttura per i miei requisiti Ho una pagina - front.twig.html e una pagina.twig.html, vorrei creare parti del modello come utilizzate in phrozn oder in un normale progetto Symfony2, ad esempio footer.html.twig e header.html.twig. Questi modelli vengono salvati in una sottodirectory / parts /.

Ma quando chiamo questi modelli normalmente ricevo solo una stringa con il nome del modello.

Per esempio:

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

Restituisce il nome del file come stringa:

parts/footer.html.twig

È possibile farlo con Drupal 8?

Risposte:


33

Non puoi fare percorsi relativi, tutti i percorsi devono provenire dalla radice Drupal o basarsi sul percorso spaziato dal nome alla directory dei tuoi modelli: https://www.drupal.org/node/2143557 .

Eviterei "dalla radice di Drupal" e utilizzerei gli spazi dei nomi, almeno fino a quando https://www.drupal.org/node/2291449 sarà risolto.

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

Modifica: se si desidera passare argomenti aggiuntivi per il ciclo o per controllare alcuni parametri al twigmodello incluso, è necessario scrivere in questo modo:

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

Modifica: ora che https://www.drupal.org/node/2291449 è stato impegnato, puoi anche fare:

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

Vedi https://www.drupal.org/node/2369981 per il motivo per cui hai visto il nome del file come stringa anziché come utile eccezione.


Che dire includee il passaggio di valori? Supponiamo che vorrei includere image-formattere passare il urlnull per evitare di creare un'immagine collegata.
SaidbakR,

Gli esempi forniti in questa risposta non sembrano funzionare.
Arnoldbird,

3
Essere consapevoli del fatto che si @mythemerisolve nel percorso di mytheme+ la stringa /templates. In altre parole, si @mythemerisolve nella mytheme/templatesdirectory.
Daniels,

Per chiarire ulteriormente il commento di @daniels. Se il tuo tema personalizzato si chiama mytheme e si trova in 'themes / custom / mytheme', lo spazio dei nomi di Twig si @mythemerisolve in 'themes / custom / mytheme / templates' . Includere un modello situato in @mytheme/fragments/footer.html.twigsignifica che si risolverà in 'themes / custom / mytheme / templates / fragments / footer.html.twig'
ec0g

15

Utilizzare un percorso completo per la directory dei temi. Se usi lo spazio dei nomi dovrai cambiarlo se porti il ​​codice su un altro sito o tema.

Questo dovrebbe funzionare:

{% include directory ~ '/templates/parts/footer.html.twig' %}

questo è molto utile quando si fa un sub-tema. Impostalo nel tema Genitore, quindi disponi di una versione nella directory dei modelli del tema figlio.
Andrew Killen,

Questa è l'unica risposta che ha funzionato per me.
Arnoldbird,

5

È anche possibile utilizzare l'uso di Twig di un array per creare un fallback quando il file non esiste.

Per esempio. Se footer.html.twig non è disponibile, verrà utilizzato defaultfooter.html.twig.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Combina questo con l'uso di variabili nei nomi dei file e puoi includere diversi file a seconda di una sorta di contesto.

Nb: Sto ancora cercando di capire se questa è la migliore pratica o meno.


5

Nota che puoi passare le variabili dopo la withparola chiave:

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

Vedere la documentazione di Twig http://twig.sensiolabs.org/doc/tags/include.html



1

Per Drupal 8

Includere un file ramoscello nel tema quando fai un {% include 'FILE_NAME.html.twig' %}Drupal si aspetta che il tuo FILE si trovi nella tua Directory temi corrente. Mettilo lì e funzionerà.

Incluso un file ramoscello nel tuo modulo

Se si desidera aggiungerlo in un MODULO, è necessario dichiararlo nella funzione TEMA. Nel tuo file .module basta aggiungere quanto segue:

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

Quindi inserisci il tuo file Twig in YOUR_MODULE / template / FILE_NAME.html.twig


Sono informazioni errate sul percorso. Per includere il file dal modulo con l'hook tema, è necessario un altro modo: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} Non dimenticare che i file dei modelli devono essere in "yourModuleName / templates /".
Verter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.