Symfony 4 中的奏鸣曲媒体包模板

Posted

技术标签:

【中文标题】Symfony 4 中的奏鸣曲媒体包模板【英文标题】:Sonata Media Bundle Template in Symfony 4 【发布时间】:2018-12-08 02:22:55 【问题描述】:

我在 Symfony 4 中安装了 Sonata Media Bundle,一切正常,但 Symfony 3 的情况有所不同。

我在 Sonata Admin 中看不到该服务,当我将奏鸣曲媒体包字段添加到 Admin Class 时,这会显示不同的模板。

这里的图片:

Sonata Media Bundle template - Symfony 4, in User Entity

Sonata Media Bundle template - Symfony 3, in User Entity

Sonata Media Bundle template - Symfony 3, Adding new image

如您所见,该模板在 Symfony 4 中不起作用,或者我的代码中缺少某些内容。

我的奏鸣曲媒体配置

sonata_media.yaml

    sonata_media:
            class:
                media: App\Application\Sonata\MediaBundle\Entity\Media
                gallery: App\Application\Sonata\MediaBundle\Entity\Gallery
                gallery_has_media: App\Application\Sonata\MediaBundle\Entity\GalleryHasMedia
            default_context: default
            contexts:
                default:
                    providers:
                        - sonata.media.provider.dailymotion
                        - sonata.media.provider.youtube
                        - sonata.media.provider.image
                        - sonata.media.provider.file
                        - sonata.media.provider.vimeo

                    formats:
                        small:  width: 100 , quality: 70
                        big:    width: 500 , quality: 70

            cdn:
                server:
                    path: /upload/media

            filesystem:
                local:
                    # Directory for uploads should be writable
                    directory: "%kernel.project_dir%/public/upload/media"
                    create: false


            providers:
                # ...
                file:
                    # the resizer must be set to false, otherwhise this can delete icon files from the fs
                    resizer:    false
                image:
                   thumbnail: sonata.media.thumbnail.format          # default value
        #           thumbnail: sonata.media.thumbnail.consumer.format # can be used to dispatch the resize action to async task
        #            thumbnail: sonata.media.thumbnail.liip_imagine    # use the LiipImagineBundle to resize the image
                vimeo:
                    thumbnail: sonata.media.thumbnail.format          # default value
        #           thumbnail: sonata.media.thumbnail.consumer.format # can be used to dispatch the resize action to async task
        #           thumbnail: sonata.media.thumbnail.liip_imagine    # use the LiipImagineBundle to resize the image
                youtube:
                    thumbnail: sonata.media.thumbnail.format          # default value
        #           thumbnail: sonata.media.thumbnail.consumer.format # can be used to dispatch the resize action to async task
        #           thumbnail: sonata.media.thumbnail.liip_imagine    # use the LiipImagineBundle to resize the image
                dailymotion:
                    thumbnail: sonata.media.thumbnail.format          # default value
        #           thumbnail: sonata.media.thumbnail.consumer.format # can be used to dispatch the resize action to async task
        #           thumbnail: sonata.media.thumbnail.liip_imagine    # use the LiipImagineBundle to resize the image

我的用户的管理员类

    // src/Admin/OgaUsersAdmin.php
    namespace App\Admin;

    use Sonata\AdminBundle\Admin\AbstractAdmin;
    use Sonata\AdminBundle\Datagrid\ListMapper;
    use Sonata\AdminBundle\Datagrid\DatagridMapper;
    use Sonata\AdminBundle\Form\FormMapper;
    use Sonata\MediaBundle\Form\Type\MediaType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;

    class OgaUsersAdmin extends AbstractAdmin
    
        protected function configureFormFields(FormMapper $formMapper)
        
            $formMapper->add('userFirstName', TextType::class)
                       ->add('userCollection', MediaType::class, array(
                             'provider' => 'sonata.media.provider.image',
                             'context'  => 'default'
                            ));

        

        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
        
            $datagridMapper->add('userFirstName');
        

        protected function configureListFields(ListMapper $listMapper)
        
            $listMapper->addIdentifier('userFirstName');
        
    

我的用户实体和媒体包字段

    namespace App\Entity;

    use Application\Sonata\MediaBundle\Entity\Media;
    use Doctrine\ORM\Mapping as ORM;

    /**
     * OgaUsers
     *
     * @ORM\Table(name="oga_users", indexes=@ORM\Index(name="memb_id_idx", columns="memb_id"), @ORM\Index(name="comp_id_idx", columns="comp_id"), @ORM\Index(name="u_ui_id_idx", columns="user_collection"))
     * @ORM\Entity
     */
    class OgaUsers
    
        /**
         * @var int
         *
         * @ORM\Column(name="user_id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $userId;

        /**
         * @var Media
         *
         * @ORM\ManyToOne(targetEntity="App\Application\Sonata\MediaBundle\Entity\Media")
         * @ORM\JoinColumns(
         *     @ORM\JoinColumn(name="userCollection", referencedColumnName="id")
         * )
         */
       private $userCollection;

获取者和设置者

public function getUserCollection(): ?\App\Application\Sonata\MediaBundle\Entity\Media

    return $this->userCollection;


public function setUserCollection(?\App\Application\Sonata\MediaBundle\Entity\Media $userCollection): self

    $this->userCollection = $userCollection;

    return $this;

谢谢

【问题讨论】:

欢迎来到 SO。该站点针对的是编程问题,而不是软件安装。您可能在 linux 或服务器管理站点上有更好的运气。此外,您还希望避免放置图片链接,如果这些链接在某些时候被删除,问题对于有同样问题的人来说将变得毫无用处。 感谢您的评论,这不是为了安装,是指php框架,以及插件/捆绑包的配置。我会尝试在没有图片链接的情况下进行解释。 但是你甚至没有给我们展示一些代码,所以来自@Nic3500 的反对是合法的。你试过相应的教程吗? 对不起,我已经添加了代码,是的,我已经尝试了相应的教程,一切正常但模板不符合预期,感谢反馈。 【参考方案1】:

搜索了几个星期。

我有答案。

首先我需要将此行添加到我的 sonata_media.yaml 中,以便在 Admin Dashboard 中查看媒体库。

db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr it is mandatory to choose one here

在configureFormFields的Admin中后,只需将ModellistType::class,添加到媒体字段中。

class OgaUsersAdmin extends AbstractAdmin

    protected function configureFormFields(FormMapper $formMapper)
    
        $formMapper->add('userFirstname', TextType::class)
                   ->add('userImage', ModelListType::class);
    

希望对你有帮助!!

【讨论】:

以上是关于Symfony 4 中的奏鸣曲媒体包模板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 symfony 中覆盖奏鸣曲媒体包的默认上传路径?

Symfony:奏鸣曲媒体文件预览

Symfony 2 Sonata 媒体包:在没有奏鸣曲管理员的情况下保存媒体文件图像

奏鸣曲媒体包中的错误

奏鸣曲媒体包修改 MediaType

Symfony 4 + 奏鸣曲管理包 + 关系。表单正在删除子项,但不仅是 parentId