いままでいったいいくつのページャーを書いてきたのだろう・・・
いつまでも作りなおしているのは頭が悪いので、そろそろしっかり作ろうと思いました。
使い方
1.PHPでデータ構造体を作成してSmartyに出力する
例)
$paging_data = array(
'total_row_count' => 119,
'page_row_count' => 10,
'current_page' => $_REQUEST['p'],
'url' => 'http://localhost/paging.php?p=%d';,
);
定義と書式)
- total_row_count : 表示するデータの全件数
- page_row_count : 1ページに表示するデータの件数
- current_page : 現在のページ(ブランク可)
- url : ページング他ページのURL。ページ数部分を "%d" と記述する
2.ページャーを埋め込みたい箇所でページング用Smartyテンプレートを include する
例)
定義と書式)
- file : 後述するテンプレートコードを格納したファイル名
- paging_data : 1で定義したデータ構造体
- pager_type : a もしくは b を入力する。 aはシンプルに「前へ」「次へ」。 bはGoogle検索結果形式
- add_link_to_edge : 任意項目。値を入力すると、最初のページと最後のページへのリンクを出力する
Smartyテンプレートコード(_paging.tpl という名前で保存)
<!--{$total_page = ceil($paging_data.total_row_count / $paging_data.page_row_count)}-->
<!--{$total_page_str = $total_page|string_format:"%d"}-->
<!--{if $paging_data.current_page == ''}-->
<!--{$paging_data.current_page = 1}-->
<!--{/if}-->
<!--{if $total_page}-->
<!--{$prev = $paging_data.current_page - 1}-->
<!--{$prev_str = $prev|string_format:"%d"}-->
<!--{$next = $paging_data.current_page + 1}-->
<!--{$next_str = $next|string_format:"%d"}-->
<!--{if $add_link_to_edge}-->
<!--{* 先頭ページへ *}-->
<span><!--{if 1 <= $prev}--><a href="<!--{$paging_data.url|replace:'%d':'1'}-->"><<</a><!--{else}--><<<!--{/if}--></span>
<!--{/if}-->
<!--{if $pager_type == "a"}-->
<!--{* タイプA *}-->
<span <!--{if $prev < 1}-->style="visibility: hidden;"<!--{/if}-->><a href="<!--{$paging_data.url|replace:'%d':$prev_str}-->">前へ</a></span>
<span <!--{if $total_page < $next}-->style="visibility: hidden;"<!--{/if}-->><a href="<!--{$paging_data.url|replace:'%d':$next_str}-->">次へ</a></span>
<!--{elseif $pager_type == "b"}-->
<!--{* タイプB *}-->
<!--{* 前ページへ *}-->
<span><!--{if 1 <= $prev}--><a href="<!--{$paging_data.url|replace:'%d':$prev_str}-->"><</a><!--{else}--><<!--{/if}--></span>
<!--{* 各ページへ。前後3ページ *}-->
<!--{$start_page = max(1, $paging_data.current_page - 3)}-->
<!--{$end_page = min($total_page, $paging_data.current_page + 3)}-->
<!--{for $page=$start_page to $end_page}-->
<!--{$page_str = $page|string_format:"%d"}-->
<span><!--{if $page != $paging_data.current_page}--><a href="<!--{$paging_data.url|replace:'%d':$page_str}-->"><!--{$page}--></a><!--{else}--><!--{$page}--><!--{/if}--></span>
<!--{/for}-->
<!--{* 次ページへ *}-->
<span><!--{if $next <= $total_page}--><a href="<!--{$paging_data.url|replace:'%d':$next_str}-->">></a><!--{else}-->><!--{/if}--></span>
<!--{/if}-->
<!--{if $add_link_to_edge}-->
<!--{* 最終ページへ *}-->
<span><!--{if $next <= $total_page}--><a href="<!--{$paging_data.url|replace:'%d':$total_page_str}-->">>></a><!--{else}-->>><!--{/if}--></span>
<!--{/if}-->
<!--{/if}-->
<!--{if $debug}-->
■ページングデバッグ<br />
件数:<!--{$paging_data.total_row_count}--><br />
全ページ数:<!--{$total_page}--><br />
表示ページ:<!--{$paging_data.current_page}--><br />
URL:<!--{$paging_data.url}--><br />
ページ内表示件数:<!--{$paging_data.page_row_count}--><br />
<!--{/if}-->