BEAR_Query
でリソースのページングと表示順をコントロールする機能を追加します。
リソースのreadインターフェイスの実装を憶えてますか?
public function onRead($values)
{
$sql = "SELECT * FROM posts";
$result = $this->_query->select($sql, array(), $values);
return $result;
}
これにページング機能を追加するために、この利用コードのSQLに*変更はありません。インジェクター(初期化メソッド)での設定が変わるだけです。
App/Ro/Pager.php
<?php
class App_Ro_Post_Pager extends App_Ro_Post
{
public function onInject()
{
parent::onInject();
$this->_queryConfig['pager'] = 1; // DBページャー利用
$this->_queryConfig['perPage'] = 10; // 1ページ毎のアイテム数
$id = array('id', 'id', '+');
$date = array('created', 'date', '-');
$this->_queryConfig['sort'] = array($id, $date); // ソート
$this->_query = BEAR::factory('BEAR_Query', $this->_queryConfig);
}
}
これでページングとソートを指定しています。ページング部分に限れば2つだけです。
$this->_queryConfig['pager'] = 1; // DBページャー利用
$this->_queryConfig['perPage'] = 10; // 1ページ毎のアイテム数
以下のようにpager=0にするとページング機能は働かず最初の10件のリソースになります。
$this->_queryConfig['pager'] = 0; // DBページャー利用
$this->_queryConfig['perPage'] = 10; // 1ページ毎のアイテム数
例えばブログの記事を考えています。記事リソースは場所によってリソース表現が変わります。
内容 | ページング | pager | perPage | 表示順 |
---|---|---|---|---|
トップページ | 最近記事のリソースが最新3件 | 0 | 3 | -id |
今月の記事ページ | ページングなし | 0 | 0 | +id |
記事本体ページ | DBページング | 1 | 10 | -id |
設定(準備)が違うだけでクエリーそのものを変えずに、それぞれの表現で取得しています。このサンプルでは別クラスにしてインジェクターをオーバーライドしてますが、複数のインジェクターをもちそのインジェクターを切り替えて使う事もできます。
Note:
BEAR_Query
は使用されるSQLのORDER句より前の部分を本質的で固定的なもので、その後ろを表現のための流動的で装飾的なものととらえそれぞれを利用と準備で分け、再利用性を高めています。
Note:
件数を求めるためにCOUNTクエリーを行う時にも利用コードに変更はありません。詳しくはdbをご覧ください。
Note:
BEARではリソースのページングの記述はリソース側のみに閉じ込められており、ページコントローラー側に記述はありません。
ページャーを使うと$pagerという変数がテンプレートにアサインされます。
$pager.info | ページング情報 |
---|---|
$pager.links | ページングナビゲーション |
{$pager.info.totalItems}件中{$pager.info.from}~{$pager.info.to}件表示
<a href="?_sort=id">↓古い順</a> <a href="?_sort=-id">↑新しい順{$post}
{$pager.links.all}
効果的なSEOのため、クローラーにページング情報を教えるためにはHTMLの<head>
タグ内に<link>
タグ設置します。
<link rel="start" href="{$pager.links.linkTagsRaw.first.url}" title="" />
<link rel="last" href="{$pager.links.linkTagsRaw.last.url}" title="" />
<link rel="next" href="{$pager.links.linkTagsRaw.next.url}" title="" />
<link rel="prev" href="{$pager.links.linkTagsRaw.prev.url}" title="" />
どのような変数がアサインされてるかはBEAR Dev画面を見ても確認できます。
ページングはフルスクラッチで実装するのになかなか面倒な機能です。フレームワークを使うとより簡単に設置できます。