在 Twig 文件之间导入内容


Import content between Twig files

我怎样才能有一个 Twig 文件从同一目录或子目录中的第二个 Twig 文件导入一些内容?

我正在开发一个项目,其中多个 Twig 文件具有共同的内容,我试图避免在 Twig 文件之间复制和粘贴内容。

因此,我想拥有一个包含共享标记的子目录,并简单地"导入"到主 Twig 文件的相关部分中。

使用 import.list.html.twig 与主 Twig 文件位于同一目录中,我尝试了以下操作:

{% extends "::base.html.twig" %}
{% block title %}StockBundle:StockController:index{% endblock %}
{% block body %}
<h1>Welcome to the StockController:List page</h1>
{% for stock in stocks %}
    <div class='list'>
        <div class='each stock'>
            <span class='name'>{{ stock.name }}</span>
            <span class='desc'>{{ stock.description }}</span>
            <span class='balc'>{{ stock.balance }}</span>
            <span class='edit'>
                <a href="{{ path('stock_edit', {'id':stock.id}) }}">edit</a>
            </span>
        </div>
    </div>
{% endfor %}
{% include 'import.list.html.twig' %}
{% endblock %}

。但我收到以下错误:

Unable to find template "import.list.html.twig" in ::base.html.twig at line 10.

当你include时,它需要知道它所在的命名空间。 当你执行::时,如{% extends "::base.html.twig" %},它来自应用程序的app/Resources/views目录。

参见:模板命名和位置 Symfony 文档

如果您的import.list.html.twig在捆绑包中,则必须正确定义它。 例如,如果您在该捆绑包中有一个资源/视图目录,并且该捆绑包中有自己的base.html.twig模板,您将拥有

{% include 'StockBundle::base.html.twig' %}

例如,如果您在该捆绑包中有一个 Stock 文件夹(附加到您的 StockController)和一个import.list.html.twig模板,您将拥有

{% include 'StockBundle:Stock:import.list.html.twig' %}

请注意,通过注册的命名空间 Twig 路径,您也可以改用命名空间路径。 它们实际上也更快。 所以以上将是

{% include '@Stock/base.html.twig' %}
{% include '@Stock/Stock/import.list.html.twig' %}

这是Symfony模板最佳实践的另一个很好的参考

注意

从 Symfony 2.2 开始,您可以使用 include() 函数,这是包含模板的首选方式:

{{ include('@Stock/base.html.twig') }}
{{ include('@Stock/Stock/import.list.html.twig') }}

试试这个:

 {% include 'StockBundle:Stock:import.list.html.twig' %}

而不是:

 {% include 'import.list.html.twig' %}

http://symfony.com/doc/current/book/templating.html#including-templates