2016-07-01 12 views
10

Mam formę podmiotu w Symfony:Symfony: Czy mogę zwrócić wartość null z Type/Form?

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

Ale w przypadku POST_SUBMIT, chcę wrócić zerowej (bez jednostki). testowałem tego, ale nie działa:

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

Czy możesz mi pomóc? Dzięki :)

+2

Czy możesz nam powiedzieć, dlaczego chcesz zwrócić wartość zerową? Jakie jest obejście tego problemu? –

+1

Jeśli formularz jest mapowany do obiektu, przesłany i powiązany, dlaczego chcesz uzyskać od niego wartość zerową? – goto

+0

Jeśli coś jest nie tak, możesz rzucić wyjątek, ale nie wartość zerową. Do sprawdzania poprawności możesz użyć Asserts. Naprawdę, jakie jest obejście tego problemu? –

Odpowiedz

0

Według mojej wiedzy nie można zmienić formularza przesyłania. (Mogę się mylić)

Ale jeśli chcesz zresetować formularz po przedstawienia, można to zrobić w kontrolerze:

Na przykład:

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, 
     [...]); 
} 

Oczywiście, trzeba dostosować go z twój własny kod.

0

Właściwie, jeśli chcesz zmienić dane przekazane w celu utworzenia jednostki, wydarzenie powinno być wysłuchane pod numerem: FormEvents::PRE_SUBMIT. As described in the official doc.

+0

Uważaj na PRE_SUBMIT, aby zmodyfikowad dane z żądania, z którym zostanie zbudowany formularz. Wtedy jesteś ograniczony do pól, które są w formularzu, nie możesz tutaj "unieważnić" formularza globalnie. – romaricdrigon

1

Czy możesz przesłać Ci kod kontrolera? Czy przekazujesz odwołanie do obiektu createForm, czy używasz $form->getData()? W twoim przypadku powinieneś trzymać się drugiego.

Spróbuj użyć zdarzenia SUBMIT zamiast POST_SUBMIT. Jak informuje to dokument Symfony, "można go użyć do zmiany danych ze znormalizowanej reprezentacji danych".

Powiązane problemy