我有一个实体Product
,我有一个实体File
。这两者之间的关系通常是多对多关系。但是我还需要一个字段值" sorting
"和 "description
",所以我必须声明我自己的 JoinTable ProductHasFile
。现在我希望在我的表单中,我可以有一个Product
bute包括File
FormTpye而不是ProductHasFile
FormType。
产品实体:
/**
* @ORMEntity
* @ORMTable(name="Product")
*/
class Product
{
/**
* @ORMOneToMany(targetEntity="ProductHasFile", mappedBy="product", cascade={"persist"}))
*/
private $productHasFiles;
....
文件实体:
/**
* @ORMEntity
* @ORMHasLifecycleCallbacks
*/
class File
{
/**
* @ORMOneToMany(targetEntity="ProductHasFile", mappedBy="file")
*/
private $productHasFiles;
...
和我自己生成的实体产品文件:
/**
* @ORMEntity
* @ORMTable(name="ProductHasFile")
*/
class ProductHasFile
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMColumn(type="integer", nullable=true)
*/
private $sorting;
/**
* @ORMColumn(type="string", nullable=true)
*/
private $description;
/**
* @ORMManyToOne(targetEntity="Product", inversedBy="productHasFiles")
* @ORMJoinColumn(name="product_id", referencedColumnName="id")
*/
private $product;
/**
* @ORMManyToOne(targetEntity="File", inversedBy="productHasFiles")
* @ORMJoinColumn(name="file_id", referencedColumnName="id")
*/
private $file;
当我现在为产品制作表单类型时:
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,
,
)
)
和我的 FormType for ProductHasFileType:
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' => 'AppBundleEntityFile',
'label' => 'file',
))
;
我只得到文件实体的掉落。但是我想拥有我的完整File FormType
,其中包含上传字段和其他内容,它看起来像这样:
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', SymfonyComponentFormExtensionCoreTypeFileType::class, array(
'label' => 'file',
))
;
}
有人对此有解决方案吗?
正如Symfony文档中关于如何嵌入表单所解释的那样,这就像
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
;
}
}
在ProductHasFileType
中,您将像这样添加文件:
->add('file', EntityType::class, array(
'class' => 'AppBundleEntityFile',
'label' => 'file',
))
因此,您将文件添加为entity
类型,该类型在逻辑上呈现所有文件实体的下拉列表。
你需要做的是通过你自己的FileType
。为了确保你使用的是自己的文件类型,而不是默认的symfony,不要忘记添加正确的use语句。
结果:
use MyBundleFormTypeFileType;
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)
;