掲示板にページャーを導入してみた

安藤(プログラマー)
演劇もやっていまする。

どうも、安藤です。
今日もせっせと掲示板を作っています!(もちろん通常業務もやってます)

掲示板といえば何百件と投稿されるものなので、1ページの表示件数と表示ページ数を設定しないといずれ大変なことに。。
ということで、ページャーを組み込むことにしました。

四苦八苦したのですが、とりあえず書くとこんな感じ。

index.php

・・・
//変数を初期化
$posted_data = array();
$total_page = null;
$next_page = null;
$previous_page = null;
//ページ情報の取得
$page = isset($_GET['page'])? htmlspecialchars($_GET['page']): 1;
//表示件数の設定
$per_page = 5;
//表示ページ数の設定
$show_page= 5;
//OFFSET値の算出
$offset = ($page-1) * $per_page;
//全投稿件数の取得
$sql = "SELECT COUNT(*) AS COUNT FROM posting";
$result = mysqli_query($com,$sql);
//結果を連想配列で取得
$row = mysqli_fetch_assoc($result);
//総ページ数
$total_page = ceil(intval($row['COUNT']) / $per_page);
//ページの始点
$start_page = 1;
//ページの終点
$end_page = $total_page;
//前後ページの取得
if($page < $end_page)
{
$next_page = $page + 1;
}
if($page > $start_page)
{
$previous_page = $page - 1;
}
//表示ページ数の再設定
if($total_page < $show_page)
{
$show_page = $total_page;
}
//ページループの中心点を設定
$show_page_half = floor($show_page / 2);
$loop_start = $page - $show_page_half;
$loop_end = $page + $show_page_half;
//表示するページ番号の算出
if ($loop_start <= 0)
{
$loop_start = 1;
$loop_end = $show_page;
}
if ($loop_end > $total_page)
{
$loop_start = $total_page - $show_page + 1;
$loop_end = $total_page;
}
//投稿一覧データの取得
$sql = "SELECT * FROM posting ORDER BY id DESC LIMIT $per_page OFFSET $offset";
$result = mysqli_query($com,$sql);
if($result !== false)
{
while($row = mysqli_fetch_assoc($result))
{
//結果を表示用の配列に追加
array_push($posted_data,$row);
}
}
//twigを使用
require_once '../vendor/autoload.php';
//twigの設定
$loader = new Twig_Loader_Filesystem('./');
$twig = new Twig_Environment($loader);
//テンプレートを使用
$template = $twig->loadTemplate('index.html.twig');
//レンダリング
echo $template->render(
array(
'page' => $page,
'start_page' => $start_page,
'end_page' => $end_page,
'next_page' => $next_page,
'previous_page' => $previous_page,
'loop_start' => $loop_start,
'loop_end' => $loop_end,
'posted_data' => $posted_data,
)
);
・・・

するとこんなページャーが、、、!

1

デザインは手をつけていないので質素ですが、現状の機能としては問題ないかと。
ちなみにTwig側はこんな具合になります!

index.html.twig

・・・
<div style="font-size:x-large; color:#ff8200;">
【 今までの投稿一覧 】
</div>
<span style="color:#535353;">
{% if page > start_page %}
<a href="/index.php?page={{start_page}}/">«first</a>  
{% else %}
«first  
{% endif %}
{% if previous_page %}
<a href="/index.php?page={{previous_page}}/"><</a> 
{% else %}
{% endif %}
{% for count in loop_start..loop_end %}
{% if count == page %}
{{count}} 
{% else if end_page >= 1 %}
<a href="/index.php?page={{count}}/">{{count}}</a> 
{% endif %}
{% endfor %}
{% if next_page %}
 <a href="/index.php?page={{next_page}}/">></a>
{% else %}
 >
{% endif %}
{% if page < end_page %}
  <a href="/index.php?page={{end_page}}/">last»</a>
{% else %}
  last»
{% endif %}
</span>
・・・

これで、1ページに投稿は5件まで表示、ページは5ページ分までで、ページの中心数から前後2ページ分を表示できるようになりました!!
つまりはこう!!

2

うんうん、なかなか快適なBBSになってきました。まだまだだけど・・。

次は投稿した記事の編集・削除機能を組み込もうと思います。 よし・・・

頑張ろう。