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

问题描述 投票:0回答:4

我正在 Symfony2 中开发一个项目,我有几小段 html 需要包含在我的主要视图之一中。根据 Twig 官方文档,我应该能够简单地使用

{% include 'filename.html' %}
,但在 Symfony 中,除非文件名以“.html.twig”结尾,否则它会抛出错误并提示找不到该文件。我想避免对这些文件使用 Twig 模板,因为它们没有动态内容和大量双括号(它们是 javascript 模板),并且要求模板设计者必须将这些文件中的每一个都包装在
{% raw %}
标签中就像一种真正的 Kludgey 方式来做到这一点。

templates symfony twig
4个回答
10
投票

我也遇到了同样的问题,试图找到一种解决方案,将文件(胡子模板)作为原始文件包含在 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 模板中导入胡子模板文件。

我希望这对正在寻找相同问题解决方案的人有所帮助。


8
投票

快速回顾一下 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个选择:

  1. 如果文件是纯 JavaScript,则将它们作为脚本标签包含在您的页面中。

  2. 如果它们是混合的 HTML 和 JS,则使用 {% raw %} 转义 JS 并将文件包含为 foo.html.twig 模板。如果像这样包含很多脚本,那么您的设计人员很可能可以进行一些重构,并将大部分脚本移至外部文件(请参阅选项 1)

  3. 如果您真的坚持,您可以随时编写 Twig 扩展来包含原始 HTML 文件。 (编辑:有关此选项的更多详细信息,请参阅下面@Haprog 的答案)。

    {{ include_html('foo/bar.html') }}

  4. 2015年更新twig从此添加了源功能:

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

在下面的选项 4 的评论中向@Nigel Angel 表示敬意。


6
投票

我看到这篇文章,因为我有类似的问题。经过一个小时左右的搜索和尝试,我发现,从 Twig Version 1.15 开始,添加了“源函数”

也许这对将来的人有帮助。


3
投票

跟进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”。

© www.soinside.com 2019 - 2024. All rights reserved.