daric/sonata-multiupload-bundle

一个允许你在 Sonata 中启用多文件上传的包

安装次数: 1,225

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 16

类型:symfony-bundle


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License codecov

版本

示例

查看示例项目 Sample Project

安装

步骤 1: 下载包

composer require silasjoisten/sonata-multiupload-bundle

步骤 2: 启用包

然后,通过将包添加到项目中 app/AppKernel.php 文件中注册的包列表来启用该包

<?php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Daric\SilasJoisten\Sonata\MultiUploadBundle\SonataMultiUploadBundle(),
        );

        // ...
    }

    // ...
}

如果你正在使用 config/bundles.php 中的 flex 注册包

<?php

return [
    //...
    Daric\SilasJoisten\Sonata\MultiUploadBundle\SonataMultiUploadBundle::class => ['all' => true]
];

步骤 3: 配置

你必须打开该包的配置文件,并配置你想启用多上传的提供者。

# config/packages/sonata_multi_upload.yaml

sonata_multi_upload:
  # ...
  providers:
    - sonata.media.provider.image
    - sonata.media.provider.video

向 SonataAdmin 配置中添加 JavaScript 和 CSS

# config/packages/sonata_admin.yaml

sonata_admin:
  assets:
    extra_stylesheets:
      - bundles/sonatamultiupload/dist/sonata-multiupload.css

    extra_javascripts:
      - bundles/sonatamultiupload/dist/sonata-multiupload.js

可选

# config/packages/sonata_multi_upload.yaml

sonata_multi_upload:
  max_upload_filesize: 3000000 # 3MB the default value is 0 -> allow every size

有一个 redirect_to 选项,允许你在上传完成后重定向到配置的页面。

# config/packages/sonata_multi_upload.yaml

sonata_multi_upload:
  redirect_to: 'admin_sonata_media_media_list'

提示: MultiUploadBundle 会自动将上传的 Media 对象的 id 传递给重定向路由,例如: /foo/bar?idx=%5B70%2C71%2C72%5D,这样你可以使用它们创建一个媒体库。

示例:上传多张图片并自动创建一个 Gallery

创建控制器

控制器接收你的请求,并在本例中创建一个包含 GalleryItemsGallery,然后重定向到 GalleryAdmin 的编辑视图。

<?php

namespace App\Controller;

use App\Entity\SonataMediaGallery;
use App\Entity\SonataMediaGalleryItem;
use Sonata\MediaBundle\Admin\GalleryAdmin;
use Sonata\MediaBundle\Entity\MediaManager;
use Sonata\MediaBundle\Entity\GalleryManager;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

final class CreateGalleryAction
{
    public function __construct(
        private MediaManager   $mediaManager,
        private GalleryManager $galleryManager,
        private GalleryAdmin   $galleryAdmin
    ) {
    }

    public function __invoke(Request $request): RedirectResponse
    {
        $idx = $request->query->get('idx');
        $idx = json_decode($idx);

        /** @var SonataMediaGallery $gallery */
        $gallery = $this->galleryManager->create();
        $gallery->setName('Auto Created Gallery');
        $gallery->setEnabled(false);
        $gallery->setContext('default');

        foreach ($idx as $id) {
            $media = $this->mediaManager->find($id);

            $galleryHasMedia = new SonataMediaGalleryItem();
            $galleryHasMedia->setGallery($gallery);
            $galleryHasMedia->setMedia($media);
            $gallery->addGalleryItem($galleryHasMedia);
        }

        $this->galleryManager->save($gallery);

        return new RedirectResponse($this->galleryAdmin->generateObjectUrl('edit', $gallery));
    }
}

注册路由

如果你已经覆盖了默认的 MediaAdmin,你可以通过在 admin 类中添加路由来实现。

   protected function configureRoutes(RouteCollectionInterface $collection): void
    {
        $collection->add('create_gallery', 'multi-upload/create-gallery', [
            '_controller' => CreateGalleryAction::class,
        ]);
    }

否则,你可以创建一个类似于下面的 AdminExtension

<?php

declare(strict_types=1);

namespace App\Admin\Extension;

use App\Controller\CreateGalleryAction;
use Sonata\AdminBundle\Admin\AbstractAdminExtension;
use Sonata\AdminBundle\Admin\AdminInterface;
use Sonata\AdminBundle\Route\RouteCollectionInterface;

final class MediaAddRouteExtension extends AbstractAdminExtension
{
    public function configureRoutes(AdminInterface $admin, RouteCollectionInterface $collection): void
    {
        $collection->add('create_gallery', 'multi-upload/create-gallery', [
            '_controller' => CreateGalleryAction::class,
        ]);
    }
}

并在你的 config/services.yaml 中注册此扩展

services:
    # ...
    App\Admin\Extension\MediaAddRouteExtension:
        tags:
            - { name: sonata.admin.extension, target: sonata.media.admin.media }

现在在 config/packages/sonata_multi_upload.yaml 中配置 redirect_to

sonata_multi_upload:
    redirect_to: 'admin_app_sonatamediamedia_create_gallery'

可能需要为 MediaManagerGalleryManager 创建别名,如下所示

# config/services.yaml
services:
  Sonata\MediaBundle\Entity\MediaManager:
    alias: sonata.media.manager.media

  Sonata\MediaBundle\Entity\GalleryManager:
    alias: sonata.media.manager.gallery

  Sonata\MediaBundle\Admin\GalleryAdmin:
    alias: sonata.media.admin.gallery

这就完成了。

请注意,上传器对像 YouTubeProvider、VimeoProvider 这样的提供者不起作用!

4. 外观和感觉

multiupload

使用的库