2017-02-08 4 views
1

i mein Entity Produkt haben mit einer Arraycollection von feature (ManyToMany) -Klasse Artikel:Symfony Formtype, erhalten Dropdown von Arraycollection

/** 
* @var FeatureType 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\FeatureType", mappedBy="products") 
*/ 
private $featureTypes; 

public function __construct() 
{ 
    $this->variants = new ArrayCollection(); 
    $this->featureTypes = new ArrayCollection(); 
} 

Klasse Feature:

/** 
* @var Product[]|ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Product", inversedBy="featureTypes") 
* @ORM\JoinTable(name="products_featureTypes") 
*/ 
private $products; 

Jetzt möchte ich eine erstellen form, die mir ein Drop-Down aller verfügbaren featureTypes geben. Ich möchte einen auswählen und einreichen.

Ich habe versucht, es so in meinem addFeatureTypeToProductType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('featureTypes', EntityType::class, [ 
      'class' => FeatureType::class, 
      'choice_label' => 'name', 
     ]) 
     ->add('submit', SubmitType::class) 
     ->getForm(); 
} 

Der Ausgang die Dropdown mit allen verfügbaren Features ist. Aber wenn ich den ausgewählten FeatureType einreiche, erhalte ich einen Fehler: "Der Zugriffstyp für die Eigenschaft 'FeatureType' konnte nicht bestimmt werden".

Dann habe ich versucht, auf diese Weise:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('featureTypes', CollectionType::class, [ 
      'entry_type' => FeatureType::class, 
      'allow_add' => true, 
     ]) 
     ->add('submit', SubmitType::class) 
     ->getForm(); 
} 

Aber das ist nicht

My-Controller funktioniert:

public function addFeatureTypeAction(Request $request, Product $product) 
{ 
    $form = $this->createForm(AddFeatureTypeToProductType::class, $product, [ 
     'action' => $this->generateUrl('admin_products_add_featureTypes', [ 
      'product' => $product->getId() 
     ]) 
    ]); 

    $form->handleRequest($request); 


    if($form->isSubmitted() && $form->isValid()) { 
     $featureType = $form->get('featureTypes'); 
     $product->addFeatureTypes($featureType); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($product); 
     $em->flush(); 

     return $this->redirectToRoute('admin_products_list_all'); 
    } 

    return [ 
     'form' => $form->createView() 
    ]; 
} 

Sorry für mein Englisch: S

EDIT: Hier sind Mein Addierer/Entferner und Setter/Getter:

/** 
* @return FeatureType 
*/ 
public function getFeatureTypes() 
{ 
    return $this->featureTypes; 
} 

/** 
* @param FeatureType $featureTypes 
*/ 
public function setFeatureTypes($featureTypes) 
{ 
    $this->featureTypes = $featureTypes; 
} 


/** 
* Add new FeatureType 
* 
* @param FeatureType $featureType 
* 
* @return Product 
*/ 
public function addFeatureTypes($featureType) 
{ 
    if (!$this->featureTypes->contains($featureType)) { 
     $this->featureTypes->add($featureType); 
    } 

    return $this; 
} 

/** 
* @param FeatureType $featureType 
* 
* @return Product 
*/ 
public function removeFeatureTypes($featureType) 
{ 
    if ($this->featureTypes->contains($featureType)) { 
     $this->featureTypes->remove($featureType); 
    } 

    return $this; 
} 

EDIT 2: Ich habe es wieder mit dem ersten Weg meines Formulars versucht. Aber ich bekomme jetzt einen neuen Fehler. Ich weiß nicht, warum meine Entität "FeatureType" die Methode contains nicht kennt. Es verwendet die Symfony Arraycollection

Fehler: Versucht, eine undefinierte Methode namens "enthält" der Klasse "AppBundle \ Entity \ FeatureType" aufzurufen.

Debuggen stoppt in addFeatureTypes ($ feature)

Im einen Schritt jetzt weiter. Jetzt verwende ich den collectionType.

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('featureTypes', CollectionType::class, [ 
      'entry_type' => FeatureTypeType::class, 
      'allow_add' => true, 
     ]) 
     ->add('submit', SubmitType::class) 
     ->getForm(); 
} 

Mein Frontend-Formular zeigt alle FeatureTypes, die mein Produkt bereits hat. Aber ich weiß nicht, wie auch ein neues hinzufügen ...

+0

Warum nennst du 'getForm()' Innerhalb des Formtyps ist 'buildForm()' erfüllt Hallo? Haben Sie Getter- und Setter-/Addiermethoden für die '$ featuretTypes' -Eigenschaft Ihrer' Product'-Entität? – xabbuh

+0

Nun, ich habe es auf diesem Weg gelernt (getForm()). Und es funktioniert in allen Formen. Ja, ich habe Getter/Setter und Addierer/Remover, ich habe es zu meiner Frage hinzugefügt :) –

+0

Sorry, vergessen, @xabbuh zu verknüpfen –

Antwort

0

Die Annotation meiner Eigenschaften war falsch. -Klasse Artikel:

/** 
* @var FeatureType[]|ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\FeatureType", inversedBy="products", cascade={"persist"}) 
* @ORM\JoinTable(name="products_featureTypes") 
*/ 
private $featureTypes; 

Klasse Feature:

/** 
* @var Product[]|ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Product", mappedBy="featureTypes", cascade={"persist"}) 
* 
*/ 
private $products; 

Meine Form:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('featureTypeToAdd', EntityType::class, [ 
      'class'  => FeatureType::class, 
      'choice_label' => 'name', 
      'mapped'  => false, 
     ]) 
     ->add('submit', SubmitType::class) 
     ->getForm(); 
} 

Und mein Controller:

public function addFeatureTypeAction(Request $request, Product $product) 
{ 
    $form = $this->createForm(AddFeatureTypeToProductType::class, $product, [ 
     'action' => $this->generateUrl('admin_products_add_featureTypes', [ 
      'product' => $product->getId(), 
     ]), 
    ]); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $featureType = $form->get('featureTypeToAdd')->getData(); 
     $em = $this->getDoctrine()->getManager(); 
     $product->addFeatureTypes($featureType); 
     $em->persist($product); 
     $em->flush(); 

     return $this->redirectToRoute('admin_products_list_all'); 
    } 

    return [ 
     'form' => $form->createView(), 
    ]; 
} 
Verwandte Themen