Paginatorクラスを使用すると、簡単にページングを実現できます。
下記はユーザ(userテーブル)をIDの降順で一覧表示します。
class Index_Controllers_MyController extends Sabel_Controller_Page
{
/**
* ユーザ一覧表示アクション
*/
public function showUsers()
{
$paginator = new Paginator("User");
$paginator->setDefaultOrder("id", "desc");
$this->paginator = $paginator->build(10, $this->request->fetchGetValues());
}
}
結果(Userの配列)は
$paginator->results に入ってるので、それをforeachします。
ページング部分は partial で
pager.tpl を読み込むことで表示することができます。
<?php if ($paginator && $paginator->results) : ?>
<ul>
<?php foreach($paginator->results as $aUser) : ?>
<li><?php echo h($aUser->name) ?></li>
<?php endforeach ?>
</ul>
<?php echo $this->partial("pager", array("paginator" => $paginator)) ?>
<?php else : ?>
<p>
ユーザはいません
</p>
<?php endif ?>
LinkedPaginatorクラスを使うと、前へ次へのページングを実現できます。
LinkedPaginatorは合致するレコード数をデータベースから取得しないためその分高速です。
class Index_Controllers_MyController extends Sabel_Controller_Page
{
/**
* ユーザ一覧表示アクション
*/
public function showUsers()
{
$paginator = new LinkedPaginator("User");
$paginator->setDefaultOrder("id", "desc");
$this->paginator = $paginator->build(10, $this->request->fetchGetValues());
}
}
partialで読み込むテンプレートは pager.tpl ではなく、
linkedPager.tpl となります。
<?php echo $this->partial("linkedPager", array("paginator" => $paginator)) ?>
LinkedPaginatorの場合はページ数が制限されます(デフォルトは20ページ)。
これを変更するには
lastPage の値を変更してください。
$paginator->lastPage = 30;
検索条件はActiveRecordと同じように設定することができます。
下記はステータスが1かつ年齢が25才以上かつ名前に "foo" を含むユーザの一覧の例です。
$paginator = new Paginator("User");
$paginator->setCondition("status", 1);
$paginator->setCondition(Sabel_Db_Condition::create(
Sabel_Db_Condition::GREATER_EQUAL, "age", 25
));
$paginator->setCondition(Sabel_Db_Condition::create(
Sabel_Db_Condition::LIKE, "name", "foo"
)->type(Sabel_Db_Condition_Like::CONTAINS));
上記のコードを書くのが面倒な場合はファインダを使用すると良いでしょう。
$f = finder("User")->eq("status", 1)->ge("age", 25)->contains("name", "foo");
$paginator = new Paginator($f);
このように、PaginatorやLinkedPaginatorのコンストラクタには、モデルやファインダを渡すこともできます。