2017-02-08 12 views
1

에서 드롭 다운을받을 양식을 사용하면 사용 가능한 모든 featureTypes의 드롭 다운이 표시됩니다. 하나를 선택하여 제출하고 싶습니다. 심포니 FormType, 내가 featureTypes의 ArrayCollection에 (ManytoMany) 일류 상품으로 내 엔티티 제품을 가지고있는 ArrayCollection

나는 나의 addFeatureTypeToProductType에서 다음과 같이 그것을 시도 :

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

출력이 가능한 모든 FeatureTypes와 드롭 다운입니다. 하지만 선택한 featureType을 제출하면 오류가 발생합니다 : "속성 'featureType'에 대한 액세스 유형을 결정할 수 없습니다."

은 그 때 나는이 방법으로 시도 :

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

을하지만이

내 컨트롤러 작동하지 않습니다 S

편집 : 내 영어

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

미안 여기 있습니다 내 가수/제거제 및 세터/게터 :

/** 
* @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; 
} 

편집 2 : 내 양식의 첫 번째 방법으로 다시 시도했습니다. 하지만 지금은 새로운 오류가 발생합니다. 내 엔터티 "FeatureType"이 contains 메서드를 알지 못하는 이유를 알지 못합니다. Symfony Arraycollection을 사용합니다.

오류 : 클래스 "AppBundle \ Entity \ FeatureType"의 "contains"라는 정의되지 않은 메서드를 호출하려고했습니다.

디버깅 해주기

임 진일보 addFeatureTypes (featureType을 $)에서 멈춘다. 이제 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(); 
} 

내 프런트 엔드 양식에는 내 제품이 이미 갖고있는 모든 featureTypes가 표시됩니다. 그러나 나는 모른다. 새로운 것을 추가하는 방법 ...

+0

)' 폼 타입의'buildForm()'만난다. 벽돌 상자? 'Product' 엔티티의'$ featureTypes' 속성에 대한 getter 및 setter/adder 메서드가 있습니까? – xabbuh

+0

음,이 방법으로 배웠습니다 (getForm()). 그리고 모든 양식에서 작동합니다. 예, getter/setter 및 adder/remover가 있습니다. 내 질문에 추가했습니다. –

+0

죄송합니다. @xabbuh와 (과) 연결을 잊어 버렸습니다. –

답변

0

내 재산의 주석이 틀렸다. 클래스 제품 :

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

클래스 featureType을 :

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

내 양식 :

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

그리고 내 컨트롤러 : 당신은`getForm을 (를 호출 할 이유

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(), 
    ]; 
}