Php 字段图像未链接到管理员

Php 字段图像未链接到管理员,php,symfony,sonata-admin,symfony-sonata,Php,Symfony,Sonata Admin,Symfony Sonata,我有两个实体:产品和图像,很多产品可以有很多实体 因此,这将生成第三个表ProductHasImages。实体是对的 as条令:模式:验证命令输出: Symfony > doctrine:schema:validate [Mapping] OK - The mapping files are correct. [Database] FAIL - The database schema is not in sync with the current mapping file. The co

我有两个实体:
产品
图像
,很多产品可以有很多实体 因此,这将生成第三个表
ProductHasImages
。实体是对的 as
条令:模式:验证
命令输出:

Symfony > doctrine:schema:validate
[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current
mapping file.
The command terminated with an error status (2)
我已将以下行添加到我的
config.yml

services:
  tan.common.admin.image:
    class: Tan\CommonBundle\Admin\ImageAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, label: "Imagenes",
show_in_dashboard: false }
    arguments: [null, Tan\CommonBundle\Entity\Image, null]
我已经用 以下内容:

<?php

namespace Tan\CommonBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;

class ImageAdmin extends Admin
{

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper->add('file', 'file', array('required' => false));
    }

    public function prePersist($image)
    {
        $this->manageFileUpload($image);
    }

    public function preUpdate($image)
    {
        $this->manageFileUpload($image);
    }

    private function manageFileUpload($image)
    {
        if ($image->getFile()) {
            $image->refreshUpdated();
        }
    }

}
但每当我尝试添加新产品时,都会出现以下错误:

当前字段
图像
未链接到管理员。请创建一个 对于目标实体:``


为什么??我做错了什么?

对于sonata admin中最好的文件,用于处理上传,您可以在不同的管理员中重新使用它们,一旦您配置了这些文件,那么您的映射将被删除

实体
  • 产品
  • ProductHasImages
现在,
Products
实体将有一个
ProductHasImages
的映射,它可以指向许多图像(sonata Media bundle中的媒体文件),类似于

/**
 * @Assert\NotBlank()
 * @ORM\OneToMany(targetEntity="Namespace\YourBundle\Entity\ProductHasImages", mappedBy="productImages",cascade={"persist","remove"} )
 */
protected $images;

other fields ...
生成它的getter和setter方法

removeImages()
getImages()
setImages()
addImages()
现在,您的连接实体(即(
ProductHasImages
)将有两个映射指向后面的
Products
,另一个映射指向
Sonata Media

/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="media_id", referencedColumnName="id")
 */
protected $media;

/**
 * @var \Namespace\YourBundle\Entity\Products
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Products", cascade={"persist","remove"} ,inversedBy="images", fetch="LAZY" )
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id",nullable=true)
 */
protected $productImages;
生成他们的getter和setter

现在为
ProductHasImages

configureFormFields
函数中有一个字段

$formMapper->add('media', 'sonata_type_model_list', array('required' => false), array(
            'link_parameters' => $link_parameters
        )); //other fields too if you want to show in collection 
并在产品管理类中添加此字段

    ->add('images', 'sonata_type_collection', array(
            'cascade_validation' => false,
            'type_options' => array('delete' => false),
        ), array(

            'edit' => 'inline',
            'inline' => 'table',
            'sortable' => 'position',
            'link_parameters' => array('context' => 'default'),
            'admin_code' => 'sonata.admin.product_has_images' 
      /*here provide service name for junction admin 
        like service code for admin defined for ProductHasImages */
        )
    )

您可以在这里找到完整的代码演示

文件,这些文件是sonata admin用于处理上传的最佳文件,您可以在不同的admin中重新使用它们,一旦您配置了这些文件,那么您的映射将

实体
  • 产品
  • ProductHasImages
现在,
Products
实体将有一个
ProductHasImages
的映射,它可以指向许多图像(sonata Media bundle中的媒体文件),类似于

/**
 * @Assert\NotBlank()
 * @ORM\OneToMany(targetEntity="Namespace\YourBundle\Entity\ProductHasImages", mappedBy="productImages",cascade={"persist","remove"} )
 */
protected $images;

other fields ...
生成它的getter和setter方法

removeImages()
getImages()
setImages()
addImages()
现在,您的连接实体(即(
ProductHasImages
)将有两个映射指向后面的
Products
,另一个映射指向
Sonata Media

/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="media_id", referencedColumnName="id")
 */
protected $media;

/**
 * @var \Namespace\YourBundle\Entity\Products
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Products", cascade={"persist","remove"} ,inversedBy="images", fetch="LAZY" )
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id",nullable=true)
 */
protected $productImages;
生成他们的getter和setter

现在为
ProductHasImages

configureFormFields
函数中有一个字段

$formMapper->add('media', 'sonata_type_model_list', array('required' => false), array(
            'link_parameters' => $link_parameters
        )); //other fields too if you want to show in collection 
