OroPlatform:如何实现 MultiFileType

Posted

技术标签:

【中文标题】OroPlatform:如何实现 MultiFileType【英文标题】:OroPlatform: how to implement MultiFileType 【发布时间】:2021-10-06 00:25:36 【问题描述】:

上下文

我必须在我的一个 OroPlatform 实体上实现多文件上传字段。

我在考虑实现它的步骤与 FileType 完全相同。

所以,我做了以下步骤:

添加文件迁移:
public function up(Schema $schema, QueryBag $queries)

    $this->attachmentExtension->addFileRelation(
        $schema,
        'app_sinister',
        'files',
        [],
        15
    );

更改表单类型:
->add('files', MultiFileType::class, ['label' => 'app.sinister.fields.files'])
并将其添加到表单中:
form_row(form.files)

它似乎工作,因为属性出现:

问题

当我尝试保存表单时,我收到了这个错误:

我想知道是不是因为我在迁移中实现了addFileRelation 扩展。我试过addAttachmentAssociation,它在后台创建了这些选项,但我不知道如何将此属性添加到我的formType:

【问题讨论】:

【参考方案1】:

在上面的迁移示例中,您已将关系添加到单个文件,但表单类型适用于多个文件。这会导致错误。

要修复它,您可以通过更复杂的迁移添加与多个文件的关系:

$this->extendExtension->addManyToOneRelation(
    $schema,
    $schema->getTable('oro_attachment_file_item'),
    'app_sinisters',
    $schema->getTable('app_sinister'),
    'id',
    [
        ExtendOptionsManager::MODE_OPTION => ConfigModel::MODE_READONLY,
        'extend' => [
            'is_extend' => true,
            'owner' => ExtendScope::OWNER_CUSTOM,
            'without_default' => true,
            'on_delete' => 'CASCADE',
        ],
        'datagrid' => ['is_visible' => false],
        'form' => ['is_enabled' => false],
        'view' => ['is_displayable' => false],
        'merge' => ['display' => false]
    ]
);
$this->extendExtension->addManyToOneInverseRelation(
    $schema,
    $schema->getTable('oro_attachment_file_item'),
    'app_sinisters',
    $schema->getTable('app_sinister'),
    'files',
    ['id'],
    ['id'],
    ['id'],
    [
        ExtendOptionsManager::MODE_OPTION => ConfigModel::MODE_READONLY,
        'extend' => [
            'is_extend' => true,
            'owner' => ExtendScope::OWNER_CUSTOM,
            'without_default' => true,
            'cascade' => ['persist'],
            'on_delete' => 'CASCADE',
            'orphanRemoval' => true,
            'fetch' => ClassMetadataInfo::FETCH_LAZY
        ],
        'datagrid' => ['is_visible' => false],
        'form' => ['is_enabled' => false],
        'view' => ['is_displayable' => false],
        'merge' => ['display' => false]
    ]
);

【讨论】:

以上是关于OroPlatform:如何实现 MultiFileType的主要内容,如果未能解决你的问题,请参考以下文章

使用 OROPlatform 时如何测试自己的代码?

OroPlatform:网格行上的自定义操作

OroPlatform:在核心实体上添加自定义字段

OroPlatform:覆盖 Oro 包模板

OroPlatform:覆盖核心实体表单构建器

OroPlatform:覆盖 oro_datetime_widget 选项