2012-04-17 20 views
22

Tengo una order y una entidad client.Formulario de Symfony2: seleccione una entidad o agregue una nueva

Me pregunto si es posible con el sistema de forma Symfony2 real para crear un formulario de pedido que permitirá:

  1. seleccionar varios clientes desde una lista desplegable (mezcla de collection y entity tipo de formulario)
  2. Y para crear nuevos clientes sobre la marcha (la forma predeterminada para el tipo collection) si no está en la lista desplegable.

He visto una forma de hacerlo creando varios formularios en la misma página, pero esta no es la forma en que me gustaría lograrlo.

¿Hay alguna forma mejor de hacerlo?

Respuesta

0

El tipo de formulario collection permite agregar y eliminar sobre la marcha con el atributo allow_add y allow_delete.

Más información siguiendo estos enlaces: 2

Si no te gusta para obtener formularios complementarios en la misma página, puede integrarlos en el diálogo cajas ... Pero definitivamente necesita un formulario para crear nuevos elementos ...

+2

Gracias por su respuesta. Conozco el tipo de 'colección'. Pero tengo la sensación de que puedo agregar y eliminar clientes existentes, o agregar y eliminar clientes nuevos, pero no agregar un cliente existente y crear uno nuevo (por ejemplo) en el mismo formulario. Me equivoco ? Espero que esté claro. –

+0

Supongo que debe diferenciar 'Agregar un cliente existente' de 'Agregar un nuevo cliente' ya que los formularios deben ser diferentes. – AlterPHP

+4

Creo que eso no responde a la pregunta original, que para mí fue: ¿hay alguna manera elegante de agregar objetos existentes o nuevos a una colección? No entiendo por qué esta respuesta fue aceptada. – Julien

1

Si lo he entendido, desea crear y guardar re nuevos clientes en un Formulario "en marcha", por el momento. Creo que tienes que hacer eso usando JavaScript y establecer una acción adicional en tu controlador.

  1. JS -> Capturar el evento para añadir nuevos clientes a su base de datos (es decir, "Añadir nuevo" evento de clic de botón)
  2. JS -> Dentro de este evento, llame a través de AJAX a su controlador con los valores del nuevo cliente (Usar FOSJsRoutingBundle es fácil de hacer)
  3. Symfony2 -> Dentro de su nueva acción, almacene el nuevo cliente en su base de datos.
  4. JS -> evento OnSuccess, en su llamada AJAX, agregue el nuevo cliente a su DropDownBox (ddb.append (nueva etiqueta de elemento)

Sólo haciendo que usted tiene su nuevo cliente almacenada en la base de datos y añadido a su dropdownbox

+0

La idea era crear un menú desplegable que mostrara los clientes existentes, pero también la posibilidad de crear un nuevo cliente (si no está presente en la lista) en la misma forma. Y decidí usar algunos js para lograr este comportamiento. –

1

Por mi parte, tuve el mismo tipo de problema y lo resolví mediante la creación de 2 atributo en mi formType;

Por ejemplo, para usted sería:

customer->entity 
new_customer-> collection 

En el archivo de entidad orden que tendrá que añadir 3 métodos (captador, organismo, y removedor) getter y removedor no hacen nada pero colocador debería llamar al setCustomer(c)

No estoy seguro de si es la mejor manera, ¡pero es la única forma en que lo averiguo!

3

Puede asignar dos campos de un formulario a la misma propiedad utilizando la opción property_path. Luego, usando eventos de formulario, use los datos enviados para tomar una decisión y modifique el formulario de modo que solo uno de los campos tenga una opción mapped que sea true.

+2

Estoy realmente interesado en esta solución, ¿podría darnos un ejemplo detallado? – Wirone

+0

@antony, ¿pueden dar más detalles, por favor? – SteeveDroz

+1

@SteeveDroz Respondí esto hace casi 2 años. Creo que la información que necesita está aquí https://knpuniversity.com/blog/property_path y http://symfony.com/doc/current/components/form/form_events.html. – antony

6

tuve un problema similar que puede conducir a su resolución:

Tengo una relación de categoría y el elemento (Many-to-One) y quería seleccionar un elemento existente o crear un nuevo elemento.

En mi clase Form:

$builder->add('item', 'entity', array(
     'label' => 'Item', 
     'class' => 'ExampleItemBundle:Item', 
    )); 

    $builder->add('itemNew', new EmbedItemForm(), array(
     'required' => FALSE, 
     'mapped' => FALSE, 
     'property_path' => 'item', 
    )); 

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) { 
     $data = $event->getData(); 
     $form = $event->getForm(); 

     if (!empty($data['itemNew']['name'])) { 
      $form->remove('item'); 

      $form->add('itemNew', new EmbedItemForm(), array(
       'required' => TRUE, 
       'mapped' => TRUE, 
       'property_path' => 'item', 
      )); 
     } 
    }); 
+2

Necesita usar EmbedItemForm :: class porque type es string | null en el método add desde Symfony 3 (quizás 2.?). –

+0

Esto funciona bien para mí. Lo modifiqué para que no tuviera que usar dos claves de formulario diferentes. Antes del oyente, uso mi tipo de formulario personalizado. En el oyente solo compruebo si (is_numeric ($ data ['item']) luego elimino el formulario y agrego un formulario EntityType. – mameluc

+0

@patrick Estoy usando exactamente el mismo ejemplo pero por alguna razón estoy obteniendo el error "este formulario no debe contener campos adicionales". Estoy seguro de que se llamó al eventListener para eliminar/agregar los campos correctamente. – Simon

Cuestiones relacionadas