我有一个控制器,它呈现一个呈现到每个页面的表单。
问题是,表单不关心提交事件。
每个页面都扩展base.html.twig,其中是
{{ render(controller('AppBundle:NewsLetter:formRender')) }}
这是控制器:
<?php
namespace AppBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
use AppBundleEntityEmails;
use SymfonyComponentFormExtensionCoreTypeEmailType;
use SymfonyComponentFormExtensionCoreTypeSubmitType;
class NewsLetterController extends Controller
{
public function formRenderAction(Request $request)
{
$email = new Emails();
$form = $this->createFormBuilder($email)
->add('email', EmailType::class, array('label' => false, 'attr' => array('placeholder' => 'Your e-mail address')))
->add('save', SubmitType::class, array('label' => 'SUBMIT!'))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
die(); //breakpoint
$em = $this->getDoctrine()->getManager();
$em->persist($email);
$em->flush();
$this->addFlash('success', 'Email was successfully saved.');
}
return $this->render('newsLetter.html.twig', array('form' => $form->createView()));
}
}
最后是newsletter.html wig
<div class="newsletter">
<p>Nechte si zasílat články e-mailem</p>
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
</div>
因此,表单被正确地呈现,但在提交之后什么都没有发生。
当你添加一个表单而没有指定操作时,它会发布回呈现它的同一个url。因此,如果你有一个出现在多个页面上的表单,每个控制器函数都必须能够处理该表单。
您可以创建一个具有该功能的基本控制器,并扩展其他控制器。如果您这样做,每个操作方法都必须调用此函数,并且您必须单独处理表单的提交,因为该页面上可能有多个表单
例如$emailAction = $form->get('addEmail')->isClicked(
)
或者,你可以将表单的操作设置为一个专门的路由,只处理该表单,然后可能重定向回原始url(可能将其作为隐藏字段传递,选择权在你)
E.g
$form = $this->createForm(Foo::class, $task, array(
'action' => $this->generateUrl('target_route'),
'method' => 'POST',
));