2012-04-23 15 views
8

Ho 3 tipi di modulo in Symfony2Come di aggiungere dinamicamente raccolte nelle collezioni di tipi di moduli di Symfony2

FaultType che è la madre di tutte le prossime collezioni

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

e l'ultimo 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'; 
    } 
} 

Ho trovato l'eccellente articolo link sul prototipo e con un tipo di modulo annidato è molto buono, ma ho un problema quando voglio che questo funzioni con il terzo nido significa PhotoType ... Le foto sono nella collezione di Passi, che è raccolta di errori ..., come posso ottenere in modo dinamico aggiungere/rimuovere foto per i passaggi con questo esempio ...?

risposta

3

Ho creato uno snippet JS che può essere d'aiuto qui. devi solo aggiungere due pulsanti [aggiungi nuovo, elimina ultimo]. https://gist.github.com/juanmf/10483041

può gestire i prototipi ricorsivi/nidificati. È associato a un mediatore (come Symfony Event Dispatcher) che consente di associare i controlli generati agli eventi. Se non hai bisogno del mediatore cancella queste righe:

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

Ti preghiamo di aggiungere il contenuto pertinente che hai collegato alla tua risposta. Vedi: [** Fornisci il contesto per i link **] (http://stackoverflow.com/help/how-to-answer) –

0

Devi rendere il tuo prototipo.

ci sono 2 soluzioni:

  1. Trova con espressioni regolari tutti i segmenti cifra di un property_path, e sostituirli con segnaposto

    $segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches); 
    
  2. utilizzare la ricorsione per trovare genitore raccolta superiore e costruire il percorso manualmente Là.

Hai provato a riordinare gli articoli? Questo è un disastro totale;)

Problemi correlati