1

私が開発しているアプリケーションでよくある問題に遭遇しました。次の 3 つの使用例があります。

オブジェクト作成フォームの後には、オブジェクトが最終状態で表示されるプレビュー ページが続き、作成を終了するためのボタンと、フォームに戻ってオブジェクトを変更するためのボタンが表示されます。

私はすでに典型的なベース作成フローを持っています。フォームを使用して newObject テンプレートをレンダリングする newAction。データをチェックする createAction にデータを送信し、オブジェクトを作成して、showObject アクションにリダイレクトします。

私の大まかな考えは次のとおりです: newAction は、前と同じように、データを createAction に送信するフォームを使用して、newObject テンプレートをレンダリングします。この createAction は、フォームを createAction に再度送信する 2 つのボタンを含む previewObject テンプレートをレンダリングします。ここで、どのボタンが押されたかを確認し、オブジェクトのデータを含むフォームを再度表示するか、作成フローを終了してリダイレクトするかを決定できます。 showObject アクション。

私の問題は次のとおりです。

  1. テンプレート (新規、プレビュー) に応じて表示または非表示にする必要がある 3 つの異なるボタン (プレビュー、編集、および作成) があります。
  2. previewObject テンプレートのフォームは、ボタンを除いてすべて非表示にする必要があります。「プレビュー」オブジェクトを隠しフォームとして渡す必要がありますか、それとも私が見ていない別の方法がありますか?

この機能を実装するには、いくつかのフォームが必要ですか? 1 つのフォームと 2 つのアクションで解決策を考えようとしていますが、それで十分かどうかはわかりません。

これは一般的な使用例ですが、オンラインで例を見つけることができませんでした。

どんな助けでも大歓迎です。

4

1 に答える 1

1

あなたの質問は私の好奇心をかき立て、いくつかの異なることを試しました。コントローラーを使用して単一のフォームと単一のアクションを使用してそれを処理する興味深い方法を思いつきましたが、を呼び出した後にコントローラーでフォームを操作できないため、 を使用するcreateFormBuilder方法が見つかりませんでした。createFormFormType$form = $this->createForm(new NewsletterSignupType());

少しハックな感じがしますが、ここにあります。他に何もないとしても、いくつかのアイデアが得られることを願っています.

class DemoController extends Controller
{
    /**
     * @Route("/", name="newsletter_signup")
     * @Template()
     */
    public function newsletterSignupAction(Request $request)
    {
        $form = $this->getNewsletterSignupForm();

        $form->handleRequest($request);

        if ($form->isValid()) {
            $newButton    = $form->get('new');
            $editButton   = $form->get('edit');
            $createButton = $form->get('create');

            if ($newButton->isClicked()) {
                $form = $this->getNewsletterSignupForm($form->getData(), true);
            }

            if ($editButton->isClicked()) {
                /**
                 * We don't have to do anything here because we are just
                 * returning the original form with the submitted data attached
                 */
            }

            if ($createButton->isClicked()) {
                // User verified data and clicked "Create"
                $response = 'Thank you for signing up!';

                return new Response($response);
            }
        }

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

    /**
     * Handle creating the form and setting fields / buttons and data
     */
    protected function getNewsletterSignupForm($data = null, $previewMode = false)
    {
        $actionUrl = $this->generateUrl('newsletter_signup');

        $formBuilder             = $this->createFormBuilder($data);
        $fieldAttributes         = [];
        $newButtonAttributes     = [];
        $previewButtonAttributes = [];

        if ($previewMode) {
            $fieldAttributes['read_only'] = true;
            $newButtonAttributes['attr']  = ['hidden' => true];
        } else {
            $previewButtonAttributes['attr'] = ['hidden' => true];
        }

        $formBuilder->add('name', 'text', $fieldAttributes)
                    ->add('email_address', 'email', $fieldAttributes)
                    ->add('new', 'submit', $newButtonAttributes)
                    ->add('edit', 'submit', $previewButtonAttributes)
                    ->add('create', 'submit', $previewButtonAttributes);

        $formBuilder->setAction($actionUrl);

        $form = $formBuilder->getForm();

        return $form;
    }
}

コードを表示:

{# Acme:DemoBundle:newsletterSignup.html.twig #}

{% extends 'AcmeDemoBundle::layout.html.twig' %}

{% block content %}
    {{ form(form) }}
{% endblock content %}
于 2013-11-02T22:53:03.787 に答える