【问题标题】:How to retain form values with Zend paginator如何使用 Zend 分页器保留表单值
【发布时间】:2012-10-04 16:39:00
【问题描述】:

我有一个页面,顶部有一个用于选择过滤器的表单。提交时,此表单数据与 Zend 分页器结合使用以显示结果。但是当我使用分页器对结果进行分页时,表单字段会丢失,因为分页器不会发布表单。有没有简单的方法来组合这些?我很难找到这个,因为它很难解释。

我的控制器是这种形式...

    $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;

如您所见,这会从表单中获取值并保留它们以供首次提交。但是在随后的分页点击中,他们迷路了。 谢谢!

【问题讨论】:

    标签: zend-framework pagination


    【解决方案1】:

    如此简单,使用Zend Session 保留您的过滤器。

    类似的东西

    $sessionNamespace = new Zend_Session_Namespace('Zend_Searchs');
    $sessionNamespace->filter = $this->_request->getParam('filter');
    if(isset($sessionNamespace->filter )) {
    // do your stuff
    }
    

    【讨论】:

    • 如果用户进行过滤,请转到另一个页面并使用过滤器返回该页面?过滤器表单应为空...
    • 这一切都可以通过查看页码来处理。
    • ...更好的是检查请求是否来自带有过滤器(控制器/动作)的页面
    • 为此使用 Session 不是一个好选择,因为它不允许有多个搜索窗口(过滤器对会话来说是全局的)并且它完全不适合 seo
    • @JoaquínL.Robles 对于多个搜索窗口,您可以在 zend 会话命名空间中使用多个索引。它工作正常。我无法理解投反对票的原因
    【解决方案2】:

    很遗憾,您必须再次传递该表单的数据, 所以你可以抛出 GET(你可以使用 session,但这是一种更难的方式)。

    在这种情况下,我的方法是从上次提交中附加该键/值表单的数据 到分页网址, 所以当有人点击下一页时,在 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)));
    

    【讨论】:

    • 我曾想过这一点,但我总是觉得复杂的 url 向用户公开变量会很麻烦,从而为黑客尝试提供了机会。会话变量实际上更安全,但更麻烦。
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2010-11-11
    相关资源
    最近更新 更多