スポンサードリンク

CakePHP
CakePHP

CakePHPにはすごく便利なページネーションの機能が付いてます。

一覧表示などするときに

データが多すぎると表示までに時間がかかってしまうので

なるべくなら使うようにしていきたいです。

今回はその設定方法です。

前回もページネーションの設定をしたのですが、

改めての設定方法です。

スポンサードリンク

設定は簡単

CakePHPのPaginatorヘルパーは、コントローラ内の$helpersプロパティにデフォルトで登録されているので、

登録することなく用いることが出来ます。

設定も簡単で

一覧表示をする時の場合

(例)Controller/PostsController.phpの場合

$data = $this->Model->find('all');
$this->set('data', $data);

としていたのですが、これを下記のように変えます。

(例)Controller/PostsController.phpの場合

$this->set(‘data’,$this->paginate());

これだけです。

いや、簡単!

これでページネーションを使うことができます。

デフォルトでは20件の表示に設定されています。

findメソッドでデータを取得する必要もなく

簡単にデータを取得してくれます。

このままでは20件しか表示されないので

ページ番号などを表示させます。

(例)View/Posts/index.phpの場合

 <?php
 echo $this->Paginator->prev('< 前へ', array(), null, array('class' => 'prev disabled'));
 echo $this->Paginator->numbers(array('separator' => ''));
 echo $this->Paginator->next('次へ >', array(), null, array('class' => 'next disabled'));
 ?>

上記のように書くとページ番号とページ送りが表示されます。

ページ番号
ページ番号

次に現在のページや全ページ数を表示させます。

(例)View/Posts/index.phpの場合

<?php
 echo $this->Paginator->counter(array('format' => '全%count%件' ));
 echo $this->Paginator->counter(array('format' => '{:page}/{:pages}ページを表示'));
?>

上記のように書くと

「全50件 1/3ページを表示」と表示されます。

次に項目名の場所を次のように書きます。

(例)View/Posts/index.phpの場合

<table>
    <tr>
        <th><?php echo $this->Paginator->sort('id','ID'); ?></th>
・・・
略

上記のように書くと項目名がクリックでき、

項目名をクリックすると並び変えができるようになります。

設定一覧

$this->Paginator->prev(‘表示文字列’,オプション配列,無効時文字列,無効時オプション配列)
  『戻る』リンクを作成します。
   第1引数 表示する文字列(例:『<<』『<<前へ』)
   第2引数 リンクタグに付加するオプションを配列で指定します。
   第3引数 リンク無効時の文字列を指定します。初期値はnull。
   第4引数 リンク無効時のリンクタグに付加するオプションを指定します。

$this->Paginator->numbers(‘オプション配列’)
    ページ数を指定するリンクを生成します。
    オプション
    model  モデル名。省略するとデフォルトのモデル名が指定されます。
    tag    各パーツを区切るタグ。初期値は’span’です。
    before 各パーツの前に表示する文字列。初期値はnullです。
    after  各パーツの後に表示する文字列。初期値はnullです。
    separator  区切り文字。
    first  文字列を指定することで『最初へ』リンクが可能な場合に、その文字列でリンクを生成します。数字を与えると最初からその数分のリンクを必ず表示します。
    last   文字列を指定することで『最後へ』リンクが可能な場合に、その文字列でリンクを生成します。数字を与えると最初からその数分のリンクを必ず表示します。
    modulus 表示するページ番号の個数を指定します。5ページ表示したい場合は4を指定します。

$this->Paginator->next(‘表示文字列’,オプション配列,無効時文字列,無効時オプション配列)
   第1引数 表示する文字列(例:『<<』『<<前へ』)
   第2引数 リンクタグに付加するオプションを配列で指定します。
   第3引数 リンク無効時の文字列を指定します。初期値はnull。
   第4引数 リンク無効時のリンクタグに付加するオプションを指定します。

$this->Paginator->sort(‘リンク文字列’,'キー’,'オプション配列’)
   ソート用のリンクを作成します。

スポンサードリンク

ページネーションの設定

このままでは、初期設定のままなので

ページネーションの設定を変えます。

(例)Controller/PostsController.phpの場合

class PostsController extends AppController {
  //Pagenatorの設定
  public $paginator = array(
   'Post' => array(
     //ページに表示する数
     'limit' => 10,
     //並び順
     'order' => array('created' => 'desc'),
   ));

  public function index(){
    $this->set('data', $this->pagenate());
  }

・・・
略

これで並び順や取得する件数を変えることができます。

Pagenatorの設定項目は他にも下記のようなものがあります。

public $paginator = array(
 'モデル名' => array(
 'fields' => array('フィールド1,フィールド2,フィールド3),
 'conditions' => array('フィールド[演算子] => 値),
 'limit' =>値,
 'order' => array('フィールド' => 'asc' 又は'desc'),
 ));

注意すること

あまりいないでしょうが、

ページネーション使ってたときに

少しハマってことがありました。

コントローラーでモデルを指定している場合

$public $uses = array('Model1', 'Model2', ・・・);

上記のような場合でコントローラーで関連のあるモデルは

一番最初に書かないとページネーションが使えません。

使えないというよりも、一番左端に書いたモデルを

ページネーションとして使うようです。

例えばPostsController.phpにモデルを指定する場合

$public $uses = array('Model', 'Post', 'Model2', ・・・);

ではだめで

$public $uses = array('Post', 'Model', 'Model2', ・・・);

のようにしないと結果が違ったものになります。

たまたま一番左側に書かなかったので

結構ハマりました。

ご注意を!

(参考)
CakePHP2.1でページネーション(実践編その6)

スポンサードリンク