Symfony ChoiceType深标签定制

时间:2019-01-08 21:08:59

标签: symfony

我想高度自定义EntityType的选择标签,例如创建具有模型的多个属性的表。

所以我想访问我的选择类属性。这些选择是我的MyClass类到EntityType类的实体。如何在树枝上这样做?

目前我是这样的:

1。在我的FormClass中json_encode我在标签中需要的所有字段

2。。在我的模板中,json_decode这些信息并按照

显示

输入代码:

1。

$builder
    ->add('field', EntityType::class, [
        'class' => MyClass::class,
        'multiple' => false,
        'expanded' => true,
        ],
        'choice_label' => function (MyClass $myClass) {
            $data = [
                'name' => $myClass->getName(),
                'description' => $myClass->getDescription(),
            ];

            return json_encode($data);
        },
    ])

2。

{% block my_form_widget %}
    ...
    {# form is my 'field' FormView of the EntityType #}

    {% for child in form %}
        {# child is a FormView, one choice of my EntityType #}
        {# child.vars.data is boolean as its a checkbox #}

        {% set data = child.vars.label|json_decode %}
        create some complex html here, like tables
        ...
    {% endfor %}
...
{% endblock %}

工作。但是有更好的方法吗?

谢谢, 金

2 个答案:

答案 0 :(得分:0)

在映射到实体的Symfony表单(或表单字段,仅是其自身的表单)中,您始终可以访问form.vars.data中的基础数据。因此,在这种情况下,form.vars.data将是nullMyClass的实例。

为便于在模板中使用,您可以执行以下操作:

{% set my_object = form.field.vars.data %}
{% if my_object %}
    {{ my_object.getName() }}
    {{ my_object.getDescription() }}
{% endif %}

因此,无需重新编码视图层的实体数据,因为它始终已经可用。

如果您正在使用EntityType,并且想要访问每个选择实体的属性,则它们也可以在choices数组中使用:

{% for choice in form.field.vars.choices %}
    {{ choice.data.getName() }}
    {{ choice.data.getDescription() }}
{% endfor %}

当您尝试访问任何表单数据并且不确定要查找的位置时,一个不错的技巧就是在模板中临时添加一行:

{{ dump(form.field) }}

这将使您浏览可用数据并查看所有可用数据。请注意,它要求启用Twig调试扩展,并在PHP中启用XDebug,以使输出看起来不错。

答案 1 :(得分:0)

好吧,这是一个如何在树枝中访问EntityType选择的数据的示例。您可以检查child.parent.vars.choices列表。

{% block my_form_widget %}
    ...
    {# form is my 'field' FormView of the EntityType #}

    {% for child in form %}
        {# child is a FormView, one choice of my EntityType #}
        {# child.vars.data is boolean as its a checkbox #}

        {% for choice in child.parent.vars.choices if choice.value == child.vars.value %}

            {{ choice.data.name }} {# contains MyClass name #}
            {{ choice.data.description }} {# contains MyClass description #} 

        {% endfor %}
        ...
    {% endfor %}
...
{% endblock %}