2012-11-26 44 views
1

我嘗試實現保存在會話中的表單值。Symfony 2 Forms:將視圖數據存儲在數組中並在稍後恢復條件

1)點擊按鈕 「改變類別」 在會話page1

2)存儲數據

3)重定向到page2

4)執行的一些變化與該保存的表單數據和更新它在會話中

5)重定向回page1並通過會話中存儲的值恢復表格值

$product = new Product; 

$productType = new ProductType; 
$form = $this->createForm($productType, $product); 

//get values from session 
$form_values_in_session = ... 

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

    // if click on change category button 
    if ($request->request->get('category')) { 
     $form_raw_values = $request->get($productType->getName()); 

     $form_values = array(); 
     foreach ($form_raw_values as $form_field_name => $form_field_value) { 
      if ($form->has($form_field_name)) { 
       $form_values[$form_field_name] = $form_field_value; 
      } 
     } 

     // store this data in session 
     // and redirect 
     return $this->redirect($this->generateUrl(); 
    } 

    if ($form->isValid()) { 
     // form submit 
    } 
} else if ($form_values_in_session) { 
    $form->bind($form_values_in_session); 
} 

工作良好,但問題是形式正在驗證後$form->bind($form_values_in_session);調用,我看到頁面上的表單錯誤。

正確的方法是:調用setter爲$product,但在這種情況下,我需要手動轉換視圖數據 - >標準數據 - >模型數據。 Form類中的這種方法是私有的,我需要從方法Form :: viewToNorm,Form :: normToModel等等複製一些代碼。

有沒有更好的方法?

回答

0

這個想法是隻有根形式的表單驗證工作。這意味着我可以將數據綁定爲兒童形式

foreach ($form->all() as $name => $field) { 
    if (isset($form_values_in_session[$name])) { 
     $field->bind($form_values_in_session[$name]); 
    } 
} 
相關問題