我正在尝试将Sonata Media Bundle集成到我的项目中。 问题是,我不明白捆绑的工作原理。
它已在“应用程序”中生成了Media,Gallery和GalleryHasMedia课程。它们适用于什么?我现在如何向我的用户实体添加图像字段和视频字段? (都是复数)
此致 新星
答案 0 :(得分:20)
Media是保存视频/图片所有属性的实体:宽度/高度/文件路径......
如果您想将多个媒体链接在一起(有关同一主题的视频/图片库),则实体Gallery非常有用。
实体GalleryHasMedia是链接图库和媒体的实体。
SonataMedia安装在Bundle Application中,因此您可以根据需要轻松扩展和更改代码。
如果您想向用户添加媒体或图库,您只需执行以下操作:
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。
<强>更新强>
如果您想为用户管理多个图像,则必须执行以下操作:
<强> UserEntity 强>
class UserEntity
{
/**
* @var Media
*
* @ORM\OneToMany(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="user")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="images", referencedColumnName="id")
* })
*/
private $images;
}
<强>应用\奏\ MediaBundle \实体\媒体强>
class Media
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="UserEntity", inversedBy="images")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user", referencedColumnName="id")
* })
*/
private $user;
}
<强> UserAdmin 强>
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 with targetEntity Gallery,add在Sonata的Gallery Entity中反转并在SonataAdmin类中添加新属性,只需将字段名称图像更改为imageGalleries。
问题3
在Sonata之外,您应该使用sonata_media_type表单来处理Media。 http://sonata-project.org/bundles/media/2-0/doc/reference/form.html 因为你有一个oneToMany关系,所以它将是sonata_media_type的集合。
我知道没有办法处理画廊。
答案 1 :(得分:0)
来自文档:
“注
该命令将在Application命名空间中生成域对象。因此,您可以将实体的关联指向全局和通用命名空间。这将使实体共享变得更加容易,因为您的模型将允许指向全局命名空间。例如,媒体将是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的属性(我们始终使用doctrine annotations而不是yaml)将媒体实体的注释添加为具有关系类型的列名称的目标实体(以通常的symfony方式1:1,1:M,M:M等)。