使用法
データコレクションのページ処理
ページ処理を行うには、Zend_Paginator
がデータにアクセスするための汎用的な方法が必要です。
そのため、データへのアクセスはすべてデータソースアダプタを用いて行います。
Zend Framework には、いくつかのアダプタが標準で同梱されています。
Zend_Paginator 用のアダプタ
アダプタ
説明
Array
PHP の配列を使用します。
DbSelect
Zend_Db_Select
のインスタンスを使用し、配列を返します。
DbTableSelect
Zend_Db_Table_Select
のインスタンスを使用し、
Zend_Db_Table_Rowset_Abstract
のインスタンスを返します。
これは、結果セットについての追加情報
(カラム名など) を提供します。
Iterator
Iterator
のインスタンスを使用します。
Null
データのページ処理を管理する際に Zend_Paginator
を使用しません。その場合でもページ処理コントロールの機能を使うことはできます。
指定したクエリにマッチするすべての行を取得するのではなく、
DbSelect アダプタや DbTableSelect アダプタは
現在のページの表示のための必要最小限のデータのみを取得します。
そのため、マッチする行の総数を得るための別のクエリが動的に生成されます。
しかし、総数を直接指定したり、総数を求めるクエリを直接指定したりすることもできます。
詳細な情報は、DbSelect アダプタの
setRowCount() メソッドを参照ください。
Zend_Paginator のインスタンスを作成するには、
コンストラクタでアダプタを指定しなければなりません。
利便性を確保するために、Zend Framework に同梱されているアダプタ用の静的メソッド
factory() も用意されています。
Null アダプタの場合は、
データコレクションのかわりに要素数をコンストラクタで指定します。
この状態でも技術的には既に使用可能ですが、
ユーザが要求したページ番号をコントローラのアクション内で教えてやる必要があります。
これにより、データを読み進めていくことが可能となります。
setCurrentPageNumber($page);
]]>
ページ番号は URL で指定するのがもっともシンプルな方法でしょう。
Zend_Controller_Router_Interface
互換のルータを使うことを推奨しますが、
それが必須というわけではありません。
INI ファイルで定義するルートの例を次に示します。
この設定を使った (そして Zend Framework の MVC コンポーネントを使った)
場合、現在のページ番号を設定するコードはこのようになります。
setCurrentPageNumber($this->_getParam('page'));
]]>
それ以外にもオプションがあります。詳細は
設定
を参照ください。
最後に、paginator のインスタンスをビューに割り当てます。
Zend_View と ViewRenderer アクションヘルパーを使っている場合は、
次のようになります。
view->paginator = $paginator;
]]>
DbSelect および DbTableSelect アダプタ
大半のアダプタの使用法は非常にわかりやすいものです。
しかし、データベースアダプタについては、
データベースからのデータの取得方法や件数の数え方についてのより詳細な説明が必要です。
DbSelect アダプタや DbTableSelect アダプタを使う際には、
事前にデータベースからデータを取得する必要はありません。
どちらのアダプタも、自動的にデータを取得して総ページ数を計算します。
もしデータベースからのデータに対して何らかの処理が必要となるのなら、
アダプタの getItems() メソッドをアプリケーション内で継承します。
さらに、これらのアダプタは、
数を数える際にデータベースの全レコードを取得するわけでは
ありません。そのかわりに、アダプタが元のクエリを修正し、
それに対応する COUNT クエリを作成します。
Paginator は、その COUNT クエリを実行して行数を取得するのです。
そのぶんデータベースとの余分なやりとりが必要となりますが、結果セット全体を取得して
count() を使うよりは何倍も高速になります。
大量のデータを扱う場合などは特にそうです。
データベースアダプタは、すべてのモダンなデータベース上で実行できる
もっとも効率的なクエリを作成しようとします。
しかし、使用するデータベースやスキーマ設定によっては
行数を取得するのにもっと効率的な方法があるかもしれません。
そのような場合のために、データベースアダプタでは独自の COUNT
クエリを設定できるようにもなっています。たとえば、
別々のテーブルにある blog の投稿の数を調べるには、
次の用に設定すればより高速な count クエリが使用できるでしょう。
select()->from('posts'));
$adapter->setRowCount(
$db->select()
->from(
'item_counts',
array(
Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'
)
)
);
$paginator = new Zend_Paginator($adapter);
]]>
この方法は、小規模なデータや単純な select クエリの場合にはあまり劇的な効果を得られません。
しかし、複雑なクエリや大規模なデータを扱う場合は
かなりパフォーマンスが向上することでしょう。
ビュースクリプトによるページのレンダリング
ビュースクリプトを使用してページ項目のレンダリング
(Zend_Paginator を使うよう設定している場合)
とページ処理コントロールの表示を行います。
Zend_Paginator は SPL の
IteratorAggregate
インターフェイスを実装しているので、
項目を順次処理したり表示したりするのは簡単です。
Example
paginator)): ?>
paginationControl($this->paginator,
'Sliding',
'my_pagination_control.phtml'); ?>