2012-09-25 7 views
7

में मौजूदा फ़ॉर्म में डेटा को फिर से लोड या साफ़ करें हम सिम्फनी 2.0 से 2.1 तक अपग्रेड किए गए हैं। 2.0 के साथ, मैं इकाई को संशोधित करने और इस तरह के फार्म को फिर से लोड करने के लिए इस्तेमाल:Symfony2.1

$form->setData($entity); 

लेकिन यह अब और Symfony 2.1 (https://github.com/symfony/symfony/pull/3322) के साथ अनुमति नहीं है। मुझे निम्न त्रुटि मिलती है:

You cannot change the data of a bound form 

क्या इकाई को फॉर्म को पुन: स्थापित करने/डेटा को फिर से लोड करने का कोई तरीका है?

+0

आप अपने समाधान पोस्ट कर सकते हैं? – PMoubed

उत्तर

3

ठीक है, आप फॉर्म का एक नया उदाहरण बना सकते हैं और फिर से बांध सकते हैं। ओवरकिल की तरह लगता है, लेकिन यह एक चुटकी में काम करेगा।

+0

हाँ मैंने कोशिश की थी लेकिन यह एक दर्द है कि हमारे पास आधारभूत रूप है और इसका उपयोग करें -> हमें आवश्यक फ़ील्ड रखने के लिए नियंत्रक में हटा दें। फिर भी मुझे नहीं लगता कि आपकी मदद के लिए धन्यवाद एक और तरीका है – Ben

+0

@बेन नियंत्रक पर 'निजी फ़ंक्शन()' बनाएं जो बेसफॉर्म बनाता है, और '-> निकालें() 's जोड़ता है। इस तरह यह एक और '$ यह-> कुछ()' के रूप में सरल है। – Rixius

11

मैं कुछ है कि चाल ... अगर यह सबसे अच्छा तरीका है पता नहीं है लेकिन ...

public function contactAction(Request $request){ 
    $task = new myBundle(); 

    $form = $this->createFormBuilder($task) 
     ->add('email', 'text', array('label'=>'E-mail')) 
     ->add('message', 'textarea') 
     ->add('newsletter', 'checkbox', array('label'=>'blabla','required'=>false)) 
     ->getForm(); 

    $cloned = clone $form; 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 
     if ($form->isValid()) { 
      [... code ...] 
      $form = $cloned; 
     } 
    } 
    return $this->render(
     'myBundle:Default:contact.html.twig', 
      array('form' => $form->createView()) 
    ); 
} 

सिर्फ instanciated प्रपत्र वस्तु क्लोनिंग करके, मैं स्विच कर सकते हैं खाली एक के बाद «पूर्ण» एक किया था, और सभी पैराम रखो।

8

और सफल पोस्ट के बाद फ़ॉर्म को रीसेट करने का सबसे स्पष्ट तरीका। एक "फ़्लैश" सेट, प्रपत्र पृष्ठ पर रीडायरेक्ट और फ्लैश प्रदर्शित:

public function contactAction(Request $request) 
{ 
    $contact = new Contact(); 
    $form = $this->createForm(new ContactType(), $contact); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     //... 

     $session = $this->container->get('session'); 
     $session->getFlashBag()->set('success', 'Your message has been sent.'); 

     return $this->redirect($this->get('router')->generate('contact')); 
    } 

    return array(
     'form' => $form->createView(), 
    ); 
} 

और अपने टहनी में:

{% if app.session.flashBag.has('success') %} 
    {{ app.session.flashBag.get('success')[0] }} 
{% endif %}