2016-07-01 28 views
10

Ho un modulo di entità con Symfony:Symfony: Posso restituire null da Tipo/Modulo?

class MyType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     ... 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'LogicielBundle\Entity\FichierGroup', 
      'intention' => $this->getName() . '_token' 
     )); 
    } 

Ma nel caso in POST_SUBMIT, voglio restituire null (nessuna entità). Ho provato questo ma non funziona:

$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) { 
     .... my condition ... 
     $event->setData(null); 
    }); 

Mi potete aiutare? Grazie :)

+2

Potresti dirci perché vuoi restituire null? Qual è la soluzione? –

+1

Se un modulo è associato a un oggetto, inviato e associato, perché si desidera ottenere null da esso? – goto

+0

Se qualcosa non va, puoi lanciare un'eccezione, ma non nulla. Per la convalida è possibile utilizzare Assert. Davvero, qual è la soluzione? –

risposta

0

A mia conoscenza non è possibile modificare un modulo di invio. (Potrei sbagliarmi)

Ma se si vuole ripristinare un modulo dopo presentare, si può fare nel controller:

Ad esempio:

public function fooAction() 
{ 
    ... 
    $form = $this->getEntityForm($entity); 

    ... 
    $form->handleRequest($request); 
    if ($form->isSubmitted()) { 
     // Do something 
     ... 
     // Reset your form with null as entity 
     $form = $this->getEntityForm(null);    
    } 

    ... 
    return $this->render(
     'yourfootwig.html.twig', 
     [ 
     'form' => $form->createView(), 
     ... 
     ] 
    ); 
} 

protected function getEntityForm($entity = null) 
{ 
    return $this->createForm(
     'Foo:MyType', 
     $entity, 
     [...]); 
} 

Naturalmente, è necessario adattarlo con il tuo codice.

0

In realtà, se si desidera che i dati di modifica siano passati all'entità modulo, l'evento deve essere ascoltato su FormEvents::PRE_SUBMIT. As described in the official doc.

+0

Attento, su PRE_SUBMIT mdify i dati dalla richiesta, con cui verrà creato il modulo. Quindi sei limitato ai campi che sono nel modulo, non puoi "annullare" il modulo globalmente qui. – romaricdrigon

1

Potresti pubblicare il codice del controller? Passa un riferimento a oggetto a createForm oppure usi $form->getData()? Nel tuo caso, dovresti attenersi al secondo.

Prova a utilizzare l'evento SUBMIT anziché POST_SUBMIT. Come afferma Symfony doc, "Può essere usato per cambiare i dati dalla rappresentazione normalizzata dei dati.".

Problemi correlati