2013-08-08 12 views
5

Ho delle caselle di controllo e voglio trovare gli elementi con caselle di controllo spuntate e inviarli solo al database. Così ho fatto questo:Utilizzo dell'evento modulo di Symfony per rimuovere alcuni dei dati inviati a un modulo

class NotNeededFieldsSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(FormEvents::PRE_BIND => 'preBindData'); 
    } 

    public function preBindData(FormEvent $event) 
    {  
     $data = $event->getData(); 

     $count = count($data['items']); 

     for ($i=0; $i < $count; $i++){ 
      if (!array_key_exists('enabled', $data['items'][$i])){ 
       unset($data['items'][$i]);    
      } 
     }  

     $event->setData($data); 

    } 
} 

Quando provo a vedere $ event-> getData ha esattamente quello che voglio.

In controllore:?!

$form = $this->formFactory->create(new ItemType(), $item); 

     if ($request->isMethod('POST')) { 
      $form->bind($request);   
       if ($form->isValid()) { 

        $this->em->persist($item); 
        $this->em->flush(); 
       } 
     } 

     return $this->redirect($this->router->generate('home')); 

Il problema è che gli elementi ancora controllati e non controllati sono nel database :(

Tutte le idee perché e come risolvere questo problema Grazie mille in anticipo :)

+0

Vi siete tenuti caso entro ItemType stessa? http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#adding-an-event-subscriber-to-a-form-class – stefancarlton

+0

Sì, ho :(Funziona, l'array di dati è corretto , ma quando controllo il controller, $ item ha ancora tutti i dati: – Faery

+0

ah, stai modificando un record? Disattivando i dati come rimuovendolo non lo sovrascrivi. , con $ dati ['articoli'] [$ i] = 0; – stefancarlton

risposta

0

Come casella di controllo è in realtà una raccolta, forse si dovrebbe fare riferimento a questa parte della documentazione: http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-tags-to-be-removed

specialmente il "D octrine: Garantire la persistenza del database "parte. È necessario rimuovere manualmente le enities ancora memorizzati nel database, ma non nella forma più

 // filter $originalTags to contain tags no longer present 
    foreach ($task->getTags() as $tag) { 
     foreach ($originalTags as $key => $toDel) { 
      if ($toDel->getId() === $tag->getId()) { 
       unset($originalTags[$key]); 
      } 
     } 
    } 

    // remove the relationship between the tag and the Task 
    foreach ($originalTags as $tag) { 
     // remove the Task from the Tag 
     $tag->getTasks()->removeElement($task); 

     // if it were a ManyToOne relationship, remove the relationship like this 
     // $tag->setTask(null); 

     $em->persist($tag); 

     // if you wanted to delete the Tag entirely, you can also do that 
     // $em->remove($tag); 
    } 
Problemi correlati