1

我在开发的应用程序中遇到了一个常见问题,描述了三个用例:

对象创建表单后面必须有一个预览页面,该页面显示对象的最终状态,并带有一个完成创建的按钮,以及一个返回和修改表单的按钮。

我已经有了一个典型的基础创建流程。使用表单呈现 newObject 模板的 newAction,它将数据发送到检查数据、创建对象并重定向到 showObject 操作的 createAction。

我的粗略想法是:newAction 呈现 newObject 模板,并像以前一样使用将数据发送到 createAction 的表单。这个 createAction 渲染了一个带有两个按钮的 previewObject 模板,它们将表单再次发送到 createAction,在那里我可以检查哪个按钮被按下了,我可以决定再次显示带有对象数据的表单,或者完成创建流程并重定向到showObject 动作。

我的问题是:

  1. 根据模板(新建、预览),应显示或隐藏三个不同的按钮(预览、编辑和创建)。
  2. previewObject 模板中的表单必须全部隐藏,按钮除外。“预览”对象是否必须作为隐藏形式传递,还是有另一种我没有看到的方式?

我需要几个表格来实现这个功能吗?我正在尝试用一种形式和两种动作来思考一个解决方案,但我不确定这是否足够。

这是一个常见的用例,但我无法在网上找到示例。

任何帮助,将不胜感激。

4

1 回答 1

1

你的问题激发了我的好奇心,我尝试了一些不同的东西。想出了一种有趣的方法来使用单个表单和单个操作createFormBuilder在控制器中使用它来处理它,但我找不到使用createFormwith a的方法,FormType因为在调用$form = $this->createForm(new NewsletterSignupType());.

感觉有点hacky,但它就是在这里,希望如果没有别的,它会给你一些想法。

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 回答