并在产品管理类中添加此字段

    ->add('images', 'sonata_type_collection', array(
            'cascade_validation' => false,
            'type_options' => array('delete' => false),
        ), array(

            'edit' => 'inline',
            'inline' => 'table',
            'sortable' => 'position',
            'link_parameters' => array('context' => 'default'),
            'admin_code' => 'sonata.admin.product_has_images' 
      /*here provide service name for junction admin 
        like service code for admin defined for ProductHasImages */
        )
    )

您可以在这里找到完整的代码演示

文件,这些文件是sonata admin用于处理上传的最佳文件,您可以在不同的admin中重新使用它们,一旦您配置了这些文件,那么您的映射将

实体
  • 产品
  • ProductHasImages
现在,
Products
实体将有一个
ProductHasImages
的映射,它可以指向许多图像(sonata Media bundle中的媒体文件),类似于

/**
 * @Assert\NotBlank()
 * @ORM\OneToMany(targetEntity="Namespace\YourBundle\Entity\ProductHasImages", mappedBy="productImages",cascade={"persist","remove"} )
 */
protected $images;

other fields ...
生成它的getter和setter方法

removeImages()
getImages()
setImages()
addImages()
现在,您的连接实体(即(
ProductHasImages
)将有两个映射指向后面的
Products
,另一个映射指向
Sonata Media

/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="media_id", referencedColumnName="id")
 */
protected $media;

/**
 * @var \Namespace\YourBundle\Entity\Products
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Products", cascade={"persist","remove"} ,inversedBy="images", fetch="LAZY" )
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id",nullable=true)
 */
protected $productImages;
生成他们的getter和setter

现在为
ProductHasImages

configureFormFields
函数中有一个字段

$formMapper->add('media', 'sonata_type_model_list', array('required' => false), array(
            'link_parameters' => $link_parameters
        )); //other fields too if you want to show in collection 
并在产品管理类中添加此字段

    ->add('images', 'sonata_type_collection', array(
            'cascade_validation' => false,
            'type_options' => array('delete' => false),
        ), array(

            'edit' => 'inline',
            'inline' => 'table',
            'sortable' => 'position',
            'link_parameters' => array('context' => 'default'),
            'admin_code' => 'sonata.admin.product_has_images' 
      /*here provide service name for junction admin 
        like service code for admin defined for ProductHasImages */
        )
    )

您可以在这里找到完整的代码演示

文件,这些文件是sonata admin用于处理上传的最佳文件,您可以在不同的admin中重新使用它们,一旦您配置了这些文件,那么您的映射将

实体
  • 产品
  • ProductHasImages
现在,
Products
实体将有一个
ProductHasImages
的映射,它可以指向许多图像(sonata Media bundle中的媒体文件),类似于

/**
 * @Assert\NotBlank()
 * @ORM\OneToMany(targetEntity="Namespace\YourBundle\Entity\ProductHasImages", mappedBy="productImages",cascade={"persist","remove"} )
 */
protected $images;

other fields ...
生成它的getter和setter方法

removeImages()
getImages()
setImages()
addImages()
现在,您的连接实体(即(
ProductHasImages
)将有两个映射指向后面的
Products
,另一个映射指向
Sonata Media

/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="media_id", referencedColumnName="id")
 */
protected $media;

/**
 * @var \Namespace\YourBundle\Entity\Products
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Products", cascade={"persist","remove"} ,inversedBy="images", fetch="LAZY" )
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id",nullable=true)
 */
protected $productImages;
生成他们的getter和setter

现在为
ProductHasImages

configureFormFields
函数中有一个字段

$formMapper->add('media', 'sonata_type_model_list', array('required' => false), array(
            'link_parameters' => $link_parameters
        )); //other fields too if you want to show in collection 
并在产品管理类中添加此字段

    ->add('images', 'sonata_type_collection', array(
            'cascade_validation' => false,
            'type_options' => array('delete' => false),
        ), array(

            'edit' => 'inline',
            'inline' => 'table',
            'sortable' => 'position',
            'link_parameters' => array('context' => 'default'),
            'admin_code' => 'sonata.admin.product_has_images' 
      /*here provide service name for junction admin 
        like service code for admin defined for ProductHasImages */
        )
    )

您可以在这里找到完整的代码演示

我建议您使用它来处理多个files@tttony我一开始试过了,但没有成功,你有没有成功的例子?答案中有一个例子,我建议你用它来处理多个问题files@tttony我一开始试过了,但没有成功,你有没有成功的例子?答案中有一个例子,我建议你用它来处理多个问题files@tttony我一开始试过了,但没有成功,你有没有成功的例子?答案中有一个例子,我建议你用它来处理多个问题files@tttony我一开始试过了,但没有成功,你有没有成功的例子?答案中有一个例子