Smartyでページ送り
2007.06.15 Author: Jas
PHPでいくつかの課題を終わらせ、先月よりSmartyというテンプレートエンジンを使い始めました。
最近は、やっと慣れてきて簡単なテンプレートの作成もできるようになってきたところです。
そこで、今日はSmartyを使って作ったテンプレートをひとつ紹介したいと思います。
ニュース一覧や掲示板、予定表などで多数のデータがあるときに、1ページに全部表示させると見難くなってしまいます。そこで、5件ごとや10件ごとなどのように指定の件数ごとにページを分け、リンクによって前のページや次のページに移動させるページ送りの機能があるのですが、それをSmartyで作ると下のようになります。
【page.tpl】
{if isset($smarty.get.page) && $smarty.get.page != 1}
<a href="?page={$smarty.get.page-1}"><<- 前</a>
{else}
<<- 前
{/if}{$smarty.get.page} / {$tpage}
{if isset($smarty.get.page) && $smarty.get.page < $total_page}
<a href="?page={$smarty.get.page+1}">次 ->></a>
{else}
次 ->>
{/if}
このテンプレートについて、簡単に説明します。
まず、"$smarty.get.page"はSmartyの予約変数で、フォームから送られたGETの値を表示することができます。今回の場合だと、GETで送られてきたpageの値です。
予約変数を使うとGET以外にもPOSTやSESSION、サーバ変数などの値をPHPから渡さなくても、直接表示できるので大変便利です。
1行目からの条件文はPHPのif文と同じで、GETのpageがセットされていて、ページが1ではない場合です。1ページ目の場合には前のページへのリンクが必要がないので、リンクを表示させないようにするためです。
同様に、9行目の条件文は最後のページに次のページへのリンクが表示されなくなっています。
7行目ですが、これは全ページ数中の何ページ目にいるのかを表示しています。
$total_pageは、全データ数を1ページあたりの表示数で割り、小数を切り上げた値で、PHPから渡します。
【PHP】
$total_page = ceil($total_data /$number_per_page);
$smarty->assign("total_page", $total_page);
あとはテンプレートのほうを"page.tpl"という名前で保存し、ページ送りのリンクを表示したい部分に埋め込むだけです。テンプレートを埋め込む時にはincludeを使います。
{include file="page.tpl"}
このように、一度"page.tpl"のテンプレートを作っておけば、上の一文を書くだけでページ送りのリンクを表示することができるようになります。
このような便利なテンプレートパーツを徐々に増やしていって、効率よく開発ができるようになりたいですね。