如何动态修改child形式的sonata_type_collection?

How to dynamically modify child form of sonata_type_collection?

我在 Sonata Admin class 中定义的表单中有一个字段 'sonata_type_collection'。我需要根据child的位置修改那个表格的children。 在我的特定情况下,集合中的每一行都有一个 'Delete' 复选框,我只想为集合的第一个元素禁用该复选框。 知道如何实现吗?

我发现的唯一方法是覆盖 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'.

组成

这取决于您的奏鸣曲版本,但这是我使用的一个收集块示例:

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