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

Posted

技术标签:

【中文标题】如何动态修改sonata_type_collection的子形式?【英文标题】:How to dynamically modify child form of sonata_type_collection? 【发布时间】:2016-01-19 18:58:21 【问题描述】:

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

【问题讨论】:

【参考方案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' 组成。

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

% 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 添加一个新块,您只需复制您的奏鸣曲版本中使用的模板并根据您的需要对其进行自定义: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。

【讨论】:

以上是关于如何动态修改sonata_type_collection的子形式?的主要内容,如果未能解决你的问题,请参考以下文章

sonata_type_collection :从当前实体实例设置默认字段值

sonata_type_collection btn_add 不工作

Symfony 3 / sonata_type_collection 更改查询每个添加行

Sonata Admin Bundle - 表单类型:sonata_type_collection - 自定义模板?

sonata_type_collection 设置页面加载时的默认行数

奏鸣曲 sonata_type_collection 展示表