你的问题达到了我的好奇心,我尝试了一些不同的东西。想出了一个有趣的方式来处理它使用一个单一的形式和一个单一的行动在控制器中使用createFormBuilder
,但我找不到一种方法使用createForm
与FormType
,因为你不能在调用控制器后操纵表单$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 %}
大,没有关于是哈克的问题,它就像一个魅力。也许有可能创建一个表单类,并在构造函数中传递参数,甚至作为服务注入它们,我也不是专家,但这是一个很好的开始,谢谢! – jmoreno