1

フィルタを選択するためのフォームが上部にあるページがあります。送信されると、このフォームデータはZendpaginatorと組み合わせて結果を表示するために使用されます。しかし、paginatorを使用して結果をページングすると、paginatorがフォームを投稿しないため、フォームフィールドが失われます。これらを組み合わせる簡単な方法はありますか?説明が難しいので、これを探すのに苦労しました。

私のコントローラーはこの形式です...

    $form = new Application_Form_Myform();
    $request = $this->getRequest();
    if ($request->isPost()) {
        $data = $request->getPost();
        $form->populate($data);

        // get the data
        Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml');
        $reportsTBL = new Model_DBTable_Reports();
        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($reportsTBL->getLog($data)));
        $paginator->setCurrentPageNumber($this->_getParam('page',1))
              ->setItemCountPerPage(50);
        $this->view->paginator = $paginator
    } 
    $this->view->form = $form;

ご覧のとおり、これはフォームから値を取得し、最初の送信のためにそれらを保持します。しかし、その後のページネーションのクリックで、それらは失われます。ありがとう!

4

2 に答える 2

2

残念ながら、そのフォームのデータを再度渡す必要があるため、GETをスローすることができます(セッションを使用できますが、それは難しい方法です)。

そのような状況での私の方法は、最後の送信からのキー/値フォームのデータをページ付けURLに追加することです。したがって、誰かが次のページをクリックすると、URL(GET)にフォームのデータが含まれます。

そのフォームのデータをコントローラーで取得します。

//it doesn't matter whether the POST or GET.
$this->_getParam('form_field_name');  

一部のpagination.phtml部分でページネーション用のURLを作成する場合:

$urlParams = array();
foreach (Zend_Controller_Front::getInstance()->getRequest()->getParams() as $urlParamsKey=>$urlParamsVal){
    if (!in_array($urlParamsKey, array('module', 'controller', 'action', 'page'))){
        $urlParams[$urlParamsKey] = $urlParamsVal;
    }
}

// ...

//and than just make URL with URL helper
$this->url(array_merge(array('page' => 1), $urlParams)));
于 2012-10-04T08:26:17.487 に答える
2

とても簡単です。ZendSessionを使用してフィルターを保持します。

このようなもの

$sessionNamespace = new Zend_Session_Namespace('Zend_Searchs');
$sessionNamespace->filter = $this->_request->getParam('filter');
if(isset($sessionNamespace->filter )) {
// do your stuff
}
于 2012-10-04T08:39:00.560 に答える