我有一个实体Product
,我有一个实体File
。
这两者之间的关系通常是ManyToMany Relation。但我还需要一个字段值" sorting
"和" description
",所以我必须声明我自己的JoinTable ProductHasFile
。现在我希望在我的表单中,我可以使用Product
形式包括File
FormTpye而不是ProductHasFile
FormType。
产品实体:
/**
* @ORM\Entity
* @ORM\Table(name="Product")
*/
class Product
{
/**
* @ORM\OneToMany(targetEntity="ProductHasFile", mappedBy="product", cascade={"persist"}))
*/
private $productHasFiles;
....
文件实体:
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class File
{
/**
* @ORM\OneToMany(targetEntity="ProductHasFile", mappedBy="file")
*/
private $productHasFiles;
...
我自己生成的Entity ProductHasFile:
/**
* @ORM\Entity
* @ORM\Table(name="ProductHasFile")
*/
class ProductHasFile
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $sorting;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $description;
/**
* @ORM\ManyToOne(targetEntity="Product", inversedBy="productHasFiles")
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
*/
private $product;
/**
* @ORM\ManyToOne(targetEntity="File", inversedBy="productHasFiles")
* @ORM\JoinColumn(name="file_id", referencedColumnName="id")
*/
private $file;
当我现在制作产品的Formtype时:
class ProductType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
->add('productHasFiles', CollectionType::class, array(
'entry_type' => ProductHasFileType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
,
)
)
和ProductHasFileType的FormType:
class ProductHasFileType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
/**
* @var $entityManager EntityManager
*/
$fileRepository = $options['fileRepository'];
$builder
->add('sorting', TextType::class)
->add('description', TextType::class)
->add('file', EntityType::class, array(
'class' => 'AppBundle\Entity\File',
'label' => 'file',
))
;
我只获得了文件实体的dropdwon。但是我希望我的完整File FormType
包含Uploadfield和其他内容,它看起来像这样:
class FileType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', TextType::class, array(
'label' => 'description',
))
->add('type', TextType::class, array(
'label' => 'type',
))
->add('file', \Symfony\Component\Form\Extension\Core\Type\FileType::class, array(
'label' => 'file',
))
;
}
有人有解决方案吗?
答案 0 :(得分:1)
正如Symfony doc中关于how to embed forms的解释,这就像
一样简单class ProductHasFileType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
/**
* @var $entityManager EntityManager
*/
$fileRepository = $options['fileRepository'];
$builder
->add('sorting', TextType::class)
->add('description', TextType::class)
->add('file', FileType::class) //where FileType is your own FormType
;
}
}
答案 1 :(得分:1)
在ProductHasFileType
中,您可以像这样添加文件:
->add('file', EntityType::class, array(
'class' => 'AppBundle\Entity\File',
'label' => 'file',
))
因此您要将文件添加为entity
类型,并在逻辑上呈现所有文件实体的下拉列表。
您需要做的是传递自己的FileType
。为了确保您使用自己的文件类型而不是默认的symfony,请不要忘记添加正确的使用声明。
结果:
use MyBundle\Form\Type\FileType;
class ProductHasFileType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('sorting', TextType::class)
->add('description', TextType::class)
->add('file', FileType::class)
;