Заполните значения формы в контроллере - PullRequest
1 голос
/ 27 февраля 2012

Я создал форму фильтра для ограничения сущностей, отображаемых в списке. Он работает по протоколу 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 Ответ

3 голосов
/ 27 февраля 2012

Метод form-> bindRequest () предназначен для заполнения базового класса данных формы данными из запроса.Когда вы вызываете его из предложения else, вы связываете форму с запросом, который не содержит данных, эффективно очищая форму.Чтобы заполнить форму вручную, вам нужно вызвать form-> setData ().Затем, предполагая, что вы передаете свою $ filterForm в вызове метода render () (я не вижу весь ваш метод действия), ваши параметры фильтра должны быть заполнены.

Например, предполагая, что 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);

Это может быть не совсем верно, так как я не знаю имя атрибута TourFilter, которыйотображается в поле параметров вашей формы.

Если вы не собираетесь использовать $ form-> getData () для получения значений из вашей формы (в данном случае 'params'), вам не нужно вызывать form-> bindRequest () вообще.Это обычно полезно, когда базовый класс данных формы является сущностью и сохраняет вручную скопированные значения из формы перед сохранением сущности в БД.Например:

$filterForm->bindRequest($request);
$filterData = $filterForm->getData();
$params = $filterData->getParams();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...