ページング用Smartyテンプレート

いままでいったいいくつのページャーを書いてきたのだろう・・・
いつまでも作りなおしているのは頭が悪いので、そろそろしっかり作ろうと思いました。

#使い方

##１．PHPでデータ構造体を作成してSmartyに出力する

###例）
$paging_data = array(
	&#39;total_row_count&#39; => 119,
	&#39;page_row_count&#39; => 10,
	&#39;current_page&#39; => $_REQUEST[&#39;p&#39;],
	&#39;url&#39; => &#39;http://localhost/paging.php?p=%d&#39;,
);

###定義と書式）

+ total_row_count : 表示するデータの全件数
+ page_row_count : 1ページに表示するデータの件数
+ current_page : 現在のページ（ブランク可）
+ url : ページング他ページのURL。ページ数部分を "%d" と記述する

##２．ページャーを埋め込みたい箇所でページング用Smartyテンプレートを include する

###例）
<!--{include file="_paging.tpl" paging_data=$paging_data pager_type="a" add_link_to_edge="1"}-->

###定義と書式）

+ 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 == &#39;&#39;}-->
		<!--{$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:&#39;%d&#39;:&#39;1&#39;}-->">&lt;&lt;</a><!--{else}-->&lt;&lt;<!--{/if}--></span>
		<!--{/if}-->

		<!--{if $pager_type == "a"}-->
			<!--{* タイプA *}-->

			<span <!--{if $prev < 1}-->style="visibility: hidden;"<!--{/if}-->><a href="<!--{$paging_data.url|replace:&#39;%d&#39;:$prev_str}-->">前へ</a></span>
			<span <!--{if $total_page < $next}-->style="visibility: hidden;"<!--{/if}-->><a href="<!--{$paging_data.url|replace:&#39;%d&#39;:$next_str}-->">次へ</a></span>

		<!--{elseif $pager_type == "b"}-->
			<!--{* タイプB *}-->

			<!--{* 前ページへ *}-->
			<span><!--{if 1 <= $prev}--><a href="<!--{$paging_data.url|replace:&#39;%d&#39;:$prev_str}-->">&lt;</a><!--{else}-->&lt;<!--{/if}--></span>

			<!--{* 各ページへ。前後３ページ *}-->
			<!--{$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:&#39;%d&#39;:$page_str}-->"><!--{$page}--></a><!--{else}--><!--{$page}--><!--{/if}--></span>
			<!--{/for}-->

			<!--{* 次ページへ *}-->
			<span><!--{if $next <= $total_page}--><a href="<!--{$paging_data.url|replace:&#39;%d&#39;:$next_str}-->">&gt;</a><!--{else}-->&gt;<!--{/if}--></span>

		<!--{/if}-->

		<!--{if $add_link_to_edge}-->
			<!--{* 最終ページへ *}-->
			<span><!--{if $next <= $total_page}--><a href="<!--{$paging_data.url|replace:&#39;%d&#39;:$total_page_str}-->">&gt;&gt;</a><!--{else}-->&gt;&gt;<!--{/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}-->