Symfony2:如何添加FormType

时间:2017-02-01 09:37:13

标签: doctrine-orm symfony

我有一个实体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',

                ))
        ;
    }

有人有解决方案吗?

2 个答案:

答案 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)
        ;