1

サイトの多くのページに表示されるお問い合わせフォームがあります。このフォームを多くの異なるコントローラーで処理する必要があります。このすべてのコントローラーでこのフォームを処理する方法は? このフォームを処理するために特別なルートとコントローラーを定義したくありません。レンダリングされるすべてのページで処理する必要があります。

今、私はコントローラーアクションウィッチを呼び出して、フォームをそのようにレンダリングしています:

コントローラーで:

    $profileAskFormResponse = $this->forward('MyBundle:Profile:profileAskForm', array(
                'user' => $user,
            ));          
    if ($profileAskFormResponse->isRedirection())
                return $profileAskFormResponse;

    return $this->render(MyBundle:Single:index.html.twig', array(
                'myStuff' => $myStuff,
                'profileAskForm' => $profileAskFormResponse,
   ));

そして小枝で:

{{ profileAskForm.content|raw }}

お問い合わせフォームを処理するために必要な各コントローラーでこのコードを使用しています。これを行う簡単な方法はありますか?私の最初のアイデアは、小枝でこの種のことをすることでした:

{% render 'MyBundle:Profile:profileAskForm' with {request: app.request, user: user} %}

しかし、フォーム送信後にそこからリダイレクトできませんでした。ポイントは、簡単で迅速な呼び出し方法があるかどうかです (たとえば、

小枝から)私の連絡先フォームのようなこの種のコンポーネント、いくつかのものをレンダリングするだけでなく、いくつかのものを持っているコンポーネント

その中のアプリケーションロジック。そんなコンポーネントを、どこにでも簡単に置けるブリックの魔女として使っていただけたら嬉しいです。

4

1 に答える 1

0

1 つの可能性はContact.php、クラス メンバーとしてすべてのフィールドを持つようなクラスを作成することです。次に、各フィールドにアサートを非常に簡単に追加できます。

/**
  * @Assert\NotBlank(message="Please fill in your e-mail at least")
  * @Assert\Email(checkMX = true)
  */
protected $email;

このクラスのフォーム タイプを作成して、その中でContactType.php使用FormBuilderすることができます。

$builder->add('email', 'email', array('label' => 'E-mail'));

すべてのコントローラーで、フォームを再利用できます。送信するすべての電子メールを処理する電子メール クラスを使用して拡張し、有効なコンタクト フォームを挿入することもできます。

$contact = new Contact();
$form = $this->createForm(new ContactType(), $contact);

if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);

    if ($form->isValid()) {
        // now you can easily inject the class to the one that handles e-mail traffic for example
        $email = new Email();
        $email->sendContactForm($contact);
    }
}

詳細については、Symfony2 クックブック: フォームを参照してください。

于 2013-03-01T20:08:54.943 に答える