我自己创建了两个捆绑包:一个用于生成管理部分(AdminBundle
(,另一个用于创建账单(BillingBundle
(。 BillingBundle
基本上有 2 个实体:Client
和 Bill
(1:m(。
如果我安装这两个捆绑包以生成新的/编辑表单和列表,以便在管理员处Client
和Bill
,我会在config.yml
中包含一部分,如下所示:
my_admin_bundle:
entities:
project: #whatever entity. Project at AppBundle for example
new: true
list: true
client:
new: true
list: true
bill:
new: true
list: true
另一方面,AdminBundle
我有一个名为 form.html.twig
的模板,它呈现表单以创建新元素。基本上就是这样:
{{ form(form) }}
疑问:由于创建新表单Bills
需要一个.js
文件(accounting.js
(,如何仅将其包含在新的Bill
表单中,而不包含在新Client
或Project
表单中?
可以想象,现在我form.html.twig
有这个:
{{ form(form) }}
<script src="/bundles/ziiwebbilling/js/accounting.js" type="text/javascript"></script>
但我不需要form.html.twig
accounting.js
新的Projects
或新的Clients
形式。
注意:对不起,如果我的解释太多了,但我不知道如何用另一种方式解释它。甚至问题的标题也很糟糕,如果您找到更好的内容,请对其进行编辑。
编辑:正如我刚刚在jkucharovic的回答的第一条评论中所写的那样,我真正想要解决我的问题是一种非侵入性的方式,即:我不想在AdminBundle
模板中添加有关accounting.js
的行。或者也许我在寻找"太多"?
将自定义 Twig 扩展与测试函数一起使用,如下所示:
public function getTests()
{
return [
new 'Twig_SimpleTest('bill', function ($var) {
return $var instanceof Bill;
})
];
}
然后在模板中,您可以简单地测试表单是否适用于Bill
实体:
{{ form(form) }}
{% if form.vars.value is bill %}
<script src="/bundles/ziiwebbilling/js/accounting.js"></script>
{% endif %}
编辑:如果您出于某种原因不想修改捆绑包中的模板,您可以通过定义自己的模板并覆盖默认form block
来加载应用程序范围:
{%- block form -%}
{% if form.vars.value is bill %}
<script src="/bundles/ziiwebbilling/js/accounting.js"></script>
{% endif %}
{{ form_start(form) }}
{{- form_widget(form) -}}
{{ form_end(form) }}
{%- endblock form -%}