2011-12-11 20 views
1

私はSymfony2プロジェクトに2つのエンティティ "User"と "Team"を持っています。 ユーザーは多数のチームを持つことができ、チームは多くのユーザーを持つことができます。多対多の関係で一度にレコードを1つ追加する

チームにプレーヤーを追加する方法は、ユーザーが多数のユーザーを選択して[保存]をクリックしてデータベースに挿入できるselectbox(データベース内のすべてのユーザーを含む)を経由します。

私は

(このボックスは非常に長くなるだろう場合は特に)、利用可能なすべてのユーザーを見ることができるようになるにはログイン中のユーザーを好きではないので、2つのテキストボックスの代わりに、選択ボックスを持っていると思いますこれどうやってするの? 2つのテキストボックス(jqueryオートコンプリートを追加します)と保存ボタンを使用して、2人のユーザーをチームに追加します。

Thx。

編集:

<?php 

namespace Tennisconnect\DashboardBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class TeamType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('player_one', 'text', array('property_path' => false)) 
      ->add('player_two', 'text', array('property_path' => false)) 
     ; 
    } 

    public function getName() 
    { 
     return 'team'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Team'); 
    } 
} 

ChallengeType:

<?php 

namespace Tennisconnect\DashboardBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class ChallengeType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('teams', 'collection', array(
       'type' => new TeamType(), 
       'allow_add' => true 
      )) 
      ->add('place') 
      ->add('date'); 
    } 

    public function getName() 
    { 
     return 'challenge'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Challenge'); 
    } 
} 

答えて

1

ユーザー関連のフィールドを削除し、例えば、あなたのTeamTypeに2つのバインドされていないフィールドを追加します。

$builder->add('new_member_1', 'text', array('property_path' => false)) 
     ->add('new_member_2', 'text', array('property_path' => false)); 

レンダリングされたフォームに2つのテキストフィールドが表示されます。次に、これらのフィールドを読み取ってユーザーを取得し、チームに追加するロジックをコントローラに書き込みます。

// ... controller action 
// first bind request 
$form->bindRequest($request); 
if ($form->isValid()) { 
    // fetch first username 
    $username = $form->get('new_member_1')->getData(); 
    $user = $this->getDoctrine()->getRepository('YourBundle:User')->findOneByUsername($username); 
    $team->addUser($user); 
    // same for second user 
} 

これは最小限の例です。したがって、いくつかのバリデーション、エラー処理などを追加する必要がありますが、それがどのように機能するかを示しています。

編集:

フォームタイプを入れ子にしている場合は、あなたの子供へのパスを降りるによって要素を歩くことができます。

$form->get('outer_type')->get('team_type')->get('new_member_1')->getData(); 
+0

THX :)これは私が探していたものです。しかし、チームフォームが別のフォームに埋め込まれていると、コントローラーのテキストフィールドからデータを取り出す方法はありますか? – mattyh88

+0

latetesを参照してください:) – hacksteak25

+0

私は今これを持っています:$ username = $ form-> get( 'teams') - > get( 'player_one') - > getData(); 'outer_type'の代わりに何を置くべきですか?私はチャレンジエンティティのプロパティを考えていますか?それともTeamTypeですか?両方のオプションが私にエラーを与えています。 – mattyh88

1

これは私がコレクションからデータをフェッチする方法である:答えのための

foreach($form->get('teams') as $team_form) 
{ 
    $player_one = $team_form->get('player_one')->getData(); 
    $player_two = $team_form->get('player_two')->getData(); 
} 
+0

くそー、iterable xDフィードバックのおかげで – hacksteak25