Symfony和Twig:模板中的条件

时间:2016-05-09 21:41:42

标签: php templates twig symfony

我有两个我自己创建的软件包:一个用于生成管理部分(AdminBundle),另一个用于创建帐单(BillingBundle)。 BillingBundle基本上有2个实体:ClientBill(1:m)。

如果我在管理员处安装了两个捆绑包以生成ClientBill的新/编辑表单和列表,我会在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表单中,不适用于新的ClientProject表单?

你可以想象,现在我在form.html.twig

中有这个
{{ form(form) }}
<script src="/bundles/ziiwebbilling/js/accounting.js" type="text/javascript"></script>

但我<{>> 需要accounting.js form.html.twigProjects或新Clients表单。

注意:抱歉,如果我对我的解释扩展太多,但我不知道如何以另一种方式解释它。即使问题的标题很糟糕,如果你找到更好的东西,请编辑它。

编辑:正如我刚刚在jkucharovic的第一条评论中写的那样,我真正想要解决的问题是非侵入式方式,即:我不想在accounting.js模板中添加关于AdminBundle的行。或许我在寻找“太多”?

1 个答案:

答案 0 :(得分:3)

custom Twig extenstion与测试功能一起使用,如下所示:

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来制作loading application-wide

{%- 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 -%}