2016-12-06 10 views
1

У меня есть отношение OneToMany между двумя объектами, и я создал связанную с ним форму, но кажется, что FormBuilder после отправки данных не видит детей из организация.
Родитель класс:Symfony: Form Builder не получает вход OneToMany

class Parent{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 

    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(targetEntity="Child",mappedBy="parent",cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    private $children; 
} 

Детский класс:

class Child{ 
    /** 
     * @var int 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
    private $id; 
    /** 
     * @var string 
     * 
     * @ORM\Column(name="name", type="string", length=255) 
     */ 
    private $name; 
    /** 
    * @ORM\ManyToOne(targetEntity="Parent", inversedBy="children") 
    */ 
    private $parent; 
} 

Это FormTypes:

class ParentType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name') 
      ->add('children', CollectionType::class, array(
      'entry_type' => ChildType::class, 
      'allow_add' => true 

     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Bundle\Entity\Parent' 
     )); 
    } 

} 

Детский FormType:

class ChildType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name'); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Bundle\Entity\Child' 
     )); 
    } 
} 

После этого я создал свою форму внутри контроллера, как это:

function saveAction(Request $request){ 
    $parent = new Parent(); 
    $form = $this->createForm('Bundle\Form\ParentType', $parent); 
    $form->handleRequest($request); 
    if ($form->isSubmitted()) { 
      //--after submitted the form I just want to display the children 
      die(var_dump($parent->getChildren())); 


     } 
} 

Конечно я создаю детей с помощью JQuery из данных-прототипа, предоставленной Symfony-х FormBuilder, но форма не видит их !!
Что мне здесь не хватает?

+0

Вы можете использовать свойство 'query_builder', как показано здесь: [Полный пример CRUD в стиле веб-формы с встроенным связанным объектом в symfony] (http://www.inanzzz.com/index.php/post/djrc/full-webform -style-crud-example-with-in-embedded-associated-entity-in-symfony) – BentCoder

ответ

0

Возможно, это связано с тем, что ваши «сеттеры» не вызываются.

Попробуйте добавить by_reference и установить его в false так:

class ParentType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name') 
      ->add('children', CollectionType::class, array(
      'entry_type' => ChildType::class, 
      'allow_add' => true, 
      'by_reference' => false 

     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Bundle\Entity\Parent' 
     )); 
    } 

} 

У меня нет времени, чтобы на самом деле проверить свой код. Однако вам не придется ставить parent в форму child. Таким образом, ваш childformType должен выглядеть так:

class ChildType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name')  ; 

    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Bundle\Entity\Child' 
     )); 
    } 
} 

Надеюсь, что это поможет.

+0

да, вы правы в том, что вы помещаете родителя в дочерний тип формы, но устанавливаете «by_reference» на false, который все еще не работает. –