2013-04-26 266 views
2

我在Symfony2框架中有一個表單。成功提交頁面時,它呈現另一個樹枝模板文件,並通過傳遞數組中的參數來返回值。但提交後,如果我刷新頁面,它又提交表單並創建表格條目。這裏是提交在控制器後執行的代碼,Symfony2表單提交頁面刷新

$this->get('session')->setFlash('info', $this->get('translator')->trans('flash.marca')); 

return $this->render('NewBundle:Backend:marca.html.twig', array(
             'active' => 1, 
             'marca' => $marca, 
             'data' => $dataCamp, 
             'dataMarca' => $this->getMarcas($admin->getId()), 
             'admin' => $admin, 
      )); 

我想要的形式被重定向到的參數與上面提到的警告消息中提到那裏的樹枝文件。但我不希望表單在頁面刷新時提交。

感謝

回答

2

您應該保存提交的數據會話和重定向用戶。然後,您可以根據需要儘可能多地刷新頁面,而無需額外提交。 示例代碼 - 你的行動的算法應該是相似的:

... 
/** 
* @Route("/add" , name="acme_app_entity_add") 
*/ 
public function addAction() 
{ 
    $entity = new Entity(); 
    $form = $this->createForm(new EntityType(), $entity); 
    $session = $this->get('session'); 

// Check if data already was submitted and validated 
if ($session->has('submittedData')) { 
    $submittedData = $session->get('submittedData'); 
    // There you can remove saved data from session or not and leave it for addition request like save entity in DB 
    // $session->remove('submittedData'); 

    // There your second template 
    return $this->render('AcmeAppBundle:Entity:preview.html.twig', array(
     'submittedData' => $submittedData 
     // other data which you need in this template 
    )); 
} 

if ($request->isMethod('POST')) { 
    $form->bindRequest($request); 

    if ($form->isValid()) { 
     $this->get('session')->setFlash('success', 'Provided data is valid.'); 
     // Data is valid so save it in session for another request 
     $session->set('submittedData', $form->getData()); // in this point may be you need serialize saved data, depends of your requirements 

     // Redirect user to this action again 
     return $this->redirect($this->generateUrl('acme_app_entity_add')); 
    } else { 
     // provide form errors in session storage 
     $this->get('session')->setFlash('error', $form->getErrorsAsString()); 
    } 
} 

return $this->render('AcmeAppBundle:Entity:add.html.twig', array(
    'form' => $form->createView() 
)); 
} 

重定向到同一個頁面是防止更多的數據提交。所以這個例子的精益修改你的行爲,你會沒事的。 而是保存會話中的數據,您可以通過重定向請求傳遞它。但我認爲這種方法更加困難。

0
  1. 保存數據(會話/ DB /無論你想它保存)
  2. 重定向到一個新的行動,在行動以便在檢索新數據,並繪製模板

這樣,刷新新動作,只刷新模板,因爲保存你的數據發生在前面的動作

明白嗎?

所以基本上取代你

return $this->render.... 

通過

return $this->redirect($this->generateUrl('ROUTE_TO_NEW_ACTION'))); 

,並在這個新的動作,你把你的

return $this->render.... 
3

這爲我工作:

return $this->redirectToRoute("route_name"); 
+0

工程就像一個魅力! – Keutelvocht 2017-09-05 10:58:35