首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类别的Zend_Paginator

类别的Zend_Paginator
EN

Stack Overflow用户
提问于 2013-02-01 02:59:30
回答 1查看 157关注 0票数 0

我在索引操作中使用了Zend_Paginator,这将显示我的所有目录:

代码语言:javascript
复制
public function indexAction()
{
   Zend_View_Helper_PaginationControl::setDefaultViewPartial('/pagination.phtml');
    $pages = new Application_Model_DbTable_Catalog();

    $num = 10;
    $page = $this->_getParam('page');

    $select = $pages->select();
    $result = $this->view->table = $pages->fetchAll($select)->toArray();
    $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($result));
    $paginator->setItemCountPerPage($num);
    $paginator->setCurrentPageNumber($page);
    $paginator->setView($this->view);
    $this->view->paginator = $paginator;
}

它工作得很好,现在我有了CategoryAction,它可以按类别对我的目录进行排序

代码语言:javascript
复制
public function categoryAction()
{
    $id = intval($this->_getParam('id', 0));
    if ($id > 0) {
        $catalog = new Application_Model_DbTable_Catalog();
        $this->view->catalog = $catalog->getByCategoryId($id);
        и
        $category = new Application_Model_DbTable_Categories();
        $this->view->category = $category->getById($id);



    }

所以我不明白如何在这个动作中添加分页,请帮帮我,请参见:-(,另外,很抱歉我的英文不好

EN

回答 1

Stack Overflow用户

发布于 2013-02-01 17:06:25

好的,有一种更好/更简单的方法可以做到这一点。

分页从数据库查询开始。您使用的是DbTable模型,因此在ZF1中设置适配器非常容易。

代码语言:javascript
复制
<?php 

class Application_Model_DbTable_Catalog extends Zend_Db_Table_Abstract
{
    protected $_name = 'catalog'
    /*
     * This method returns a paginator adapter with a fetchAll($where = null, $order = null, $count = null, $offset = null)
     * paginator adapter will supply the values for $offset and $limit
     */
    public function getPagedCatalog() 
    {
        $select = $this->select(); //put anything you need into $select
        $adapter = new Zend_Paginator_Adapter_DbTableSelect($select);//the paginator adapter in place of the fetchAll().

        return $adapter;
    {
}

<?php 

class Application_Model_DbTable_Categories extends Zend_Db_Table_Abstract
{
    protected $_name = 'categories'

    /*
     * This method returns a paginator adapter with a fetchAll($where = $id, $order = null, $count = null, $offset = null)
     * paginator adapter will supply the values for $offset and $limit
     */
    public function getPagedCatagories($id) 
    {
        $select = $this->select(); //put anything you need into $select
        $select->where('catagory_id = ?', $id);//you may need to build a join for this to work how you want it to, depends on your table structure.
        $adapter = new Zend_Paginator_Adapter_DbTableSelect($select);//the paginator adapter in place of the fetchAll().

        return $adapter;
    {
}

现在,您的模型将返回分页器适配器,其中包含这些表的内容。Zend_Paginator将自动为查询提供$limit$offset参数,以便每个页面执行一个查询。使用此适配器时,整个表不会存储在内存中。

现在,您的indexAction()可能如下所示:

代码语言:javascript
复制
public function indexAction()
{
   Zend_View_Helper_PaginationControl::setDefaultViewPartial('/pagination.phtml');
    $pages = new Application_Model_DbTable_Catalog();
    $adapter = $pages->getPagedCatalog(); //get adapter from model

    $page = $this->_getParam('page', 1);//a default of page 1 prevents possible unusual behavior when no page number is set.

    $paginator = new Zend_Paginator($adapter);
    $paginator->setItemCountPerPage('10');
    $paginator->setCurrentPageNumber($page);
    //$paginator->setView($this->view); This line is likely not needed
    $this->view->paginator = $paginator;
}

你的categoryAction()可能是这样工作的:

代码语言:javascript
复制
public function categoryAction()
{
    $page = $this->_getParam('page', 1);
    $id = intval($this->_getParam('id', 0));
    if ($id > 0) {
        $category = new Application_Model_DbTable_Categories();
        $adapter = $category->getPagedCatagories($id);
        //same as above
        $paginator = new Zend_Paginator($adapter);
        $paginator->setItemCountPerPage('10');
        $paginator->setCurrentPageNumber($page);
        //$paginator->setView($this->view); This line is likely not needed, unless you have multiple view objects.
        $this->view->paginator = $paginator;
    } else {
        //do some other stuff...
    }
}

如果您疯狂地想使用自己的映射器类作为分页器适配器的基础,您可以通过覆盖getItems()来扩展适配器类,如下所示:

代码语言:javascript
复制
<?php

class Music_Model_Paginator_Track extends Zend_Paginator_Adapter_DbTableSelect
{
    //override getItems()
    public function getItems($offset, $itemCountPerPage)
    {
        $rows = parent::getItems($offset, $itemCountPerPage);

        $albums = array();
        foreach ($rows as $row) {
            $album = new Music_Model_Mapper_Track();//use this class to turn each $row into an object                
            $albums[] = $album->createEntity($row); //build the new entity objects
        }
        //returns an array of entity objects to the paginator
        return $albums;
    }
}

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14633126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档