2012-02-27 31 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()の呼び出しで渡していると仮定します(私はあなたのアクションメソッド全体を見ることができません)、フィルタパラメータに値を設定する必要があります。

//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は、あなたのフィルタフォームのデータ・クラスであると仮定すると、代わりに例えば

、フォームのparamsフィールドにマップするTourFilter属性の名前を知っています。

$ form-> getData()を使用してフォーム(この場合は 'params')から値を取得しない場合は、form-> bindRequest()を呼び出す必要はありません。これは、フォームの基礎となるデータクラスがエンティティで、エンティティをDBに永続化する前に、フォームから対処する値を手動で保存する場合に、一般的に便利です。例:

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

いいえ、単純に$ filterForm-> setData($ params)のような形式でデータをプッシュする必要がありました。あなたが説明したようにbindRequestの代わりに。できます。トランク。 – Sergi

関連する問題