当表单提交失败时,会向用户显示相同的webform并显示错误消息,但是当他们点击F5或使用浏览器的后退/前进按钮时,会出现“确认重新提交”弹出窗口。怎么能阻止这个动作?
注意:我曾经在CodeIgniter中使用重定向方法而不会丢失错误消息,但我不知道如何在Symfony中处理相同类型的进程,因为我是新手。但是,任何解决方案都是可以接受的。
控制器:
namespace Se\HirBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Se\HirBundle\Entity\Task;
use Se\HirBundle\Form\Type\TaskType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class TodoController extends Controller
{
public function indexAction()
{
$task = new Task();
$form = $this->createForm(new TaskType(), $task, array('action' => $this->generateUrl('todo_new')));
return $this->render('SeHirBundle:Default:todo.html.twig',
array('page' => 'Todo', 'form' => $form->createView()));
}
public function newAction(Request $request)
{
if ($request->getMethod() == 'POST')
{
$task = new Task();
$form = $this->createForm(new TaskType(), $task, array('action' => $this->generateUrl('todo_new')));
$form->handleRequest($request);
if ($form->isValid())
{
$task = $form->get('task')->getData();
$due = $form->get('due')->getData();
$data = $form->getData();
echo '<pre>'; print_r($data);
return new Response("Well done: $task - $due");
}
else
{
return $this->render('SeHirBundle:Default:todo.html.twig',
array('page' => 'Todo', 'form' => $form->createView()));
}
}
else
{
return new Response('Only POST method accepted');
}
}
}
答案 0 :(得分:0)
错误冒泡true是将所有错误组合在一起的原因。设置此为假。
错误弹出窗口基于您的浏览器。我不确定是否可以通过Symfony关闭。
required => false
应该已经这样做了。
答案 1 :(得分:0)
Trick是将表单数据保存在会话中,并使用存储在同一会话中的数据填充表单类型,以便提交表单失败。数据保持在会话中,直到成功提交表单。
完整的例子在这里:Preventing 'Confirm form resubmission' dialog in symfony applications
/**
* @Route("/interest", service="my_test_bundle.controller.interest")
*/
class InterestController
{
private $formFactory;
private $router;
public function __construct(
FormFactoryInterface $formFactory,
RouterInterface $router
) {
$this->formFactory = $formFactory;
$this->router = $router;
}
/**
* @Method({"GET"})
* @Route("", name="interest_index")
* @Template()
*
* @param Request $request
*
* @return array
*/
public function indexAction(Request $request)
{
$form = $this->createForm();
$session = $request->getSession();
if ($session->has($this->getFormName())) {
$request->request->set(
$this->getFormName(),
unserialize($session->get($this->getFormName()))
);
$request->setMethod('POST');
$form->handleRequest($request);
}
return ['interest_form' => $form->createView()];
}
/**
* @Method({"POST"})
* @Route("", name="interest_create")
*
* @param Request $request
*
* @return RedirectResponse
*/
public function createAction(Request $request)
{
$session = $request->getSession();
$form = $this->createForm();
$form->handleRequest($request);
if ($form->isValid()) {
// Do something with: $form->getData();
$session->remove($this->getFormName());
$routeName = 'home_or_success_route';
} else {
$session->set(
$this->getFormName(),
serialize($request->request->get($this->getFormName()))
);
$routeName = 'interest_index';
}
return new RedirectResponse($this->router->generate($routeName));
}
private function createForm()
{
return $this->formFactory->create(
InterestType::class,
new Interest(),
[
'method' => 'POST',
'action' => $this->router->generate('interest_create'),
'attr' => ['id' => $this->getFormName()],
]
);
}
private function getFormName()
{
return InterestType::NAME;
}
}