2012-05-12 17 views
11

だから私はこの複数のフォーム - symfonyの2

$task1 = new Task(); 
$form1 = $this->createForm(new MyForm(), $task1); 

$task2 = new Task(); 
$form2 = $this->createForm(new MyForm(), $task2); 

に似て私のコントローラのアクションを持っているのは、私のMyFormを2つのフィールド

//... 
$builder->add('name', 'text'); 
$builder->add('note', 'text'); 
//... 

それは二つの形式であるためのように思えるがあるとしましょう同じタイプのMyFormのビューでレンダリングされると、フィールドの名前とIDは同じです(2つのフォームの 'name'フィールドは同じ名前とIDを共有します;同じことが 'note'フィールドになります)。 symfonyはフォームのデータを正しくバインドできません。誰もがこれに対する解決策を知っていますか?

// you controller 

$entity = new Entity(); 
$request = $this->getRequest(); 

$formType = new myType(); 
$formType->setName('foobar'); 
// or new myType('foobar'); if you set it in the constructor 

$form = $this->createForm($formtype, $entity); 

答えて

18
// your form type 
class myType extends AbstractType 
{ 
    private $name = 'default_name'; 
    ... 
    //builder and so on 
    ... 
    public function getName(){ 
     return $this->name; 
    } 

    public function setName($name){ 
     $this->name = $name; 
    } 

    // or alternativ you can set it via constructor (warning this is only a guess) 

    public function __constructor($formname) 
    { 
     $this->name = $formname; 
     parent::__construct(); 
    } 

は}今あなたはクレートに..このように<input type="text" id="foobar_field_0" name="foobar[field]" required="required>とをもたらすはずフォームのインスタンスごとに異なるIDを設定することができなければなりません。

+0

まさに私の考え。素晴らしい答え! –

7

私は、あなたが名前を毎回設定しなくても、あなたは好きなだけ作成することができます名前

// your form type 

    class myType extends AbstractType 
    { 
     private static $count = 0; 
     private $suffix; 
     public function __construct() { 
      $this->suffix = self::$count++; 
     } 
     ... 
     public function getName() { 
      return 'your_form_'.$this->suffix; 
     } 
    } 

を作成するために、静的を使用します。

+1

これは最高の答えです。 – Stan

+0

これは良い答えです。しかし、私はそれが大量のユーザーと正確に拡大縮小できるかどうか疑問に思っていますか? –

+0

@ThomasLeducこの種類のパターンでは、ユーザーの量が問題になることはほとんどありません。変数$ countはリクエストごとに1回だけ初期化され、1回のリクエストでフォームが作成された回数だけインクリメントされます。何千ものフォームがあっても変数は問題ではないはずです(しかし、他の種類の問題があると思います) – Julien

0

は、単一の動的な名前を作成します。

const NAME = "your_name"; 

public function getName() 
{ 
    return self::NAME . '_' . uniqid(); 
} 

あなたの名前は常に単一である

3

EDIT:それをしないでください!代わりに、これを参照してください:symfonyの3.0ではhttp://stackoverflow.com/a/36557060/6268862

class MyCustomFormType extends AbstractType 
{ 
    private $formCount; 

    public function __construct() 
    { 
     $this->formCount = 0; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     ++$this->formCount; 
     // Build your form... 
    } 

    public function getBlockPrefix() 
    { 
     return parent::getBlockPrefix().'_'.$this->formCount; 
    } 
} 

今ページ上のフォームの最初のインスタンスは、その名の通り「my_custom_form_0」を持つことになります(フィールドの名前とIDも同じ)、 2番目の「my_custom_form_1」、...

+0

フォームを提出すると、カウントは初期化されるので、フォームは実際には提出されません**(フォーム名と要求のデータの差)。 代わりに、ここで説明したcreateNamedBuilderメソッドを使用する必要があります。http://stackoverflow.com/a/36557060/6268862 – peamak

+0

Symfony3では、コンストラクタはフォームタイプでは使用できません – Zwen2012

+0

createNamedBuilderも私のために働いています – Sam

関連する問題