2012-04-17 6 views
22

I have an order e un'entità client.Symfony2 Form: selezionare un'entità o aggiungerne una nuova

Mi chiedo se è possibile con il sistema di modulo Symfony2 reale per creare un modulo d'ordine che permetterà di:

  1. Seleziona più clienti da un menu a discesa (mix di collection e entity tipo di modulo)
  2. E per creare nuovi clienti al volo (il modo predefinito per il tipo collection) se non nell'elenco a discesa.

Ho visto un modo per farlo creando più moduli nella stessa pagina, ma questo non è il modo in cui mi piacerebbe realizzarlo.

Esistono modi migliori per farlo?

risposta

0

Il tipo di modulo collection consente di aggiungere ed eliminare al volo l'attributo allow_add e allow_delete.

Maggiori informazioni seguendo questi link: 2

Se non ti piace per ottenere formulari complementari sulla stessa pagina, è possibile integrarli nella finestra di dialogo scatole ... Ma hai sicuramente bisogno di un modulo per creare nuovi oggetti ...

+2

Grazie per la risposta. Sono a conoscenza del tipo 'collection'. Ma ho la sensazione di poter aggiungere ed eliminare client esistenti o aggiungere ed eliminare nuovi client, ma non aggiungere un client esistente e crearne uno nuovo (ad esempio) nella stessa forma. Ho sbagliato ? Spero sia chiaro. –

+0

Suppongo che devi diferrenciate 'Aggiungi un client esistente' da 'Aggiungi un nuovo client' in quanto i moduli devono essere diversi. – AlterPHP

+4

Credo che non risponda alla domanda originale, che per me era: esiste un modo elegante per aggiungere oggetti esistenti o nuovi a una collezione? Non capisco perché questa risposta è stata accettata. – Julien

1

Se ho capito, tu vuoi creare e sto re nuovi clienti in una forma "on fly", al momento. Penso che devi farlo usando JavaScript e impostare un'azione aggiuntiva nel tuo controller.

  1. JS -> catturare l'evento per aggiungere nuovo client per voi database (vale a dire "Aggiungere un nuovo" evento click del pulsante)
  2. JS -> All'interno di questo evento, chiamare tramite la tecnologia AJAX per il controller con i valori del nuovo cliente. (Usare FOSJsRoutingBundle è facile)
  3. Symfony2 -> All'interno della nuova azione, memorizzare il nuovo client nel database.
  4. JS -> evento OnSuccess, nella chiamata AJAX, aggiungere il nuovo client al proprio DropDownBox (ddb.append (tag nuovo elemento)

Solo facendo che hai il tuo nuovo cliente memorizzate nel database e aggiunto al tuo dropdownbox

+0

L'idea era di creare un menu a discesa che mostra i client esistenti, ma anche la possibilità di creare un nuovo client (se non presente nell'elenco) nella stessa forma. E ho deciso di usare alcune js per ottenere questo comportamento. –

1

Da parte mia ho avuto lo stesso tipo di problema e ho risolto con la creazione di 2 attributo nel mio formType;

Ad esempio, per te sarebbe:

customer->entity 
new_customer-> collection 

Nel file entità ordine si dovrà aggiungere 3 metodi (getter, setter, e di rimozione) getter e di rimozione non fanno altro che setter dovrebbe chiamare il setCustomer(c)

Non sono sicuro che sia il modo migliore ma è l'unico modo in cui lo capisco!

3

È possibile associare due campi di un modulo alla stessa proprietà utilizzando l'opzione property_path. Quindi, utilizzando gli eventi del modulo, utilizzare i dati inviati per prendere una decisione e modificare il modulo in modo che solo uno dei campi abbia un'opzione che sia true.

+2

Sono davvero interessato a questa soluzione, potresti fornire un esempio dettagliato? – Wirone

+0

@antony, puoi elaborare, per favore? – SteeveDroz

+1

@SteeveDroz Ho risposto a questo quasi 2 anni fa. Penso che le informazioni richieste siano tutte qui https://knpuniversity.com/blog/property_path e http://symfony.com/doc/current/components/form/form_events.html. – antony

6

Ho avuto un problema simile che può portare alla risoluzione:

ho un rapporto Categoria e Prodotto (Many-to-One) e volevo sia selezionare un elemento esistente o di creare un nuovo elemento.

Nella mia classe 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

È necessario utilizzare EmbedItemForm :: class come type è stringa | null nel metodo add di symfony 3 (forse 2.?). –

+0

Questo funziona bene per me. L'ho appena modificato in modo da non dover utilizzare due diversi form key. Prima dell'ascoltatore uso il mio tipo di modulo personalizzato. Nell'ascoltatore ho solo controllato se (is_numeric ($ data ['item']), quindi rimuovo il modulo e aggiungo un modulo EntityType. – mameluc

+0

@patrick Sto usando lo stesso esatto esempio ma per qualche motivo sto ricevendo l'errore "questo modulo non dovrebbe contenere campi extra". Sono sicuro che eventListener è stato chiamato per rimuovere/aggiungere i campi correttamente. – Simon

Problemi correlati