ページャ(Paginator)を使う | Database

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のコンストラクタには、モデルやファインダを渡すこともできます。