2016-12-06 10 views
1

So habe ich OneToMany Beziehung zwischen zwei Entitäten, und ich habe das zugehörige Formular erstellt, aber es scheint, dass die FormBuilder, nach dem Senden von Daten, nicht die Kinder der sehen Entität.
Übergeordnete Klasse:Symfony: Form Builder nicht OneToMany Eingänge

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; 
} 

Kinderklasse:

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; 
} 

Dies ist 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' 
     )); 
    } 

} 

Kind 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' 
     )); 
    } 
} 

Danach habe ich meine Form in der Steuerung wie folgt erstellt:

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())); 


     } 
} 

Natürlich habe ich die Kinder bin zu schaffen mit Jquery von Daten-Prototyp zur Verfügung gestellt von Symfony FormBuilder, aber die Form sieht sie nicht !!
Was fehlt mir hier?

+0

Sie können 'query_builder' -Eigenschaft wie hier gezeigt verwenden: [Vollständiges CRUD-Beispiel im Webform-Stil mit einer eingebetteten assoziierten Entität in Symfony] (http://www.inanzzz.com/index.php/post/djrc/full-webform -style-crud-example-with-embedded-assoziierte-entity-in-symfony) – BentCoder

Antwort

0

Es könnte sein, weil Ihre 'Setter' nicht aufgerufen werden.

Versuchen Hinzufügen by_reference und es false wie diese Einstellung:

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' 
     )); 
    } 

} 

Ich habe keine Zeit, um tatsächlich den Code zu testen. Sie sollten jedoch parent in Ihrem child Formular nicht eingeben müssen. So sollte Ihr Kind formType wie folgt aussehen:

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' 
     )); 
    } 
} 

Hoffe es hilft.

+0

Ja, Sie haben recht, wenn Sie den Eltern-Typ in den Child-Formulartyp setzen, aber die Einstellung "by_reference" auf false immer noch nicht funktioniert. –