2017-02-01 10 views
1

У меня есть объект Product, и у меня есть объект File. Связь между этими 2 обычно является отношением ManyToMany. Но мне нужно также поле Значение «sorting» и «description», поэтому я должен объявить свою собственную JoinTable ProductHasFile. Теперь я хочу в своей форме, что у меня может быть Product bute include File FormTpye, а не ProductHasFile FormType.Symfony2: Как добавить FormType

Entity продукта:

/** 
* @ORM\Entity 
* @ORM\Table(name="Product") 
*/ 
class Product 
{ 

    /** 
    * @ORM\OneToMany(targetEntity="ProductHasFile", mappedBy="product", cascade={"persist"})) 
    */ 
    private $productHasFiles; 
.... 

Entity Файл:

/** 
* @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, 
        , 
       ) 
      ) 

и мой FormType для 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' => 'AppBundle\Entity\File', 
       'label' => 'file', 
      )) 
     ; 

я получаю только dropdwon для объекта File. Но я хочу, чтобы мой полный 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', 

       )) 
     ; 
    } 

ли кто-нибудь имеет решение для этого?

ответ

1

Как объяснено в Symfony документ о 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

В 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) 
     ; 
+0

Спасибо за upvote.Please рассмотреть вопрос о принятии моего ответа, чтобы другие могли извлечь выгоду из программирования it.Happy – Mawcel

Смежные вопросы