在 Twig 文件之间导入内容

Import content between Twig files

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

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

所以,我想要一个包含共享标记的子目录,并简单地 "import" 到主要 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 'StockBundle:Stock:import.list.html.twig' %}

而不是:

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

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

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

参见:Template Naming and Locations Symfony documentation

如果您的 import.list.html.twig 在捆绑包中,则必须正确定义它。例如,如果您在该捆绑包中有 StockBundle 和一个 Resources/views 目录及其自己的 base.html.twig 模板,您将有

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

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

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

通过 Registered Namespaced Twig Paths 注意,您也可以改用命名空间路径。它们实际上也更快。所以上面会是

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

这是 Symfony template best practices

的另一个很好的参考

注意

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

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