cakePHPには、レコードを取り出した後、そのレコード数に応じてページ数の表示やページリンクの生成などを行ってくれる便利な機能がついている。

例えばDBに100件データを登録し取り出した100件のデータを10件ずつ表示するように設定行うと、10ページ分のページネーションが表示するわけです。

そして、ページだけでなく、そのリンクを挟むように「前」「次」のような1ページ分のページ遷移のリンクがあったりと大変助かるリンクまで用意されています。

テンプレートファイル生成で出来上がった標準のページネーションは以下のようなソースが準備されます。

 

<ul class="pagination">
  <?= $this->Paginator->first('<< ' . __('first')) ?> // 最初に戻る
  <?= $this->Paginator->prev('< ' . __('previous')) ?> // 前に戻る
  <?= $this->Paginator->numbers() ?> // 相登録数を指定した表示件で割った分のページ数
  <?= $this->Paginator->next(__('next') . ' >') ?> // 次へ進む
  <?= $this->Paginator->last(__('last') . ' >>') ?> // 最後に進む
</ul>

 

しかし、もしページが1ページしかなかった場合、previousとnextは表示されるんです。当然クリックしてもなにも反応しませんが、ページ分けされてもないのにpreviousとnextが表示されてしまうと、見栄え的にも不自然で嫌です。

そこで、もしページが1ページの場合はページネーションは表示しないというフラグを付けてあげると良いと思うので、その記録を残します。

自分は以下のような方法で行いましたが、もしかするとpaginationの設定で何かあるのかも知れません。そこは調べてみて下さいw

以下の方法は、$this->Paginator->total() で総ページ数を取得し、1以上だった場合はページネーションの機能まで通過するというif文を利用したものです。

 

// トータルが1以上の場合に表示
<?php if($this->Paginator->total() > 1): ?>
  <ul class="pagination">
    <?= $this->Paginator->first('<< ' . __('最初')) ?>
    <?= $this->Paginator->prev('< ' . __('前')) ?>
    <?= $this->Paginator->numbers() ?>
    <?= $this->Paginator->next(__('次') . ' >') ?>
    <?= $this->Paginator->last(__('最後') . ' >>') ?>
  </ul>
<?php endif; ?>