2012-02-27 63 views
1

我創建了一個過濾器表單來限制列表中顯示的實體。 它通過POST工作,我需要它來記住狀態,因此,當您使用頁面並稍後返回過濾器時,與您離開時相同。在控制器中填寫表格值

我在會話中存儲過濾器,並在沒有使用POST時加載它們。過濾器效果很好。 但表單不顯示值。我triing結合的形式之前更新請求的值,但是這是不工作,我不知道爲什麼......

$filterForm = $this->createForm(new TourFilter($this->container, $destinations)); 
$session = $this->getRequest()->getSession(); 

if ($request->getMethod() == 'POST') { 
    //This is when I get the request (POST) values to do the filtering 

    $filterForm->bindRequest($request); 
    $params = $request->request->get('buv_marketplacebundle_tourfilter'); 

    //in parseFilerParams I do some validation and transforming parameters 
    $filters = $this->parseFilterParams($params, $base_filters); 

    //store current params in the session 
    $session->set('tour_filters', $params); 

} else { 
    //get parameters from the session 
    $params = $session->get('tour_filters'); 

    if (is_array($params) && count($params) > 0) { 
    //update the request with the parameters from the session 
    $request->request->replace(array('buv_marketplacebundle_tourfilter' => $params)); 

    //bind the updated request to the form 
    $filterForm->bindRequest($request); 

    $filters = $this->parseFilterParams($params, $base_filters); 
    } else { 
    $filters = $base_filters; 
    } 
} 

//search for the entities 
$entities = $em->getRepository('BuvMarketplaceBundle:Tour')->getFilteredTours($filters); 

回答

3

的形式 - > bindRequest()方法用於填充表單的基礎數據與來自請求的數據一起分類。當您從else子句調用它時,您將表單綁定到不包含數據的請求,從而有效地清除表單。要手動填寫表單,你需要調用form-> setData()。然後假設你將你的$ filterForm傳遞給render()(我看不到你的整個action方法),你的過濾參數應該被填充。

例如,假設TourFilter是你的過濾器形式的數據類,而不是:

//bind the updated request to the form 
$filterForm->bindRequest($request); 

你需要的東西,如:

// This line can go at the top, use $filterData in the second line 
$filterData = new TourFilter($this->container, $destinations); 
... 
$filterData->setParams($params); 
$filterForm->setData($filterData); 

這可能不是因爲我不完全正確t知道映射到表單的params字段的TourFilter屬性的名稱。

如果您不打算使用$ form-> getData()從窗體中獲取值(在本例中爲'params'),則根本不需要調用form-> bindRequest()。如果表單的基礎數據類是實體並且在將實體持久化到數據庫之前手動保存表單中的應對值,那麼這通常很有用。例如:

$filterForm->bindRequest($request); 
$filterData = $filterForm->getData(); 
$params = $filterData->getParams(); 
+0

好,簡單地說,我不得不推動像$ filterForm-> setData($ params)這樣的數據;而不是像你解釋的bindRequest。有用。 Tranks。 – Sergi 2012-02-27 14:20:42