我正在 Symfony2 中的一个项目上工作,我有几个小片段 html 需要包含在我的一个主要视图中。根据官方的 Twig 文档,我应该可以简单地使用{% include 'filename.html' %}
,但在 Symfony 中,除非文件名以“.html.twig”结尾,否则它会抛出错误,说它找不到文件。我想避免对这些文件使用 Twig 模板,因为它们没有动态内容和大量双括号(它们是 javascript 模板),并且要求模板设计者必须将这些文件中的每一个都包装在{% raw %}
标签中似乎真的Kludgey 的方式来做到这一点。
4 回答
我也遇到了同样的问题,试图找到一种解决方案,将文件(小胡子模板)作为原始文件包含在 Twig 模板中,这样 Twig 就不会尝试解析它们。
起初,我将我的小胡子模板文件命名为 sometemplate.html 并包含在{% raw %}
标签中。这工作了一段时间,但后来我开始使用带有 Handlebars 插件的 PhpStorm IDE(用于 mustache 语法)。为了让 PhpStorm 将文件识别为 mustache 语法,它们需要具有唯一的文件扩展名(.mustache
默认情况下),所以我将我的 sometemplate.html 重命名为 sometemplate.mustache 但我真的不喜欢我的 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)));
有了这个,您可以轻松地将文件包含为“原始”,而无需 Twig 通过执行以下操作来解析它们:
{{ 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" %}
例如),您只需{{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }}
在 HTML<head>
部分中执行操作即可轻松地将 mustache 模板文件导入 Twig 模板中。
我希望这对正在寻找相同问题的解决方案的人有所帮助。
快速回顾 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个选择:
如果文件是纯 javascript,则将它们作为脚本标签包含在您的页面中。
如果它们是混合的 HTML 和 JS,则使用 {% raw %} 转义 JS 并将文件包含为 foo.html.twig 模板。如果有很多像这样包含的脚本,那么您的设计人员很可能会进行一些重构并将大部分脚本移动到外部文件中(请参阅选项 1)
如果你真的坚持,你总是可以编写一个 Twig 扩展来包含原始 HTML 文件。(编辑:有关此选项的更多详细信息,请参阅下面的@Haprog 答案)。
{{ include_html('foo/bar.html') }}
UPDATE 2015 twig 已经添加了源函数:
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
在下面对选项 4 的评论中向@Nigel Angel 致敬。
我遇到了这篇文章,因为我有一个类似的问题。经过一个小时左右的搜索和尝试,我发现,从Twig 版本 1.15 开始,添加了“源函数”。
也许这对将来的某人有帮助。
跟进 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”。