2012-04-23 14 views
8

tengo 3 tipos de formularios en Symfony2Cómo de añadir dinámicamente colecciones dentro de las colecciones de tipos de formularios de Symfony2

faultType que es el padre de todos los siguientes colecciones

<?php 

namespace My\FaultBundle\Form; 

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

class FaultType extends AbstractType 
{ 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
       ->add('title') 
       ->add('steps', 'collection', array(
        'type' => new StepType(), 
        'allow_add' => true, 
        'prototype' => true, 
        'by_reference' => false, 
       )) 
       ->add('created') 
       ->add('updated') 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Fault' 
     ); 
    } 

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

} 

StepType:

<?php 

namespace My\FaultBundle\Form; 

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

class StepType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('body') 
      ->add('photos', 'collection', array(
       'type' => new PhotoType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'prototype' => true, 
       'by_reference' => false, 
      )) 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Step' 
     ); 
    } 

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

y el último PhotoType:

<?php 

namespace My\FaultBundle\Form; 

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

class PhotoType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('description') 
      ->add('filename') 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Photo' 
     ); 
    } 

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

Encontré excelente artículo link sobre prototipo, y con un tipo de formulario anidado es muy bueno, pero tengo un problema cuando quiero que esto funcione con el tercer nido medio PhotoType ... Las fotos están en la colección de Pasos, que es colección de fallas ..., ¿cómo puedo lograr agregar/eliminar dinámicamente fotos para los pasos con este ejemplo ...?

Respuesta

3

Hice un fragmento de JS que puede ser de ayuda aquí. solo tiene que agregar dos botones [agregar nuevo, eliminar el último]. https://gist.github.com/juanmf/10483041

puede manejar prototipos recursivos/anidados. Se combina con un mediador (igual que el distribuidor de eventos de Symfony) que le permite vincular los controles generados a los eventos. Si no necesita el mediador, elimine estas líneas:

docdigital.mediatorInstance.send(
    docdigital.constants.mediator.messages.clonePrototype_prototypeAdded, 
    $clone 
); 
+0

Considere agregar el contenido relevante que ha vinculado a su respuesta. Ver: [** Proporcione contexto para enlaces **] (http://stackoverflow.com/help/how-to-answer) –

0

Tienes que hacerte tu propio prototipo.

Hay 2 soluciones:

  1. Encuentra con expresiones regulares todos los segmentos de dígitos de un property_path, y reemplazarlos con marcador de posición

    $segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches); 
    
  2. Uso recursividad para encontrar el padre de recogida superior y construir ruta manualmente desde ahí.

¿Has intentado reordenar los artículos? Esto es un desastre total;)

Cuestiones relacionadas