You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于sw-media-field与sw-media-upload-v2指定文件夹上传的咨询

实现Shopware插件指定媒体文件夹上传的方案

1. 插件安装时创建专属媒体文件夹

在插件的Migration类中编写代码,确保安装时自动生成专属媒体文件夹,示例代码如下:

public function update(Connection $connection): void
{
    $folderRepository = $this->container->get('media_folder.repository');
    $folderConfigRepository = $this->container->get('media_folder_config.repository');

    // 检查目标文件夹是否已存在
    $existingFolder = $folderRepository->search(new Criteria([
        ['name', '=', '你的插件专属文件夹名称']
    ]), $this->context)->first();

    if (!$existingFolder) {
        // 创建媒体文件夹
        $folderId = Uuid::randomHex();
        $folderRepository->create([
            [
                'id' => $folderId,
                'name' => '你的插件专属文件夹名称',
                'parentId' => $this->getDefaultMediaFolderId(), // 可指定父文件夹,此处用根目录
            ]
        ], $this->context);

        // 配置文件夹允许的媒体类型(示例为图片)
        $folderConfigRepository->create([
            [
                'mediaFolderId' => $folderId,
                'mediaTypeId' => $this->getImageMediaTypeId(),
                'createThumbnails' => true,
            ]
        ], $this->context);
    }
}

// 获取默认根媒体文件夹ID
private function getDefaultMediaFolderId(): string
{
    $folder = $this->container->get('media_folder.repository')
        ->search(new Criteria([['defaultFolder', '=', true]]), $this->context)
        ->first();
    return $folder->getId();
}

// 获取图片媒体类型ID
private function getImageMediaTypeId(): string
{
    $mediaType = $this->container->get('media_type.repository')
        ->search(new Criteria([['name', '=', 'IMAGE']]), $this->context)
        ->first();
    return $mediaType->getId();
}

2. 前端组件配置sw-media-upload-v2指定上传文件夹

在实体编辑的Vue组件中,通过folder-id属性指定目标文件夹,分两种场景实现:

场景1:插件自建固定文件夹

直接传入安装时创建的文件夹ID(可通过后端存储或硬编码):

<sw-media-upload-v2
    v-model="yourEntity.customFields.yourImageField"
    :folder-id="yourPluginFolderId"
    :allowed-media-types="['IMAGE']"
    label="上传图片到插件专属文件夹"
/>

场景2:支持用户自行创建的文件夹

在组件中通过API动态获取用户指定的文件夹ID:

created() {
    this.getTargetMediaFolder();
},
methods: {
    async getTargetMediaFolder() {
        // 此处可替换为从插件配置读取用户指定的文件夹名称/ID
        const response = await this.repositoryFactory.create('media_folder').search(
            new Criteria().addFilter(new EqualsFilter('name', '用户指定的文件夹名称')),
            this.context
        );
        if (response.total > 0) {
            this.targetFolderId = response.first().id;
        }
    }
}

3. 可选:后端校验媒体归属文件夹

如果需要强制实体的媒体字段仅关联指定文件夹的资源,可在实体的WriteHandler中添加校验:

public function write(EntityWriteContext $context): void
{
    parent::write($context);
    foreach ($context->getEntities() as $entity) {
        if ($entity instanceof YourEntity && $entity->getCustomField('your_image_field')) {
            $media = $this->mediaRepository->search(new Criteria([$entity->getCustomField('your_image_field')]), $context->getContext())->first();
            if ($media && $media->getMediaFolderId() !== '目标文件夹ID') {
                throw new WriteException('图片必须上传至指定文件夹');
            }
        }
    }
}

关键注意事项

  • 确保folder-id传入的是有效的媒体文件夹UUID
  • 若支持用户自定义文件夹,需在插件配置中添加文件夹选择项,让用户指定目标文件夹
  • 确认媒体文件夹的权限配置正确,插件拥有读写权限

内容的提问来源于stack exchange,提问作者Marc Cheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:54:57