我正在 Symfony2 中开发一个项目,我有几小段 html 需要包含在我的主要视图之一中。根据 Twig 官方文档,我应该能够简单地使用
{% include 'filename.html' %}
,但在 Symfony 中,除非文件名以“.html.twig”结尾,否则它会抛出错误并提示找不到该文件。我想避免对这些文件使用 Twig 模板,因为它们没有动态内容和大量双括号(它们是 javascript 模板),并且要求模板设计者必须将这些文件中的每一个都包装在 {% raw %}
标签中就像一种真正的 Kludgey 方式来做到这一点。
我也遇到了同样的问题,试图找到一种解决方案,将文件(胡子模板)作为原始文件包含在 Twig 模板中,这样 Twig 就不会尝试解析它们。
起初,我的胡子模板文件简单命名为 sometemplate.html 并包含在
{% raw %}
标签中。这工作了一段时间,但后来我开始使用 PhpStorm IDE 和 Handlebars 插件(用于 Mustache 语法)。为了让 PhpStorm 将文件识别为 Mustache 语法,它们需要具有唯一的文件扩展名(默认为 .mustache
),因此我将 sometemplate.html 重命名为 sometemplate.mustache,但我真的不喜欢我的 Mustache 模板需要是用 Twig 标签包裹。所以我最终按照@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 宏来简化将胡子模板包含到 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 模板中导入胡子模板文件。
我希望这对正在寻找相同问题解决方案的人有所帮助。
快速回顾一下 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') }}
2015年更新twig从此添加了源功能:
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
在下面的选项 4 的评论中向@Nigel Angel 表示敬意。
我看到这篇文章,因为我有类似的问题。经过一个小时左右的搜索和尝试,我发现,从 Twig Version 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”。