2017-02-09 12 views
0

私はsymfony、UserとTagsに2つのエンティティを持っていますが、各ユーザは多くのタグとの関係にあります。symfonyフォーム、新しいエンティティとエンティティタイプのコレクションを一緒に

私のユーザーのフォームでは、1つ以上のタグを選択して新しいタグを作成できるようにしたいと考えています。

どうすればこの問題を解決できますか?

タグを選択する方法や新しいタグを作成する方法を読んだことがありますが、これは私が望むものではありません。

答えて

0

あまりにもハード1以上ありえないを選択: http://symfony.com/doc/current/reference/forms/types/collection.html

具体的に使用してallow_addallow_deleteprototypeオプションを参照してください。

$builder->add('favorite_cities', CollectionType::class, array(
    'entry_type' => EntityType::class, 
    'entry_options' => array(
     'prototype' => true, 
     'allow_add' => true, 
     'allow_delete' => true, 
     'class' => 'AppBundle:Tag' 
    ), 
)); 

これは、同じコンテキスト内でのタグの作成はもう少しトリッキーです、あなたが存在してタグを追加および削除することができます。あなたができることは、タグ・エンティティを標準入力フィールドを直接使用するのではなく、コントローラ・ループ内でタグが存在するかどうかをチェックし、タグが存在しない場合はそれを関連付けます。ような何か:

// AppBundle/Form/UserType.php 
... 
$builder->add('favorite_cities', CollectionType::class, array(
    'entry_type' => TextType::class, 
    'entry_options' => array(
     'prototype' => true, 
     'allow_add' => true, 
     'allow_delete' => true, 
    ), 
)); 

// AppBundle/Controller/UserController 
... 
public function addFavoriteCitiesAction(Request $request) { 
    $user = ... // However you get your user 
    $form = $this->createForm(UserType::class,$user); 

    if($request->isMethod('POST')) { 
     $form->handleRequest($request); 

     $favCities = $user->getFavoriteCities(); // Should be an array of strings 
     $em = $this->getDoctrine()->getManager(); 
     $tagRepo = $em->getRepository('AppBundle:Tag'); 
     foreach($favCities as $favCity) { 
      $tag = $tagRepo->findOneBy([ 
       'name' => $favCity 
      ]); 
      if(!$tag){ 
       $tag = new Tag(); // AppBundle/Entity/Tag.php ? 
       $tag->setName($favCity); 
       $em->persist($tag); 
      } 
      $user->addTag($tag); 
     } 
     $em->flush(); 
    } 
    return [ 
     'form' => $form->createView(); 
    ]; 

} 

このコードhasntがテストされ、そしてより多く表示され、たとえばことを意図している、私はあなたのセットアップが、それはあなたのために働く必要があるようなものについて少し前提としています。

+0

これは可能な解決策ですが、私が探しているものではありません。私は多くのフィールドや他の関係があるので、私はTagsTypeを手放したいです。 –

+0

@RiccardoCorròあなたはどのようなタグタイプですか?たぶん、これはそれに適応することができますか? – Chausser

+0

はい、できます。しかしそれは管理を複雑にすることがあり、私はsymfonyのフォームの効率を失う可能性があります。 –