Incluir una plantilla parcial

19

Estoy tratando de usar Drupal 8, con un tema personalizado, debido a las grandes diferencias de estructura para mis requisitos. Tengo una página: front.twig.html y page.twig.html, me gustaría crear partes de plantilla tal como se usan en phrozn oder en un proyecto Symfony2 normal, por ejemplo, footer.html.twig y header.html.twig. Estas plantillas se guardan en un subdirectorio / parts /.

Pero cuando llamo a estas plantillas normalmente, recibo una cadena con el nombre de la plantilla.

Por ejemplo:

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

Devuelve el nombre del archivo como cadena:

parts/footer.html.twig

¿Es posible hacer eso con Drupal 8?

felipep
fuente

Respuestas:

33

No puede hacer rutas relativas, todas las rutas deben ser desde la raíz de Drupal o basadas en la ruta de espacio de nombres a su directorio de 'plantillas': https://www.drupal.org/node/2143557 .

Evitaría "desde la raíz de Drupal" y usaría espacios de nombres, al menos hasta que se resuelva https://www.drupal.org/node/2291449 .

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

Editar: si desea pasar argumentos adicionales para loop o para verificar algunos vars a su twigplantilla incluida , debe escribir de esta manera:

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

Editar: ahora que https://www.drupal.org/node/2291449 se ha comprometido, también puede hacer:

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

Consulte https://www.drupal.org/node/2369981 para ver por qué vio el nombre del archivo como una cadena en lugar de una excepción útil.

Cottser
fuente
¿Qué pasa includey pasar valores? Supongamos que me gustaría incluir image-formattery pasar el urlvalor nulo para evitar crear imágenes vinculadas.
SaidbakR
Los ejemplos proporcionados en esta respuesta no parecen funcionar.
arnoldbird
3
Tenga en cuenta que se @mythemeresuelve en la ruta de mytheme+ la cadena /templates. En otras palabras, se @mythemeresuelve en el mytheme/templatesdirectorio.
daniels
Para aclarar aún más el comentario de @daniels. Si su tema personalizado se llama mytheme y está ubicado en 'themes / custom / mytheme' , el espacio de nombres de Twig se @mythemeresuelve en 'themes / custom / mytheme / templates' . La inclusión de una plantilla ubicada en @mytheme/fragments/footer.html.twigsignifica que se resolverá en 'themes / custom / mytheme / templates / fragments / footer.html.twig'
ec0g
15

Utilice una ruta completa al directorio del tema. Si usa el espacio de nombres, tendrá que cambiarlo si lleva el código a otro sitio o tema.

Esto debería funcionar:

{% include directory ~ '/templates/parts/footer.html.twig' %}
André
fuente
Esto es muy útil cuando se hace un subtema. Establezca esto en su tema principal y luego tenga una versión en el directorio de plantillas del tema secundario.
Andrew Killen
Esta es la única respuesta que funcionó para mí.
arnoldbird
5

También es posible utilizar el uso de una matriz por parte de Twig para crear una reserva cuando el archivo no existe.

P.ej. Si footer.html.twig no está disponible, se usará defaultfooter.html.twig.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Combine esto con el uso de variables en los nombres de archivo y puede incluir diferentes archivos dependiendo de algún tipo de contexto.

Nota: Todavía estoy tratando de determinar si esta es la mejor práctica o no.

granticusiv
fuente
5

Tenga en cuenta que puede pasar variables después de la withpalabra clave:

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

Consulte la documentación de Twig http://twig.sensiolabs.org/doc/tags/include.html

Rafael Larrinaga
fuente
1

Para Drupal 8

La inclusión de un archivo de ramita en el tema cuando hace un {% include 'FILE_NAME.html.twig' %}Drupal espera que su ARCHIVO se encuentre en su Directorio de temas actual. Solo póngalo allí y funcionará.

Incluyendo un archivo de ramita en su Módulo

Si desea agregarlo en un MÓDULO, debe declararlo en la Función TEMA. En su archivo .module simplemente agregue lo siguiente:

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

Luego, coloque su archivo Twig en YOUR_MODULE / template / FILE_NAME.html.twig

Karim Rachadi
fuente
Es información incorrecta sobre la ruta. Para incluir el archivo del módulo con el enlace de tema, necesita otra forma: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} No olvide que los archivos de plantillas deben estar en 'yourModuleName / templates /'.
Verter