2012-05-12 8 views
11

So habe ich mein Controller-Aktion ähnlich wie dieseMehrere Formen von gleicher Art - Symfony 2

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

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

Und lassen Sie uns sagen, dass meine MyForm hat zwei Felder

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

Es scheint so, da die beiden Formen sind vom gleichen Typ MyForm, wenn sie in den Ansichten gerendert werden, haben ihre Felder denselben Namen und dieselben IDs (die 'Name'-Felder von zwei Formularen haben denselben Namen und dieselbe ID; das gleiche gilt für die' Notiz'-Felder) Symfony kann die Daten der Formulare nicht korrekt binden. Kennt jemand eine Lösung dafür?

Antwort

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

}

// 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); 

jetzt sollten Sie für jede Instanz des Formulars Sie Kiste eine andere ID einstellen können, .. dies in <input type="text" id="foobar_field_0" name="foobar[field]" required="required> führen sollte und so weiter.

+0

Genau mein Gedanke. Gute Antwort! –

7

würde ich eine statische verwenden, um den Namen, den Sie

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

dann so viele erstellen können zu erstellen, wie Sie wollen, ohne jedes Mal den Namen zu setzen.

+1

Dies ist die beste Antwort. – Stan

+0

Es ist eine gute Antwort, thx. Aber ich frage mich, ob es mit einer großen Menge Benutzer richtig skalieren kann? –

+0

@ThomasLeduc Es ist sehr unwahrscheinlich, dass die Anzahl der Benutzer ein Problem mit dieser Art von Muster sein wird. Die Variable $ count wird nur einmal pro Anfrage initialisiert und so oft erhöht, wie Sie das Formular in einer Anfrage erstellt haben. Selbst wenn Sie Tausende von Formularen hatten, sollte die Variable kein Problem sein (aber Sie würden dann andere Probleme haben, denke ich) – Julien

0

schaffen einen einzigen dynamischen Name:

const NAME = "your_name"; 

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

Ihr Name ist immer einzelne

3

EDIT: Tu das nicht! Sehen Sie stattdessen: http://stackoverflow.com/a/36557060/6268862

In Symfony 3.0:

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

Nun ist die erste Instanz des Formulars auf der Seite haben "my_custom_form_0" wie der Name (gleich für Feldnamen und IDs), die zweite "my_custom_form_1", ​​...

+0

Ich sollte beachten, dass dies wahrscheinlich die beste Idee ist, denn wenn Sie Ihr Formular absenden, wird das count wird initialisiert und daher wird das Formular ** nicht ** tatsächlich gesendet (Differenz zwischen dem Formularnamen und den Daten in der Anfrage). Man sollte stattdessen die createNamedBuilder-Methode verwenden, wie hier erklärt: http://Stackoverflow.com/a/36557060/6268862 – peamak

+0

in Symfony3, ein Konstruktor ist nicht mehr in einem Formulartyp zulässig – Zwen2012

+0

createNamedBuilder funktionierte auch für mich – Sam