我正在研究Symfony2中的一个项目,并且我有几个小部分的html需要包含在我的一个主视图中。根据官方的Twig文档,我应该可以简单地使用{% include 'filename.html' %}
,但是在Symfony中,除非文件名以“.html.twig”结尾,否则会引发错误并指出找不到该文件。我想避免使用Twig模板来处理这些文件,因为它们没有动态内容和大量双括号(它们是javascript模板),并且需要模板设计器必须将这些文件中的每一个都包装在{% raw %}
中真正Kludgey的方式来做到这一点。如何在Symfony2/Twig模板中包含原始HTML文件?
回答
树枝上的文件扩展名的快速回顾(从资料为准):
每个模板的名称也有指定为模板的格式和发动机两个扩展。
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种选择:
如果文件是纯粹的JavaScript然后将它们包括在您的网页脚本标记。
如果它们混合使用HTML和JS,则使用{%raw%}转义JS并将文件包含为foo.html.twig模板。如果包含大量脚本,那么很可能您的设计人员可以稍做重构,并将其大部分脚本移动到外部文件中(请参阅选项1)
如果您确实坚持始终可以写一个Twig扩展以包含原始HTML文件。 (编辑:请参阅下面的@ Haprog的答案以获取关于此选项的更多详细信息)。
{{include_html( '富/一个bar.html')}}
UPDATE此后加入2015树枝源函数:
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
荣誉给@奈杰尔天使在选项4下面的评论。
我想要做的是让胡须模板被包含在页面中供javascript使用。将它们直接放在包含'{%raw%}'标签的模板中可行,但我觉得它非常混乱,并且在有很多小模板位时会变得笨重。由于存在更多的请求,通过ajax加载模板位会不必要地降低客户端的速度。将模板放在没有实际枝条标记的枝条文件中({%raw%}除外)会让我的OCD开发人员感到厌倦,但在这种情况下,它似乎是最简单的选项。谢谢。 – wdh
twig自此添加'source'函数'{{source('AcmeSomeBundle:Default:somefile.html.twig')}}' –
是否可以使用** phtml **文件? –
我也遇到了同样的问题试图找到在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模板中。
我希望这可以帮助那些正在寻找相同问题解决方案的人。
这看起来会解决我在看的问题,但我不知道应该在哪里定义twig_include_raw函数,以及什么时候应该调用$ twig-> addFunction。你能再解释一下吗? – Craig
@克雷格对不起,我还没有回复。您可以在任何你喜欢的地方定义该功能。只要确保在使用'$ twig = new Twig_Environment($ loader)设置Twig后任何地方调用'$ twig-> addFunction()';'我通常有自己的'twigInit()'函数来处理设置Twig包括加载我使用的扩展。您可能还想阅读关于在http://twig.sensiolabs.org/doc/advanced.html – Haprog
上延伸Twig的文档页面。这非常棒。如果您在“needs_environment”之后的选项中添加“'is_safe'=> array('all')”,您可以绕过“| raw”的需求。 –
对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”。
我来到这篇文章,因为我有一个类似的问题。经过一个小时左右的搜索和尝试,我发现,从Twig Version 1.15 the "source Function" was added。
也许这对未来有帮助。
- 1. 在Jinja2模板中包含html文件
- 2. 如何将html或模板文件包含到.html文件中?
- 3. 如何在类中包含HTML模板?
- 4. 如何在模板中包含静态html文件?
- 5. 在你的二进制文件中包含模板/ html文件
- 6. 如何在html中包含html文件
- 7. 在Wordpress模板中包含PHP文件
- 8. 如何在Pug文件中插入原始HTML(不包括外部HTML文件)
- 9. androidannotations2.7.1 - AndroidManifest.xml文件包含原始组件
- 10. 原始Mako模板包含在另一个在主塔
- 11. Sprockets结合JavaScript文件时,如何包含原始文件名?
- 12. 结合pdf文件与ghostscript,如何包含原始文件名?
- 13. 如何在rails中包含html文件?
- 14. 如何在HTML中包含JavaScript文件?
- 15. 如何在div中包含html文件?
- 16. 如何将jquery模板文件作为外部模板文件在每个文件中包含多个模板?
- 17. 在html文件中包含html文件
- 18. 如何在Django中的所有模板中包含文件
- 19. Backbone.js与生态模板:如何在模板中包含模板?
- 20. r markdown生成的html文件是否包含原始数据?
- 21. 如何在Ruby文件中包含模板部分
- 22. 如何在模板文件中包含元数据?
- 23. 如何在pugjs模板中包含css文件
- 24. 如何在WordPress的php模板中包含PHP文件?
- 25. 如何在一个wordpress模板中包含一个css文件
- 26. Node.js - 如何将文件包含在vash模板中?
- 27. 如何在Django的静态文件中包含模板标签?
- 28. 如何将CSS文件包含在免费标记模板中
- 29. 如何在Joomla模板中包含PHP函数的文件
- 30. 如何在Django模板中管理Javascript文件的包含
如果官方文档说它应该工作,那么也许你应该尝试更新树枝和树枝捆绑到一个更新的版本(编辑你的树皮文件)。 – greg0ire
我试过,但我认为这个问题与Symfony如何处理模板位置/类型而不是Twig问题有关。 – wdh
然后,你应该可能提交一个错误报告。 – greg0ire