如何动态修改sonata_type_collection的子表单?

时间:2015-10-20 22:48:35

标签: php symfony doctrine sonata-admin sonata

我在一个Sonata Admin类中定义的表单中有一个'sonata_type_collection'字段。我需要根据孩子的位置修改该表格的孩子。 在我的特定情况下,集合中的每一行都有一个“删除”复选框,我想仅为集合的第一个元素禁用该复选框。 知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

我找到的唯一方法是覆盖form_admin_fields.html.twig并添加自己的块。

您可以通过修改相关配置文件来覆盖模板:https://sonata-project.org/bundles/doctrine-orm-admin/2-2/doc/reference/configuration.html#full-configuration-options 或使用SonataEasyExtendsBundle扩展SonataDoctrineOrmBundle。

您必须为您的集合创建2个块,为关系类型创建一个块(OneToMany或ManyToMany)。

令人讨厌的部分是查找您的块的名称,它由您的管理服务名称+字段名称+' sonata_type_collection_widget'形成。

这取决于您的Sonata版本,但这里是我使用的集合块示例:

{% block sonata_admin_challenge_organizers_sonata_type_collection_widget %}
    {% if sonata_admin.field_description.mappingtype == constant('Doctrine\\ORM\\Mapping\\ClassMetadataInfo::ONE_TO_MANY') %}
        {{ block('sonata_admin_challenge_organizers_orm_one_to_many_widget') }}
    {% elseif sonata_admin.field_description.mappingtype == constant('Doctrine\\ORM\\Mapping\\ClassMetadataInfo::MANY_TO_MANY') %}
        {{ block('sonata_admin_orm_many_to_many_widget') }}
    {% else %}
        INVALID MODE : {{ id }} - type : sonata_type_collection - mapping : {{ sonata_admin.field_description.mappingtype }}
    {% endif %}
{% endblock %}

完成收藏块后,您必须为oneToMany或ManyToMany添加新块,只需复制Sonata版本中使用的模板并根据需要进行自定义:https://github.com/sonata-project/SonataDoctrineORMAdminBundle/blob/master/Resources/views/CRUD/edit_orm_one_to_many.html.twig

在您的情况下,您只需添加一个基于loop.index值的if语句来显示或不显示删除字段:https://github.com/sonata-project/SonataDoctrineORMAdminBundle/blob/master/Resources/views/CRUD/edit_orm_one_to_many.html.twig#L26