fid*_*lio 19 symfony sonata-admin
我试图将SonataMediaBundle与另一个实体联系起来:与ManyToMany有关系的产品.
架构和关系很好地创建.
但是,当我编辑或创建新产品时,我尝试添加一个按钮,我可以通过媒体库搜索媒体文件,然后使用按钮上传新文件.
对于OneToMany的关系,可以Admin\ProductAdmin::configureFormFields通过添加以下内容轻松完成:
->add('image', 'sonata_type_model_list', array(
'required' => false
), array(
'link_parameters' => array(
'context' => 'default',
'provider' => 'sonata.media.provider.image'
)
))
Run Code Online (Sandbox Code Playgroud)
因此,我获得了与SonataMediaBundle图库中已使用的相同的3个图标(从库中添加,上传和删除)
但关于ManyToMany的关系是不可能的!因为每次我选择媒体时,都会取代之前的媒体.所以我无法选择多种媒体类型.
我想和The Gallery一样使用(galleryHasMedia)
->add('galleryHasMedias', 'sonata_type_collection', array(
'by_reference' => false
), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'position',
'link_parameters' => array('context' => $context)
))
Run Code Online (Sandbox Code Playgroud)
但是,它真的很复杂.如何通过ManyToMany关系在另一个实体上选择或上传多个媒体文件?
Nic*_*tel 20
我和你有同样的问题,但我已经明白了.
首先,您可能希望选择一对多/多对一关系(使用中间实体)而不是多对多关系.为什么?因为这允许其他列,例如position列.这样您就可以按照自己的方式重新排序图像.在多对多关系中,链接表只有两列:关联表的id.
(...)经常要将其他属性与关联相关联,在这种情况下,您将引入关联类.因此,直接的多对多关联消失,并被3个参与类之间的一对多/多对一关联所取代.
所以我把它添加到我的产品映射文件中:(你可以看到我使用YAML作为我的配置文件格式)
oneToMany:
images:
targetEntity: MyBundle\Entity\ProductImage
mappedBy: product
orderBy:
position: ASC
Run Code Online (Sandbox Code Playgroud)
我创建了一个新的ProductImage映射文件:
MyBundle\Entity\ProductImage:
type: entity
table: product_images
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
position:
type: integer
manyToOne:
product:
targetEntity: MyBundle\Entity\Product
inversedBy: images
image:
targetEntity: Application\Sonata\MediaBundle\Entity\Media
Run Code Online (Sandbox Code Playgroud)
使用命令行(php app/console doctrine:generate:entities MyBundle)我创建/更新了相应的实体(Product和ProductImage).
接下来,我创建/更新了Admin类.ProductAdmin.php:
class ProductAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
// define other form fields
->add('images', 'sonata_type_collection', array(
'required' => false
), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'position',
))
;
}
Run Code Online (Sandbox Code Playgroud)
ProductImageAdmin.php:
class ProductImageAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('image', 'sonata_type_model_list', array(
'required' => false
), array(
'link_parameters' => array(
'context' => 'product_image'
)
))
->add('position', 'hidden')
;
}
Run Code Online (Sandbox Code Playgroud)
不要忘记将它们都添加为服务.如果您不希望在仪表板上显示指向ProductImage表单的链接,请添加show_in_dashboard: false标记.(你如何做到这取决于你使用的配置格式(yaml/xml/php))
在此之后我将管理表单正常工作,但是我仍然在尝试保存产品时遇到了一些问题.我必须执行以下步骤才能解决所有问题:
首先,我必须为Product实体配置级联持久化操作.同样,如何执行此操作取决于您的配置格式.我正在使用yaml,所以在images一对多的关系中,我添加了cascade属性:
oneToMany:
images:
targetEntity: MyBundle\Entity\ProductImage
mappedBy: product
orderBy:
position: ASC
cascade: ["persist"]
Run Code Online (Sandbox Code Playgroud)
这让它工作(或者我认为),但我注意到product_id数据库中的设置是NULL.我通过向类添加prePersist()和preUpdate()方法解决了这个问题ProductAdmin:
public function prePersist($object)
{
foreach ($object->getImages() as $image) {
$image->setProduct($object);
}
}
public function preUpdate($object)
{
foreach ($object->getImages() as $image) {
$image->setProduct($object);
}
}
Run Code Online (Sandbox Code Playgroud)
...并addImages()在Product实体的方法中添加了一行:
public function addImage(\MyBundle\Entity\ProductImage $images)
{
$images->setProduct($this);
$this->images[] = $images;
return $this;
}
Run Code Online (Sandbox Code Playgroud)
这对我有用,现在我可以在我的产品中添加,更改,重新排序,删除等图像.
| 归档时间: |
|
| 查看次数: |
9268 次 |
| 最近记录: |