Zend_Paginator を使ってみる。
2009年11月06日 16:52
こんにちわ。
Sydney に渡って前半開発に頑張りすぎて肩こりが酷くなったので、たまには運動しないとと思い最近 15 年くらいやってて多少自信があったスケボーを購入してやり始めたんですが、2 週間目で疲労骨折気味になってしまい、全く動けなくなっている convexstyle です。意味ねえ…
・・・・・
最近のプロジェクトで Zend_Paginator を初めて使ってみました。
今までは PEAR::Pager を使っていたけど、Zend Framework に入ってなかなか便利だというのを聞いていたので使ったが便利だった。
Zend_Paginator_Adapter_DbSelect はかなり良いらしいが、今回は CMS の API 経由で XML をパースして表示する形式だったので、シンプルに Zend_Paginator_Adapter_Array をアダプタとしては使用した。
ページにどの様に表示するかは CSS/XHTML とテンプレートエンジン(Smarty など)の問題なので、色々やり方はあるしそこまで重要では無いが、重要な点はどの様に URI の syntax をテンプレートエンジンのレンダリング結果に受け渡すかだろう。
まずはどの様な値が Zend_Paginator から返されるか dump してみる。
$_paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($_data));
$_paginator->setCurrentPageNumber($_pageId);
$_paginator->setItemCountPerPage($this->_pagerIni->blog_per_page);
$_paginator->setPageRange($this->_pagerIni->page_range);
Zend_Debug::dump($_paginator->getPages('Sliding'));
結果は stdClass 形式で下記の様に返される。
object(stdClass)#69 (12) {
["pageCount"]=>
int(1)
["itemCountPerPage"]=>
int(3)
["first"]=>
int(1)
["current"]=>
int(1)
["last"]=>
int(1)
["pagesInRange"]=>
array(1) {
[1]=>
float(1)
}
["firstPageInRange"]=>
float(1)
["lastPageInRange"]=>
float(1)
["currentItemCount"]=>
int(2)
["totalItemCount"]=>
int(2)
["firstItemNumber"]=>
int(1)
["lastItemNumber"]=>
int(2)
}
後はどの様に URI を割り当てるかが問題なので、下記の様な自作クラスを作成して、この stdClass を渡す。
class Convexstyle_Paginator_Pages
{
private $_pages;
private $_uri;
private $_placeHolder;
public function __construct(stdClass $pages)
{
$this->_pages = $pages;
}
public function __get($value)
{
return $this->_pages->$value;
}
public function setUri($uri, $placeHolder)
{
$this->_uri = $uri;
$this->_placeHolder = $placeHolder;
}
public function uri($value)
{
return strtr(
$this->_uri,
array($this->_placeHolder => $value)
);
}
public function __destruct()
{
}
}
インスタンス化の際に好きな形式な URI を setUri に渡して、どれが可変に変わるページ番号(ここでは $_pageId)になるかの placeHolder を2番目のパラメータとして割り当てるだけ。
$_pages = new Convexstyle_Paginator_Pages($_paginator->getPages('Sliding'));
$_pages->setUri('blog/page/%$pageId%', '%$pageId%');
後はこの $_pages オブジェクトを view に渡して完了!
$this->view->_pager = $_pages;
Smarty 側では例えばこんな感じか。
<ul>
<% math equation=a+b a=$_pager->pageCount b=1 assign="_pagerTotal" %>
<% section start=1 name="pager" loop=$_pagerTotal %>
<% if $_pager->current == $smarty.section.pager.index %>
<li id="active"><% $smarty.section.pager.index %></li>
<% else %>
<li class="pager-link"><a href="<% $_pager->uri($smarty.section.pager.index) %>"><% $smarty.section.pager.index %></a></li><% /if %>
<% /section %>
</ul>
LIFE さんの方法を試してみたけど、途中でギブアップしました。viewHelper としてやってんのかな?
・・・・・
ちなみに
Smarty 3 がもうちょいですね!
Cairngorm 3 ももうちょいですね!
バージョン 3 が多いな、何か。
共に、高頻度使用なので目を通しておかんとなあ!

お久しぶりですー。
僕がやった方法は、Zend_Viewを使っている場合と同じ書き方で動作するようにしたかったのです。
viewHelperを経由した形で実現するために、Zend_View_Smartyという自作のZend_View代わりのクラスに、Pagenatorを使うために必要なメソッドを追加していったのですー。Zend_Viewを見ながら。
http://dev.convexstyle.net/2009/11/zend_paginator.html
ここみたいに、
でページングが表示されるようにしたかったのですー
Posted by co-hey | 2009年11月06日 19:53
Posted on 2009年11月06日 19:53
お、コメントありがとうございますー。
自分も Smarty 用の Zend_View_Interface を implements したクラスを使ってるんですが、関数のコピーが面倒で強引に Zend_View_Abstract クラスを extends して色々やってみたんですが、Smarty 側で上手く動かず断念しました。ソースを参考にしたいけど、企業秘密っすかねー!?
Posted by convexstyle | 2009年11月06日 21:26
Posted on 2009年11月06日 21:26
今、コメント見たら誤字だらけですね。。。
すいませんでした。
今、作ったソースをメールにお送りしましたー
Posted by co-hey | 2009年11月06日 23:27
Posted on 2009年11月06日 23:27