在控制器中填写表单值

时间:2012-02-27 10:10:08

标签: forms symfony

我创建了一个过滤器表单来限制列表中显示的实体。 它通过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);

1 个答案:

答案 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();