7

Symfony 2.0 から 2.1 にアップグレードしました。2.0 では、エンティティを変更して、次のようにフォームをリロードしていました。

$form->setData($entity);

しかし、これは Symfony 2.1 ( https://github.com/symfony/symfony/pull/3322 )では許可されなくなりました。次のエラーが表示されます。

You cannot change the data of a bound form

フォームをエンティティに再バインドする/データをリロードする方法はありますか?

4

3 に答える 3

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

インスタンス化されたばかりのフォーム オブジェクトのクローンを作成することで、«full» オブジェクトを空のオブジェクトに切り替えて、すべてのパラメーターを保持できます。

于 2013-03-07T16:04:17.030 に答える
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 %}
于 2014-02-28T07:39:55.743 に答える
3

フォームの新しいインスタンスを作成して再バインドすることもできます。やり過ぎのように見えますが、ピンチで機能します。

于 2012-09-26T01:06:08.270 に答える