読者です 読者をやめる 読者になる 読者になる

Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

さくらvpsとcakephp2.6.7で開発日記 その0015 Paginator(ページネーター)を使う

参考にさせて頂いたページ

Paginatorコンポーネント

ページ制御 — CakePHP Cookbook 2.x ドキュメント

Paginatorヘルパー

PaginatorHelper — CakePHP Cookbook 2.x ドキュメント

Controller側の記述

まず以下の通り、Paginatorコンポーネントを使用する事を宣言する。

public $components = array('Paginator');

次にactionの中で、例えば以下のような感じで設定と取得をする。
連想配列のキーは他にもありますし、値もご自分の環境に合わせてください。

//ページネーターcomponentの設定
$this->Paginator->settings = array(
  'Article' => array(
    'limit' => 1,
    'order' => array('id' => 'asc'),
    'conditions' => array(
      'Article.user_id' => $user['id'],
    ),
  )
);

//上記の設定を元にデータを取得
$datas = $this->paginate();

View側の記述

ソート用のa要素を出力するヘルパー

例としてArticleモデルのidフィールドでソートするリンクは以下の通り。

<?php
  echo $this->Paginator->sort(
    'id',//ソートに利用するフィールド
    '<div>id順にソートする</div>',//表示される文字列
    $options = array(
      'escape' => false,//第二引数をescapeするかどうか
      'model' => 'Article',//使用するModel
      'direction' => 'desc',//href属性の中に設定される asc or desc
      'lock' => true,//directionで設定した値でhref属性を固定するか
    )
  )
?>

ソートに使用しているModelを取得

例として以下の通り。

<?php
  echo $this->Paginator->defaultModel();
?>

ソートに使用しているdirectionを取得

例として以下の通り。asc, descの文字列が返されます。

<?php
  echo $this->Paginator->sortDir();
?>

ソートに使用しているフィールドを取得

例として以下の通り。idなどの文字列が返されます。

<?php
  echo $this->Paginator->sortKey();
?>

数字のリンクを出力

例として以下の通り。

<?php
  echo $this->Paginator->numbers(
    array(
      'before' => 'before',//数字リンクの前に表示するコンテンツ
      'after' => 'after',//数字リンクの後に表示するコンテンツ
      'model' => 'Article',//ページ計算に利用するModel
      'modulus' => 4,//現在ページの前後に2個ずつ表示するので4
      'separator' => '|',//数字と数字の間に表示されるコンテンツ
      'tag' => 'span',//a要素を包むタグ
      'first' => 2,//数字または文字列を指定
      'last' => 2,//数字または文字列を指定
      'ellipsis' => '…',//省略されていることを表す文字列
      'class' => 'class1 class2',//tagで指定した要素に付与するクラス
      'currentClass' => 'currentClass',//現在ページを包む要素に付与するクラス
      'currentTag' => 'em'//現在ページはリンクではないので、a要素の代わりに表示する要素
    )
  );
?>

前へ

例として以下の通り。

<?php
  echo $this->Paginator->prev('前へ');
?>

次へ

例として以下の通り。

<?php
  echo $this->Paginator->next('次へ');
?>

最初へ

例として以下の通り。

<?php
  echo $this->Paginator->first('最初へ');
?>

最後へ

例として以下の通り。

<?php
  echo $this->Paginator->last('最後へ');
?>

現在何ページ目か

例として以下の通り。

<?php
  echo $this->Paginator->current();
?>

次のページがあるか

例として以下の通り。

<?php
  //
  echo $this->Paginator->hasNext();
?>

前のページがあるか

例として以下の通り。

<?php
  //
  echo $this->Paginator->hasPrev();
?>

指定したページがあるか

Articleモデルの10ページ目があるかどうかの場合は、例として以下の通り。

<?php
  // $this->Paginator->hasPage('モデル名', 数値);
  echo $this->Paginator->hasPage('Article', 10);
?>

ページ情報の表示

例として以下の通り。

<?php
  echo $this->Paginator->counter(
    '現在のページは{:page}<br>全ページ数は{:pages}<br>一ページあたりの表示件数は{:current}<br>全データ件数は{:count}<br>このページの一件目は全データのうち{:start}<br>このページの最終データは全データのうち{:end}<br>モデル名を複数名にして読みやすい書式にしたもの{:model}'
  );
?>