我创建了一个过滤器表单来限制列表中显示的实体。 它通过POST工作,我需要它来记住状态,所以当你离开页面并稍后返回过滤器时,就像你离开时一样。
我将过滤器存储在会话中,并在没有使用POST时加载它们。过滤器效果很好。 但表单不显示值。我正在尝试在绑定表单之前更新请求值,但这不起作用,我不知道为什么......
$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);
答案 0 :(得分:3)
form-> bindRequest()方法用于使用请求中的数据填充表单的基础数据类。当您从else子句调用它时,您将表单绑定到不包含数据的请求,从而有效地清除表单。要手动填写表单,您需要调用form-> setData()。假设你在调用render()时传递$ filterForm(我看不到你的整个动作方法),你的过滤器参数应该被填充。
例如,假设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);
这可能不完全正确,因为我不知道映射到表单的params字段的TourFilter属性的名称。
如果您不打算使用$ form-> getData()从表单中获取值(在本例中为'params'),则根本不需要调用form-> bindRequest()。这在表单的基础数据类是实体并且在将实体持久保存到DB之前从表单中手动保存应对值时通常很有用。例如:
$filterForm->bindRequest($request);
$filterData = $filterForm->getData();
$params = $filterData->getParams();