2012-09-25 4 views
7

Symfony 2.0에서 2.1로 업그레이드했습니다. 2.0, 나는 엔티티를 수정하고이 같은 형태로 다시로드하는 데 사용 :Symfony2.1에서 기존 양식의 데이터를 다시로드하거나 지움

$form->setData($entity); 

을하지만이 심포니 2.1 (https://github.com/symfony/symfony/pull/3322)을 더 이상 허용되지 않습니다. 다음과 같은 오류가 발생합니다 :

You cannot change the data of a bound form 

엔티티에 양식을 리바 인딩하거나 데이터를 다시로드하는 방법이 있습니까?

+0

당신이 당신의 솔루션을 게시하시기 바랍니다 수 :

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(), ); } 

그리고 당신의 나뭇 가지에

? – PMoubed

답변

3

글쎄, 폼의 새 인스턴스를 만들고 다시 바인딩 할 수 있습니다. 과잉 공격과 같지만 핀치로 작동합니다.

+0

그래, 그걸 시도했지만 그게 우리가 기본 양식을 가지고 우리가 필요로하는 필드를 유지하기 위해 컨트롤에서 제거 -> 주어진 고통이다. 여전히 나는 다른 방법으로 도움을 준다고 생각하지 않는다. – Ben

+0

@Ben baseForm을 만드는 컨트롤러에서'private function()'을 만들고'-> remove()'를 추가한다. 그런 식으로 다른'$ this-> something()'처럼 간단합니다. – 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()) 
    ); 
} 
, 나는 빈 하나씩«전체»를 전환 할 수 있습니다했던 일을했다 모든 매개 변수를 유지하십시오.

8

성공적인 게시 후 양식을 재설정하는 가장 확실한 방법입니다. 는 "플래시"로 설정, 양식 페이지로 리디렉션이 플래시를 표시합니다

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