【问题标题】:Pagination with ZendZend 分页
【发布时间】:2013-06-02 14:15:27
【问题描述】:

我目前正在尝试对从我的数据库返回的信息进行分页。

我目前使用的是 Zend 1.12 版,对 Zend 和 MVC 来说非常新。因此,我将不胜感激任何关于更好地布局我的代码的建议,以符合最佳实践以及正确的方向,以使我的分页代码正常工作

到目前为止,我已经看过几个教程: ThisThisThisand This 并查看了几个 stackoverflow 问题,包括 This question。但我一定错过了一些东西,因为我无法让它工作。

我已设法将显示的结果集限制为我选择的数量 (30),并且我已设法显示分页控件。

很遗憾,我的分页控件不起作用。

问题

当我点击“下一步”时,地址栏将从 site/model/controller 到 site/model/controller/page/2,但显示没有改变。

当我点击 Last 时,地址栏将从

site/model/controller/page/2 到 site/model/controller/page/29 (这是我希望分页后的页数)。显示不变。

我无法单击上一个(即使我在第 29 页),因为它不是活动链接(在 HTML 代码中被禁用)。

我的代码如下:

型号

public function readAll()
{
    $tableData = new Application_Model_DbTable_Bins();
    $table = $tableData->fetchAll();

    if (!empty($table)) {
        return $table;
    } else {
        return 'There is no information held within this table';
    }
}

控制器

public function readallAction($items = 10, $page = 1)
{
    $readAll = new Application_Model_Bins();

    $paginator = Zend_Paginator::factory($readAll->readAll());
    $paginator->setItemCountPerPage($items);
    $paginator->setCurrentPageNumber($page);
    if ( empty ( $page ) ) { $page = 1; }
    $this->view->readall = $paginator;
}

查看

<div id="view-content">
<form method='post' id="bins" name="myform">
    <table border="1">
        <th>BIN</th>
        <th>COMP_DIV</th>
        <th>STY_RET_TYPE</th>
        <th>STY_PDT_TYPE</th>
        <th>PRICE_POINT</th>
        <th>STORAGE_TYPE</th>

        <?php echo $this->partialLoop('partials/bins.phtml', $this->readall); ?>

        <td><input type=checkbox value="Check All" onClick="this.value=check(this.form.list)" /></td>
    </table>

    <input type='submit' name='submit' value='move' />
</form>            
<?php echo $this->paginationControl($this->readall, 'Sliding', 'pagination_controls.phtml'); ?>

分页控件

<?php if ($this->pageCount): ?>

<!--    first Page Link-->
<?php if (isset($this->previous)): ?>
<a href="<?php echo $this->url(array('page' => $this->first)); ?>">First</a> |
<?php else: ?>
<span class="disabled">First</span> |
<?php endif; ?>

<!--    previous Pagelink-->
<?php if (isset($this->previous)): ?>
<a href="<?php echo $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> |
<?php else: ?>
<span class="disabled">&lt; Previous</span> |
<?php endif; ?>

<!--    next Page link-->
<?php if (isset($this->next)): ?>
<a href="<?php echo $this->url(array('page' => $this->next)); ?>">Next &gt;</a> |
<?php else: ?>
<span class="disabled">Next &gt;</span> |
<?php endif; ?>

<!--    Last page link-->
<?php if (isset($this->next)): ?>
<a href="<?php echo $this->url(array('page' => $this->last)); ?>">Last</a>
<?php else: ?>
<span class="disabled">Last</span>
<?php endif; ?>

【问题讨论】:

    标签: php zend-framework pagination


    【解决方案1】:
    public function readallAction(){
        $items = 10;
        $readAll = new Application_Model_Bins();
        $page = $this->_request->getParam('page',1);
        $paginator = Zend_Paginator::factory($readAll->readAll());
        $paginator->setItemCountPerPage($items);
        $paginator->setCurrentPageNumber($page);
        $this->view->readall = $paginator;
    }
    

    我建议您使用 Zend_Paginator_Adapter_DbSelect 来提高性能。

    我英语不好


    更新...

    控制器:

    public function readallAction()
    {
        $page = $this->_request->getParam('page',1); //get curent page param, default 1 if param not available.
        $model = new Application_Model_Bins(); // get Model
        $data = $model->_readAll(); // call Method
        $adapter = new Zend_Paginator_Adapter_DbSelect($data); //adapter
        $paginator = new Zend_Paginator($adapter); // setup Pagination
        $paginator->setItemCountPerPage(10); // Items perpage, in this example is 10
        $paginator->setCurrentPageNumber($page); // current page
        $this->view->readall = $paginator;
    }
    

    型号:

    public function _readAll(){
        $select = $this->getDefaultAdapter()->select();
        $select->from('ebook','*');
        return $select; //return sql query, do NOT return fetch data. this query is: select * from ebook
    }
    

    【讨论】:

    • 感谢您的帮助。现在可以了。这 zend 的东西非常令人沮丧。
    • 感谢有关使用 Zend_Paginator_Adapter_DbSelect 的建议,但我似乎无法让它工作。另外,我将如何显示可用的页码并限制仅显示 10 个,例如 google 样式?
    【解决方案2】:

    您希望将参数作为函数参数提供给控制器方法,但它不是这样工作的。参数被添加到请求对象中,您可以从那里访问它们。试试这个:

    public function readallAction()
    {
        $items = 10;
        $page = $this->getRequest()->getParam('page', 1);
    
        $readAll = new Application_Model_Bins();
    
        $paginator = Zend_Paginator::factory($readAll->readAll());
        $paginator->setItemCountPerPage($items);
        $paginator->setCurrentPageNumber($page);
    
        $this->view->readall = $paginator;
    }
    

    在上面我从请求对象访问页面参数(使用 1 作为默认值)。我已将项目硬编码为 10,因为这似乎不是您给出的示例中的 URL 参数。

    您要求提供代码反馈。您的方法的一个问题是您将所有数据传递给分页器,这将起作用,但效率不高。想象一下,如果表有一百万行 - ZF 必须选择所有行才能返回前 10 行。您可能想研究使用 DB Select 分页器,请参阅:http://framework.zend.com/manual/1.12/en/zend.paginator.usage.html。这些允许您提供一个 DB 选择,然后 ZF 可以对其进行操作,因此只返回相关的 10 个结果。

    【讨论】:

    • 感谢您的帮助和解释。
    【解决方案3】:

    使用

    $page = $this->_getParam('page',1);
    $paginator = Zend_Paginator::factory($result);
    $paginator->setItemCountPerPage(5);
    $paginator->setCurrentPageNumber($page);
    $this->view->paginator = $paginator
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多