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

时间:2011-10-05 16:33:57

标签: templates symfony twig

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

4 个答案:

答案 0 :(得分: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)));

有了这个,您可以轻松地将文件包含为“原始”,而无需通过以下方式解析它们:

{{ include_raw('sometemplate.mustache')|raw }}

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

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

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

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

答案 1 :(得分: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
  

默认情况下,任何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. 更新2015 twig已经添加了源函数:

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

    在下面的选项4的评论中向@Nigel Angel致敬。

答案 2 :(得分:5)

我遇到了这个帖子,因为我有类似的问题。经过一个小时左右的搜索和尝试,我发现,从Twig Version 1.15 the "source Function" was added开始。

也许这有助于将来。

答案 3 :(得分:4)

跟进Kari,如果你在扩展中......你可以这样申请。

public function getFunctions() {
    return [
        'include_raw' =>  new \Twig_Function_Method($this, 'twig_include_raw', array('needs_environment'=> true, 'is_safe'=> array('all')))
    ];
}

那就是$ this-&gt; twig_include_raw类型方法。您将在模板中包含:

{{ include_raw("my/file/here.html.twig") }}

不需要“| raw”。