Search code examples
orocrmorocommerce

OroPlatform: how to implement MultiFileType


Context

I have to implement a multifile upload field on one of my OroPlatform entity.

I was thinking about the steps to implement it was quite the same as for the FileType.

So, I have done the following steps:

  • Add a file migration :
public function up(Schema $schema, QueryBag $queries)
{
    $this->attachmentExtension->addFileRelation(
        $schema,
        'app_sinister',
        'files',
        [],
        15
    );
}
  • change the form type:
->add('files', MultiFileType::class, ['label' => 'app.sinister.fields.files'])
  • and add it to the form:
form_row(form.files)

It seems to work because the attribute appears :

enter image description here

Problem

When I have tried to save the form, I have got this error:

enter image description here

I wondered if it was because I have implement a addFileRelation extension in my migration. I have tried with a addAttachmentAssociation, it creates these options in back-office but I don't know how to add this attribute to my formType:

enter image description here


Solution

  • In the above migration example, you've added the relation to the single file, but the form type is for multiple files. This leads to an error.

    To fix it, you can add a relation to multiple files with the more complex migration:

    $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]
        ]
    );