我对Symfony来说比较新。我有一个带有twig模板的bundle,它们在目录结构中自动加载了注释,如:
src/bundle/Resources/views/Default/
我的一个模板有很多次重复的代码(每个实例都有一些细微的更改),我认为这样做include几次格式化如下:
{% include 'form_include.html' with {'foo': 'bar'} %}
每个实例的不同变量应该可以正常工作。但调试器告诉我它正在寻找
中的包含文件/app/Resources/
但是模板真的特定于这个包,我不希望它保存在其他地方。我尝试使用../../src....
方法指定其位置而没有运气。有没有办法做到这一点?
答案 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函数:include
,extends
等。
答案 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 %}