2012-05-12 19 views
11

Así que tengo mi acción del controlador similar a estemúltiples formas de mismo tipo - Symfony 2

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

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

Y digamos que mi MiFormulario tiene dos campos

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

Parece que desde que las dos formas son del mismo tipo MyForm, cuando se representan en las vistas, sus campos tienen el mismo nombre e ID (los campos 'nombre' de dos formularios comparten el mismo nombre e ID; lo mismo ocurre con los campos 'nota'), debido a lo cual Symfony no puede enlazar los datos de los formularios correctamente. ¿Alguien sabe alguna solución a esto?

Respuesta

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

Ahora usted debería ser capaz de establecer un ID diferente para cada instancia del formulario que cajón .. Esto debe resultar en <input type="text" id="foobar_field_0" name="foobar[field]" required="required> y así sucesivamente.

+0

Exactamente mi pensamiento. ¡Gran respuesta! –

7

me gustaría utilizar una estática para crear el nombre

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

continuación, puede crear tantos como se desee sin tener que configurar el nombre cada vez.

+1

Esta es la mejor respuesta. – Stan

+0

Es una buena respuesta, gracias. Pero me pregunto si se puede escalar correctamente con una gran cantidad de usuarios. –

+0

@ThomasLeduc Es muy poco probable que la cantidad de usuarios sea un problema con este tipo de patrón. La variable $ count se inicializará solo una vez por solicitud y se incrementará tantas veces como se haya creado en una solicitud. Incluso si tuviera miles de formularios, la variable no debería ser un problema (supongo que tendría otro tipo de problemas) – Julien

0

crear un único nombre de dinámica:

const NAME = "your_name"; 

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

su nombre siempre es sencillo

3

EDIT: No hagas eso! Ver este lugar: http://stackoverflow.com/a/36557060/6268862

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

Ahora la primera instancia del formulario en la página tendrá "my_custom_form_0" como su nombre (lo mismo para los nombres de campo y los ID), el el segundo "my_custom_form_1", ​​...

+0

Debo señalar que probablemente esta sea la mejor idea, porque cuando envíe su formulario, el el recuento se inicializará y, por lo tanto, el formulario ** no ** se enviará realmente (diferencia entre el nombre del formulario y los datos en la solicitud). Uno debería utilizar el método createNamedBuilder como se explica aquí: http://stackoverflow.com/a/36557060/6268862 – peamak

+0

en Symfony3, un constructor ya no está permitido en un tipo de formulario – Zwen2012

+0

createNamedBuilder trabajó para mí también – Sam