包括twig的非twig文件

时间:2011-12-20 15:36:22

标签: symfony twig

我需要在Twig模板中包含文件的内容(在我的资源文件夹中)。

我试过这个没有运气:

{% include 'public/directory/file.ext' %}

这不是Twig的能力吗? (我不想使用Assetic)

4 个答案:

答案 0 :(得分:13)

  

1.15版中的新功能:在Twig 1.15中添加了源功能。   source函数返回模板的内容而不呈现它

http://twig.sensiolabs.org/doc/functions/source.html

答案 1 :(得分:3)

我刚刚为此做了一个bundle。它几乎是file_get_contents的包装器。

可以找到设置here

答案 2 :(得分:1)

如果文件不是有效的树枝模板,Twig会在加载文件时抱怨。原因是Twig将包含渲染文件而不包含它的内容(找到here)。

您可以尝试使用use语句,但我认为这也无效。

此外,您使用的语法似乎不正确。当我包含(或使用)另一个树枝模板时,我使用以下语法:

{% use "AcmeWebsiteBundle::include.html.twig" %}

文件include.html.twig位于src\Acme\WebsiteBundle\Resources\views\include.html.twig。因此,如果您的文件位于src\Acme\WebsiteBundle\Resources\public\directory\include.ext,则可以尝试

{% use "AcmeWebsiteBundle::..\public\directory\include.ext" %}

如果这不起作用,您可以将文件移动到views文件夹中。如果无法做到这一点,您可以放入app\Resources\views\并使用语法:

{% use "::include.ext" %}

如果use语句不起作用,我担心,你可以将文件直接包装到twig模板中。我正在用树枝模板化一些简单的JSON结构。因此,可能有一种方法可以将file.ext的内容包含在树枝模板中,然后再渲染它。

如果所有这些都失败了,您将必须创建一个Twig扩展,添加一个新标记(类似content),它将读取文件并在您的树枝模板中输出其内容。

{% content 'public/directory/file.ext' %} {# would put content of the file #}

希望这可以帮助您包含文件。

的问候,
马特

答案 3 :(得分:1)

您可以使用树枝扩展功能解决此问题。 (http://symfony.com/doc/current/cookbook/templating/twig_extension.html

在Bundle中为Twig扩展名创建一个php文件

<?php

namespace AppBundle\Twig;

use Twig_Extension;
use Twig_SimpleFunction;

class AppExtension extends Twig_Extension
{
  public function getFunctions()
  {
    return array(
      new Twig_SimpleFunction('fileGetContents', array($this, 'fileGetContents') ),
    );
  }

  public function fileGetContents($file)
  {
    return file_get_contents($file);
  }

  public function getName()
  {
    return 'app_extension';
  }
}
?>

将此代码添加到app / config / services.yml

app.twig_extension:
    class: AppBundle\Twig\AppExtension
    public: false
    tags:
        - { name: twig.extension }

现在,您可以将自定义函数用作树枝模板中的任何默认函数

<p>{{ fileGetContents( asset("uploads/my_text_file.txt") ) }}</p>