Incluir um modelo parcial

19

Estou tentando usar o Drupal 8, com um tema personalizado, devido a grandes diferenças de estrutura para os meus requisitos. Tenho uma página - front.twig.html e uma página.twig.html, gostaria de criar partes do modelo, conforme usado em phrozn oder em um projeto normal do Symfony2, por exemplo, footer.html.twig e header.html.twig. Esses modelos são salvos em um subdiretório / parts /.

Mas quando chamo esses modelos normalmente, recebo apenas uma string com o nome do modelo.

Por exemplo:

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

Retorna o nome do arquivo como string:

parts/footer.html.twig

É possível fazer isso com o Drupal 8?

felipep
fonte

Respostas:

33

Você não pode fazer caminhos relativos; todos os caminhos devem ser da raiz do Drupal ou baseados no caminho do namespace do diretório 'templates': https://www.drupal.org/node/2143557 .

Eu evitaria "da raiz do Drupal" e usaria os namespaces, pelo menos até https://www.drupal.org/node/2291449 ser resolvido.

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

Edit: Se você deseja passar argumentos adicionais para loop ou verificar alguns vars no seu twigmodelo incluído, você deve escrever desta maneira:

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

Edit: Agora que https://www.drupal.org/node/2291449 foi confirmado, você também pode:

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

Consulte https://www.drupal.org/node/2369981 para saber por que você viu o nome do arquivo como uma sequência em vez de uma exceção útil.

Cottser
fonte
O que dizer includee passar valores? Suponha que eu gostaria de incluir image-formattere passar o urlnulo para evitar criar imagens vinculadas.
precisa saber é o seguinte
Os exemplos fornecidos nesta resposta não parecem funcionar.
precisa saber é o seguinte
3
Esteja ciente de que @mythemeresolve o caminho da mytheme+ string /templates. Em outras palavras, @mythemeresolve para o mytheme/templatesdiretório
Daniels
Para esclarecer melhor o comentário de @daniels. Se o seu tema personalizado tiver o nome de mytheme e estiver localizado em 'themes / custom / mytheme' , o namespace do Twig será @mythemeresolvido para 'themes / custom / mytheme / templates' . Incluindo um modelo localizado no @mytheme/fragments/footer.html.twigmeio que vai resolver a 'themes / custom / mytheme / templates / fragmentos / footer.html.twig'
ec0g
15

Use um caminho completo para o diretório do tema. Se você usar o espaço para nome, precisará alterá-lo se trouxer o código para outro site ou tema.

Isso deve funcionar:

{% include directory ~ '/templates/parts/footer.html.twig' %}
André
fonte
isso é muito útil ao fazer sub-temas. Defina isso no seu tema Pai e, em seguida, tenha uma versão no diretório de modelos do tema filho.
Andrew Killen
Esta é a única resposta que funcionou para mim.
Arnoldbird
5

Também é possível usar o uso de um array pelo Twig para criar um fallback quando o arquivo não existe.

Por exemplo. Se footer.html.twig não estiver disponível, defaultfooter.html.twig seria usado.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Combine isso com o uso de variáveis ​​nos nomes de arquivos e você pode incluir arquivos diferentes, dependendo de algum tipo de contexto.

Nota: ainda estou tentando descobrir se essa é a melhor prática ou não.

granticusiv
fonte
5

Observe que você pode passar variáveis ​​após a withpalavra-chave:

{# 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 a documentação do Twig http://twig.sensiolabs.org/doc/tags/include.html

Raphael Larrinaga
fonte
1

Para Drupal 8

A inclusão de um arquivo galho no tema quando você faz um {% include 'FILE_NAME.html.twig' %}Drupal espera que seu ARQUIVO esteja localizado no seu Diretório de Temas atual. Basta colocá-lo lá e vai funcionar.

Incluindo um arquivo galho no seu módulo

Se você quiser adicioná-lo em um MÓDULO, precisará declará-lo na Função TEMA. No seu arquivo .module, adicione o seguinte:

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

Em seguida, coloque seu arquivo Twig em YOUR_MODULE / template / FILE_NAME.html.twig

Karim Rachadi
fonte
É uma informação errada sobre o caminho. Para incluir arquivo do módulo com gancho de tema, você precisa de outra maneira: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} Não esqueça que os arquivos de modelos devem esteja em 'yourModuleName / templates /'.
Verter 11/07