Symfony Sonata Media Bundle 向用户添加图像/视频

Posted

技术标签:

【中文标题】Symfony Sonata Media Bundle 向用户添加图像/视频【英文标题】:Symfony Sonata Media Bundle add images/videos to a user 【发布时间】:2015-05-09 08:58:21 【问题描述】:

我正在尝试将 Sonata Media Bundle 集成到我的项目中。 问题是,我不明白捆绑包是如何工作的。

它在“应用程序”中生成了一个媒体、图库和 GalleryHasMedia 类。它们是干什么用的?我现在如何将图像字段和视频字段添加到我的用户实体? (都是复数)

问候, 新星

【问题讨论】:

【参考方案1】:

Media 是保存视频/图片所有属性的实体:宽度/高度/文件路径...

如果您想将多个媒体链接在一起(关于同一主题的视频/图片库),实体 Gallery 非常有用。

实体GalleryHasMedia 是链接画廊和媒体的实体。

SonataMedia 安装在捆绑应用程序中,因此您可以根据需要轻松扩展和更改代码。

如果您想向用户添加媒体或图库,您只需执行以下操作:

class UserEntity

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

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

使用控制台重新生成你的 getter 和 setter:

php app/console doctrine:generate:entities TestBundle:User

您已设置为在您的用户实体中使用 SonataMedia。

更新

如果你想为一个用户管理多个图像,你必须这样做:

用户实体

class UserEntity

    /**
     * @var Media
     *
     * @ORM\OneToMany(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="user")
     * @ORM\JoinColumns(
     *   @ORM\JoinColumn(name="images", referencedColumnName="id")
     * )
     */
    private $images;

Application\Sonata\MediaBundle\Entity\Media

class Media

    /**
      * @var User
      *
      * @ORM\ManyToOne(targetEntity="UserEntity", inversedBy="images")
      * @ORM\JoinColumns(
      *     @ORM\JoinColumn(name="user", referencedColumnName="id")
      * )
      */
    private $user;
 

用户管理员

class UserAdmin

    public function configureFormFields(FormMapper $formMapper)
    
        $formMapper->add('images', 'sonata_type_collection', array(), array(
            'edit' => 'inline',
            'inline' => 'table',
            'link_parameters' => array(
                'context' => 'images',
                'provider' => 'sonata.media.provider.image'
            )
        ))
    

您可以通过更改编辑和内联属性来更改显示,link_parameters 设置表单的强制属性:context and provider

更新 2

问题 2

如果您想为一个用户提供多个画廊,您只需执行我在之前更新中解释的相同过程,唯一的区别是您应该创建一个新属性,例如:private $imageGalleries 与 targetEntity Gallery,添加在 Sonata 的 Gallery 实体中的 inversedBy 并通过仅将字段名称 images 更改为 imageGalleries 在您的 SonataAdmin 类中添加新属性。

问题 3

在 Sonata 之外,您应该使用 sonata_media_type 形式来处理媒体。 http://sonata-project.org/bundles/media/2-0/doc/reference/form.html 因为您有 oneToMany 关系,所以它将是 sonata_media_type 的集合。

据我所知,没有表格可以处理画廊。

【讨论】:

我不明白你的映射。一开始你说“很多用户有一个图像”,但我想要的是“一个用户有很多图像”。对于画廊,您的代码映射意味着“一个画廊对许多用户”,但我认为“许多画廊对一个用户”会更有意义。我明白当我做多对一关系时,因为我只需要一个类中的注释。但是,当我有 OneToMany 时呢?在那里,我需要两个类中的注释..?您能否更新您对 OneToMany 关系的答案:) 我的意思是一个用户应该有更多的画廊,因为一个用户应该有一个图片库,一个视频库,例如。一个文件库。或者我是否因此创建了映射到媒体实体的不同字段?这是怎么做到的? 您应该使用具有 OnetoMany 类型的实体库或媒体创建 3 个不同的属性。选择画廊和媒体取决于您的项目媒体是否独立。祝你好运! 好的,谢谢我开始明白了。在我能接受这个答案之前,我还有三个问题 :) 1) 我现在还不明白如何添加,例如我的用户的“视频”属性,因为在用户实体中,我将添加与“图像”相同的内容,但我的“媒体”类看起来如何?用户属性上的“inversedBy”已用于图像。 2)媒体和画廊之间的区别。如何将图像添加到画廊,使它们“依赖”? 3)在管理区域外的表单类型中,我会使用类型为“sonata.media.provider.image”的普通“集合”字段?:) for 1) 我发现:***.com/questions/21445505/…【参考方案2】:

来自文档:

"注意

该命令将在应用程序命名空间中生成域对象。因此,您可以将实体的关联指向一个全局和公共命名空间。这将使实体共享变得非常容易,因为您的模型将允许指向全局命名空间。例如,媒体将是 Application\Sonata\MediaBundle\Entity\Media。” http://sonata-project.org/bundles/media/2-2/doc/reference/installation.html

几乎每次使用 easy-extands 包时都会得到什么。

您可以像使用任何实体一样使用它们,只是来自与现有实体不同的命名空间。

至于在其他表单类型中使用它们,只需将媒体表单类型嵌入到您的用户表单类型中:http://sonata-project.org/bundles/media/2-2/doc/reference/form.html

要将字段添加到另一个实体,您只需使用 getter 和 setter 添加属性,并且(我们总是使用原则注释而不是 yaml)将媒体实体的注释添加为目标实体,并使用关系类型的列名( 1:1,1:M,M:M 等)以通常的 symfony 方式。

【讨论】:

我想我需要澄清一下自己。我想将视频和图像添加到我的用户实体。为此,我需要一些示例代码。我知道如何在用户和媒体之间添加 OneToOne 关系,但我现在是否需要在 Application/Sonata/Entity 命名空间中添加新的“图像”和“视频”类并将这些类映射到我的用户实体中的字段(我不想为所有媒体提供一个大媒体类,我想分开图像、视频和文件)?我现在需要如何构建表单类型?请与我分享一些示例代码:) 另外,我不明白“画廊”类的场景..?

以上是关于Symfony Sonata Media Bundle 向用户添加图像/视频的主要内容,如果未能解决你的问题,请参考以下文章

Symfony Sonata Media Bundle 向用户添加图像/视频

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

Sonata Media Bundle 安装错误

SonataDoctrineORMAdminExtension.php

SonataMediaBundle:找不到文件/图像

sonata AdminBlockServiceInterface 弃用,以明确安装 symfony 2.8 + sonata 3.10