0

ページャからページを要求するたびにクエリを呼び出さずに zend ページネーションを使用することは可能ですか?

ページャーからページ番号にヒットすると、以下の zzAction へのリクエストが実行され、クエリが再度フェッチされます。私のクエリは巨大で、クエリをもう一度取得したくありません。コードに何かが欠けていますか?

コード:

コントローラ:

public function getOnePageOfEntries($array, $page=1) {
    $paginator = Zend_Paginator::factory($array); 
    $paginator->setItemCountPerPage(6);
    $paginator->setCurrentPageNumber($page);
    return $paginator;
}
public function zzAction() {
   ...

    $tt= $this->yyObject->xx(....);

    $paginator = $this -> getOnePageOfEntries($tt, $page);
    $this->view->paginator = $paginator;

}

モデル:

public function xx(...){

    try{
        ...

        $stmt = $this->prepare("CALL sp_yy(...)");
        ....

                    $stmt->execute();

        $result = $stmt->fetchAll();


        if (is_null($result)) {
            return null;
        }

        return $result;

    }catch (ErrorsException $obj){
                echo $obj;exit;
    }//end try
}

意見:

<?php
$config = Zend_Registry::get('appsConfig');
?>
<?php if (count($this->paginator)){ ?>

<?php foreach($this->paginator as $cc){ ?>
<?php echo $cc['id'] . '/';?>
<?php } ?>
<?php } ?>
<?php echo $this->paginationControl($this->paginator,
'Sliding','ff/my_pagination_control.phtml'); ?>
4

2 に答える 2

0

現在のコードは、配列アダプターのユーティリティを人為的に制限し、すべてのページに対してクエリ全体を実行することを強制します。このページネーターを使用するコントローラー アクションで達成する必要があるのは、データがまだ存在しない場合にのみクエリを実行することです。たぶん次のようなもの:

//consider this to psuedocode as it has not been tested a represents an idea
public function zzAction()
{ 
    //get page number
    $page = $this->getRequest()->getParam('page');
    //set session namespace, probably better to do this in init() method or bootstrap
    $session = new Zend_Session_Namespace('paged')
    //test for presence of persisted array
    if (!isset($session->paginator)) {
        //perform query
        $arrayToPage = $this->yyObject->xx(....);
        //persist result array
        $session->paginator = $arrayToPage;
    } else {
        //retrieve persisted array
        $arrayToPage = $session->paginator;
    }

    $paginator = $this -> getOnePageOfEntries($arrayToPage, $page);
    $this->view->paginator = $paginator;

}

DbTableSelect または DbSelect ページネーター アダプターを使用すると、特定のページに入力する必要があるデータのクエリのみが実行されるため、多くの場合、はるかに効率的です。これは、ユーザーがページ 1 からページ 7 に移動したい場合に非常に便利です ...

ページネーターを使用する際のもう 1 つの考慮事項は、カスタム エンティティ モデルです。これは、ZF で処理するのはかなり簡単です。

<?php
class Record_Model_Paginator_Record extends Zend_Paginator_Adapter_DbTableSelect
{
    //override getItems to customize the adapter to use a specific mapper to create entities
    public function getItems($offset, $itemCountPerPage)
    {
        $rows = parent::getItems($offset, $itemCountPerPage);

        $record = array();
        foreach ($rows as $row) {
            //initiate mapper
            $recordEntity = new Application_Model_Mapper_Record();
            //create entity models
            $record[] = $recordEntity->createEntity($row);
        }
        //returns an array of objects, similar to a Zend_Db_Rowset object
        return $record;
    }
}

これが役立つことを願っています。

于 2013-05-30T08:12:45.923 に答える