2011-10-05 95 views
9

我正在研究Symfony2中的一个项目,并且我有几个小部分的html需要包含在我的一个主视图中。根据官方的Twig文档,我应该可以简单地使用{% include 'filename.html' %},但是在Symfony中,除非文件名以“.html.twig”结尾,否则会引发错误并指出找不到该文件。我想避免使用Twig模板来处理这些文件,因为它们没有动态内容和大量双括号(它们是javascript模板),并且需要模板设计器必须将这些文件中的每一个都包装在{% raw %}中真正Kludgey的方式来做到这一点。如何在Symfony2/Twig模板中包含原始HTML文件?

+0

如果官方文档说它应该工作,那么也许你应该尝试更新树枝和树枝捆绑到一个更新的版本(编辑你的树皮文件)。 – greg0ire

+0

我试过,但我认为这个问题与Symfony如何处理模板位置/类型而不是Twig问题有关。 – wdh

+0

然后,你应该可能提交一个错误报告。 – greg0ire

回答

7

树枝上的文件扩展名的快速回顾(从资料为准):

每个模板的名称也有指定为模板的格式和发动机两个扩展。

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的模板可以写在任何嫩枝或PHP,以及扩展的最后一部分(例如.twig或.PHP)指定这两个发动机应使用。扩展的第一部分(例如.html,.css等)是模板将生成的最终格式。

因此,对我来说,包含文件为.html的文件即使没有抛出错误也至少是含糊不清的。

所以,你有3种选择:

  1. 如果文件是纯粹的JavaScript然后将它们包括在您的网页脚本标记。

  2. 如果它们混合使用HTML和JS,则使用{%raw%}转义JS并将文件包含为foo.html.twig模板。如果包含大量脚本,那么很可能您的设计人员可以稍做重构,并将其大部分脚本移动到外部文件中(请参阅选项1)

  3. 如果您确实坚持始终可以写一个Twig扩展以包含原始HTML文件。 (编辑:请参阅下面的@ Haprog的答案以获取关于此选项的更多详细信息)。

    {{include_html( '富/一个bar.html')}}

  4. UPDATE此后加入2015树枝源函数:

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

荣誉给@奈杰尔天使在选项4下面的评论。

+1

我想要做的是让胡须模板被包含在页面中供javascript使用。将它们直接放在包含'{%raw%}'标签的模板中可行,但我觉得它非常混乱,并且在有很多小模板位时会变得笨重。由于存在更多的请求,通过ajax加载模板位会不必要地降低客户端的速度。将模板放在没有实际枝条标记的枝条文件中({%raw%}除外)会让我的OCD开发人员感到厌倦,但在这种情况下,它似乎是最简单的选项。谢谢。 – wdh

+5

twig自此添加'source'函数'{{source('AcmeSomeBundle:Default:somefile.html.twig')}}' –

+0

是否可以使用** phtml **文件? –

10

我也遇到了同样的问题试图找到在Twig模板中生成包含文件(胡须模板)的解决方案,因此Twig不会尝试解析它们。

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

这里的工作枝条扩展功能我做:把它们解析

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 }} 

我还送用于简化在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 <head>部分内执行{{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }}即可轻松将小胡子模板文件导入到Twig模板中。

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

+0

这看起来会解决我在看的问题,但我不知道应该在哪里定义twig_include_raw函数,以及什么时候应该调用$ twig-> addFunction。你能再解释一下吗? – Craig

+0

@克雷格对不起,我还没有回复。您可以在任何你喜欢的地方定义该功能。只要确保在使用'$ twig = new Twig_Environment($ loader)设置Twig后任何地方调用'$ twig-> addFunction()';'我通常有自己的'twigInit()'函数来处理设置Twig包括加载我使用的扩展。您可能还想阅读关于在http://twig.sensiolabs.org/doc/advanced.html – Haprog

+2

上延伸Twig的文档页面。这非常棒。如果您在“needs_environment”之后的选项中添加“'is_safe'=> array('all')”,您可以绕过“| raw”的需求。 –

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-> twig_include_raw类型的方法。您可以在您的模板中包含:

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

不需要“| raw”。

相关问题