0

検索フォームを完成させようとしていますが、その一部はページネーションです。問題は次のとおりです。ページネーター リンクに GET パラメータを渡す方法がわかりません (例: /page/2?search=query)。application/scripts ディレクトリに「controls.phtml」を作成し、Bootsrap に追加しました

Zend_View_Helper_PaginationControl::setDefaultViewPartial('controls.phtml');

ビューでページネーターをレンダリングします。

echo $this->paginationControl($this->paginator, 'Elastic', 'controls.phtml');

この問題を解決するために必要な段階的なアクションを誰かが書いてくれませんか? (ZFで私は2日目のみ)

4

2 に答える 2

0

クエリパラメータをpaginatorに送信するのではなく、paginatorアダプタに送信します。次に、選択したアダプタが必要なアクションを実行します...データベースが配列をクエリまたは解析します。..次に、データベースアダプタをパジネータに渡します。

これは、ページ番号を作成するか、getクエリに基づいてリダイレクトするコントローラーアクションです。

public function displayAction()
    {
        //get all parameters from requested url
        $request = $this->getRequest()->getParams();
        //build switch based GET query
        switch ($request) {
            //if ?query=value
            case (isset($request['query'])):
                //model to use for database query
                $model = new Music_Model_Mapper_Track();
                //paginator adapter to use
                $adapter = $model->fetchPagedTracks(null, $request['query']);
                //intiate new paginator
                $paginator = new Zend_Paginator($adapter);
                //provide paginator page values
                $paginator->setItemCountPerPage(20)->setPageRange(5);
                //?page=1 is default
                $page = $this->getRequest()->getParam('page', 1);
                //current page number
                $paginator->setCurrentPageNumber($page);
                //pass paginator to view
                $this->view->paginator = $paginator;
                break;
            //if ?id=value
            case (isset($request['id'])):
                $this->_forward('artist', null, null, array('id' => $request['id']));
                break;
            //if neither query value present. Should never get here.
            default:
                $adapter = $model->fetchPagedTracks();
                //[...]
                break;
        }
    }

paginatorアダプターに変更されたアダプターを使用します。これはDbTableSelectアダプターから拡張され、データベーステーブルの代わりにマッパーを使用するだけです。

class Music_Model_Paginator_Track extends Zend_Paginator_Adapter_DbTableSelect
{
    /**
     * Override getItems() to use mapper model instead of database table
     */
    public function getItems($offset, $itemCountPerPage)
    {
        $rows = parent::getItems($offset, $itemCountPerPage);

        $albums = array();
        foreach ($rows as $row) {
            $album = new Music_Model_Mapper_Track();
            $albums[] = $album->createEntity($row);
        }
        return $albums;
    }
}

そのマッパーでは、デフォルトのアダプターが使用されるのとまったく同じ方法でパジネーターアダプターを使用します。

/**
     * Creates Zend_Paginator_Adapter_DbTableSelect object,
     * based on artist_id or query string.
     *
     * @param string $id
     * @param string $query
     * @return Music_Model_Paginator_Track
     */
    public function fetchPagedTracks($id = null, $query = null)
    {
        //if $id is not null where=$id
        if (!is_null($id)) {
            $select = $this->getGateway()->select();
            $select->where('track.artist_id = ?', $id);
        }
        //if $query is not null join on the artist table and query track title and artist name for match.
        if (!is_null($query)) {
            $select = $this->getGateway()
                ->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
            $select->setIntegrityCheck(false);
            $select->join('artist', 'artist.id = track.artist_id');
            $select->where("track.title LIKE '%$query%'");
            $select->orWhere("artist.name LIKE '%$query%'");
        }
        //default select query if $id and $query are null, appended to query otherwise.
        $select->order('track.artist_id ASC');
        $select->order('track.album_id ASC');
        $select->order('track.track_number ASC');
        //instantiate paginator adapter
        //$adapter = new Zend_Paginator_Adapter_DbTableSelect() would also work
        $adapter = new Music_Model_Paginator_Track($select);
        //return paginator adapter
        return $adapter;
    }

そして最後に、ビューは特別なものではありません。

<div><?php
echo $this->paginationControl(
        $this->paginator, 'Sliding', '_paginatorControl.phtml'
)
?></div>
//[..]

一部のアダプター(特定の状況)では、クエリ値をZend_RegistryまたはZend_Sessionで永続化して、URLに戻すことができます。

お役に立てれば。

于 2013-01-25T09:42:27.240 に答える
0

Controller でさらに多くのことを行い、$paginatorそれ自体をビューに渡すだけです。コントローラーで次のようなもの:

Zend_Paginator::setDefaultScrollingStyle("Elastic");
Zend_View_Helper_PaginationControl::setDefaultViewPartial("controls.phtml");

$paginator = Zend_Paginator::factory($result);
$paginator->setItemCountPerPage(5);
$paginator->setPageRange(5);
//this is where you collect the GET param and use as parameter.
$paginator->setCurrentPageNumber((int) $this->getRequest()->getParam("page", 1));

$this->view->paginator = $paginator; //pass it from Controller into View

次に、ビュー コードで:

<?= $this->paginator; ?>
于 2013-01-24T21:34:40.900 に答える