繁体   English   中英

包括twig的非twig文件

[英]Including a non-twig file from twig

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

我试过这个没有运气:

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

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

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

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

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

设置可以在这里找到。

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

您可以尝试使用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 #}

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

问候,
马特

您可以使用树枝扩展功能解决此问题。 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM