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

gr8qqesn  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(116)

我在Symfony 2的一个项目上工作,我有几个小的html片段需要包含在我的一个主视图中。根据Twig的官方文档,我应该能够简单地使用{% include 'filename.html' %},但在Symfony中,除非文件名以“.html. tig”结尾。它抛出错误,说它找不到文件。我想避免使用这些文件的Twig模板,因为它们没有动态内容和大量的双括号(它们是JavaScript模板),要求模板设计者必须将这些文件中的每一个都 Package 在{% raw %}标记中,这似乎是一种非常笨拙的方法。

7gs2gvoe

7gs2gvoe1#

我也遇到了同样的问题,试图找到一个解决方案,包括文件(胡子模板)作为原始的Twig模板,使Twig不试图解析他们。
一开始,我的mustache模板文件只是简单地命名为sometemplate.html,并 Package 在{% raw %}标签中,这样工作了一段时间,但后来我开始使用PhpStorm IDE和Handlebars插件(mustache语法)。为了让PhpStorm将文件识别为mustache语法,它们需要有一个唯一的文件扩展名(默认为.mustache),所以我将我的sometemplate.html重命名为sometemplate.mustache,但我真的不喜欢我的mustache模板需要用Twig标签 Package 的想法。rdjs在他的选项3中说,这是最好的解决方案。
下面是我做的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)));

有了这一点,你可以很容易地包括文件作为“原始”,而不需要Twig解析它们,方法是:

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

我甚至做了一个Twig宏来简化包括mustache模板到HTML头部部分:

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

将上述宏导入到Twig模板(例如{% import "macros.twig" %})后,您可以轻松地在Twig模板中导入mustache模板文件,只需在HTML <head>部分中执行{{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }}即可。
我希望这能帮助那些正在寻找解决同样问题的方法的人。

ccgok5k5

ccgok5k52#

快速回顾一下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

默认情况下,任何Symfony 2模板都可以用Twig或PHP编写,扩展名的最后一部分(例如.twig或.php)指定应该使用这两个引擎中的哪一个。扩展名的第一部分(例如.html、.css等)是模板将生成的最终格式。
因此,对我来说,包含一个文件作为.html至少是不明确的,即使它没有抛出错误。
所以你有三个选择:
1.如果这些文件是纯JavaScript的,那么就把它们作为脚本标签包含在你的页面中。
1.如果它们是HTML和JS的混合,那么用{% raw %}转义JS,并将文件包含为foo.html.twig模板。如果有很多这样的脚本,那么你的设计师很可能会做一些重构,并将大部分脚本移动到外部文件中(参见选项1)。
1.如果你真的坚持,你可以写一个Twig扩展来包含原始的HTML文件。(编辑:关于这个选项的更多细节,请参阅下面@Haprog的回答)。
关于我们_联系我们
1.UPDATE 2015wig已经添加了源函数:
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
感谢@奈杰尔安吉尔在下面的评论中对选项4的支持。

brjng4g3

brjng4g33#

我来到这篇文章,因为我有一个类似的问题.经过一个小时左右的搜索和尝试,我发现,从Twig Version 1.15 the "source Function" was added .
也许这对将来的人有帮助。

pcww981p

pcww981p4#

跟进卡莉,如果你在延期...你可以这样申请。

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

这是一个$this->twig_include_raw类型的方法。你可以在你的模板中包含:

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

不需要“|raw”。

相关问题