如何使Twig模板包含在同一个包中的文件?

时间:2016-02-29 21:44:12

标签: symfony twig

我对Symfony来说比较新。我有一个带有twig模板的bundle,它们在目录结构中自动加载了注释,如:

src/bundle/Resources/views/Default/

我的一个模板有很多次重复的代码(每个实例都有一些细微的更改),我认为这样做include几次格式化如下:

{% include 'form_include.html' with {'foo': 'bar'} %}

每个实例的不同变量应该可以正常工作。但调试器告诉我它正在寻找

中的包含文件
/app/Resources/

但是模板真的特定于这个包,我不希望它保存在其他地方。我尝试使用../../src....方法指定其位置而没有运气。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:8)

您可以使用捆绑包的名称提供路径:

{% include 'YourBundleNameBundle:Default:form_include.html.twig' with {
    'foo': bar
} %}

每个部分由:

分隔
  • YourBundleNameBundle对应src/YourBundleNameBundle/Resources/views/
  • Default对应于此文件夹中的/Default目录
  • form_include.html.twig对应此文件夹中的form_include.html.twig

因此,'YourBundleNameBundle:Default:form_include.html.twig'值将加载src/bundle/Resources/views/Default/form_include.html.twig文件。

此语法适用于不同的Twig函数:includeextends等。

允许templates inheritance

非常有用

答案 1 :(得分:2)

您是否考虑过使用宏?

来自:http://twig.sensiolabs.org/doc/tags/macro.html

  

宏与常规编程语言中的函数相当。它们对于将经常使用的HTML习语放入可重用的元素中是有用的,不会重复自己。

     

以下是呈现表单元素的宏的一个小示例:

{% macro input(name, value, type, size) %}
  <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
     

宏在几个方面与本机PHP函数不同:

     

默认参数值是使用宏体中的默认过滤器定义的;   宏的参数始终是可选的。   如果将额外的位置参数传递给宏,它们最终会在特殊的varargs变量中作为值列表。   但与PHP函数一样,宏无法访问当前模板变量。

     

您可以使用特殊的_context变量将整个上下文作为参数传递。

     

宏可以在任何模板中定义,并且需要&#34;导入&#34;在使用之前(有关更多信息,请参阅导入标记的文档):

{% import "forms.html" as forms %}
     

上述导入调用会导入&#34; forms.html&#34;文件(只能包含宏,模板和一些宏),并将函数作为表单变量的项目导入。

     

然后可以随意调用宏:

<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>
     

如果在同一模板中定义和使用宏,则可以使用特殊的_self变量导入它们:

{% import _self as forms %}

<p>{{ forms.input('username') }}</p>
     

当您在模板中定义要使用它的宏时,您可能想要通过_self.input()直接调用宏而不是导入它;即使看起来有效,这只是当前实现的副作用,它在Twig 2.x中不再有用。

     

如果要在同一文件中的另一个宏中使用宏,则需要在本地导入它:

{% macro input(name, value, type, size) %}
  <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}

{% macro wrapped_input(name, value, type, size) %}
  {% import _self as forms %}

  <div class="field">
     {{ forms.input(name, value, type, size) }}
  </div>
{% endmacro %}