如何在Symfony2/Twig模板中包含原始HTML文件?

wdh*_*wdh 10 templates symfony twig

我正在研究Symfony2中的一个项目,我有一些小的html需要包含在我的一个主要视图中.根据官方的Twig文档,我应该可以简单地使用{% include 'filename.html' %}但在Symfony中,除非文件名以".html.twig"结尾,它会抛出错误并说它无法找到该文件.我想避免对这些文件使用Twig模板,因为它们没有动态内容和许多双括号(它们是javascript模板)并且要求模板设计者必须将这些文件中的每一个都包装在{% raw %}标签中Kludgey的方式来做到这一点.

Hap*_*rog 10

我也遇到了同样的问题,试图找到一个解决方案,在Twig模板中包含原始文件(胡子模板),因此Twig不会尝试解析它们.

起初我的胡子模板文件名为sometemplate.html,并包含在{% raw %}标签中.这工作了一段时间,但后来我开始使用PhpStorm IDE和Handlebars插件(用于胡子语法).为了让PhpStorm将文件识别为小胡子语法,他们需要有一个唯一的文件扩展名(.mustache默认情况下),所以我将sometemplate.html重命名为sometemplate.mustache但我真的不喜欢我的小胡子模板需要用Twig包裹的想法标签.所以我最终做了@rdjs在他的选项3中所说的.这是最好的解决方案imo.

这是我制作的Twig扩展功能:

function twig_include_raw(Twig_Environment $env, $template) {
    return $env->getLoader()->getSource($template);
}
$twig->addFunction('include_raw', new Twig_Function_Function('twig_include_raw', array('needs_environment' => true)));
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以轻松地将文件包含为"原始"而无需Twig解析它们:

{{ include_raw('sometemplate.mustache')|raw }}
Run Code Online (Sandbox Code Playgroud)

我甚至制作了一个Twig宏来简化包括胡须模板到HTML头部分:

{% macro mustache_script(id, file) -%}
<script id="{{ id }}" type="text/x-mustache-template">
{{ include_raw(file)|raw }}
</script>
{%- endmacro %}
Run Code Online (Sandbox Code Playgroud)

在将带有上述宏的文件导入Twig模板后({% import "macros.twig" %}例如),只需{{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }}在HTML <head>部分内部进行操作,即可轻松导入Twig模板中的胡须模板文件.

我希望这可以帮助那些正在寻找解决同一问题的人.

  • 这很棒.如果在`needs_environment`之后将选项"'is_safe'=> array('all')"添加到选项中,则可以绕过"| raw"的需要. (2认同)

rdj*_*djs 8

快速回顾一下twig文件扩展名(取自文档):

每个模板名称还有两个扩展名,用于指定该模板的格式和引擎.

AcmeBlogBundle:Blog:index.html.twig - HTML format, Twig engine
AcmeBlogBundle:Blog:index.html.php - HTML format, PHP engine
AcmeBlogBundle:Blog:index.css.twig - CSS format, Twig engine
Run Code Online (Sandbox Code Playgroud)

默认情况下,任何Symfony2模板都可以用Twig或PHP编写,扩展的最后一部分(例如.twig或.php)指定应该使用这两个引擎中的哪一个.扩展的第一部分(例如.html,.css等)是模板将生成的最终格式.

因此,对我来说,包含一个.html的文件至少是模棱两可的,即使它没有抛出错误也是有道理的.

所以你有3个选择:

  1. 如果文件纯粹是javascript,那么将它们作为脚本标记包含在您的页面中.

  2. 如果它们是HTML和JS的混合,则使用{%raw%}转义JS并将文件包含为foo.html.twig模板.如果像这样包含很多脚本,那么很可能你的设计师可以做一些重构并将大部分脚本移动到外部文件(参见选项1)

  3. 如果你真的坚持,你总是可以编写一个Twig扩展来包含原始HTML文件.(编辑:有关此选项的更多详细信息,请参阅下面的@ Haprog的答案).

    {{include_html('foo/bar.html')}}

  4. UPDATE 2015 twig此后添加了源函数:

{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}

感谢@Nigel Angel在下面的选项4的评论中.

  • twig已经添加了`source`函数`{{source('AcmeSomeBundle:Default:somefile.html.twig')}}` (5认同)

Chr*_*ris 5

因为我有类似的问题,我来到这篇文章.经过一个小时左右的搜索和尝试,我发现,从Twig版本1.15开始,添加了"源功能".

也许这有助于未来的某些人.