忍者ブログ
バナヤンの忍者風呂
忍者ブログのカスタマイズ、各種WEBツールのテストなど試行錯誤の日々。 VMLによる地図の作成を研究していましたが、一時中断して、今はPHPを勉強しているところです。
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
お知らせ
この欄には管理人からのお知らせなどを掲載します。
[67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP ページ切替ナビ付テーブル(CSV)

PHPの勉強中です。

前回の「PHP ページ切替ナビゲーション($_GET)」では、ページ切替ナビゲーションの表示方法を考えました。今回はこれの応用です。1ページに表示するレコード数を限定して、表示されていないレコードへはページを切り替えて閲覧できるようにします。

データのサンプルには、都道府県コードのCSVファイルを使用します。

都道府県コードのCSVファイルについては、これまでも「PHP CSVファイルの読込み(fgetcsv) 」、「PHP ユーザー定義関数(function)」などで使用してきました。今回は、これらの記事で掲載したソースのサンプルも流用します。

まず、出来上がりのイメージを見ましょう。

[画面サンプル]ページ切替ナビ付テーブル ページ1
ページ切替ナビ付テーブル1

「ページ切替ナビゲーション」の数字をクリックするとページが移動します。

[画面サンプル]ページ切替ナビ付テーブル ページ2
ページ切替ナビ付テーブル2

前回の「PHP ページ切替ナビゲーション($_GET)」で作成した「ページ切替ナビゲーション」表示用の関数「function page_navi」は、PHPソースの中で、そのまま使用しています。この関数は、総ページ数を入力して使用する関数でした。

この総ページ数を求めるために第2の関数を利用しました。
ファイル名がわかれば、総レコード数が算出できます。
1ページに表示するレコード数を指定すれば、割り算の商で総ページが計算できます。
あとは何ページ目を表示するかという指示をすればいいわけですが、ここでは何番目のレコードから表示するかという設定にしました。「ページ切替ナビゲーション」でクリックしたページ番号で何番目のレコードから表示すればいいか計算できるからです。そうすることにより、CSVファイルのデータの読込みとHTMLテーブルの行の作成を同時に行うことができます。

このように考えて、第2の関数は「ファイル名、開始レコード番号、1行に表示するレコード数」の3つのパラメータを指定して実行することにしました。


###ユーザー定義関数fgetcsv2table_page
$row_num=fgetcsv2table_page($filename,$row_from,$pagerows);

echo "<hr>";
echo "全".$row_num."件<br>";
echo "<hr>";
$page=$row_num/$pagerows;

この関数は、HTMLのテーブルを出力するとともに、戻り値として、ファイルの総レコード数を返します。返された総レコード数を1行に表示するレコード数で割って総ページ数を算出しています。

画面イメージの「全47件」と[5]という総ページ数は、こうして表示したものです。

[画面サンプル]ページ切替ナビ付テーブル ページ3
ページ切替ナビ付テーブル3

また、画面サンプルでは、1行おきにライトグリーンの背景色になっています。これは、tr要素のclass属性を1行おきに変えて、スタイルシートで背景色を設定しています。

[ソース」スタイルシート部分

<style type='text/css'>
<!--
.csv {border-collapse:collapse;}
.csv td {border:#030 solid 1px;}
.row_class0{background-color:#cfc;}
.row_class1{background-color:#fff;}
.field0{text-align:right;}
-->
</style>



[画面サンプル]ページ切替ナビ付テーブル ページ4
ページ切替ナビ付テーブル4
最後に全体のソースを掲載しましょう。


<?php
###ユーザー定義関数の登録
##ページナビ
function page_navi($lastpage){
for($i=1;$i<=$lastpage+1;$i++){
echo "<a href=$_SERVER[PHP_SELF]?page_num=".$i.">[".$i."]</a>";
}
}
?>

<?php
###ユーザー定義関数の登録
function fgetcsv2table_page($filename,$row_from,$pagerows){
$fp = fopen($filename,"r");
if(!($fp)){
die("ファイルをオープンできません。");
}else{
$row_num=0;
$row_to=$row_from + $pagerows;
echo "<table class='csv'>\r\n";
while($row=fgetcsv($fp,1000,",")){
$page=$rownum/$pagerows;
$row_class=$row_num % 2;
if($row_num>=$row_from&&$row_num<$row_to){
echo"<tr class='row_class".$row_class."'>";
$fields=count($row);
for($i=0;$i<$fields;$i++){
echo "<td class='field".$i."'>".$row[$i]."</td>";
}
echo "</tr>\r\n";
}
$row_num++;
}
echo "</table>";
fclose($fp);
}
return $row_num;
}
?>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Pragma" content="no-cache">
<title>fgetcsv2table_page()</title>
<style type='text/css'>
<!--
.csv {border-collapse:collapse;}
.csv td {border:#030 solid 1px;}
.row_class0{background-color:#cfc;}
.row_class1{background-color:#fff;}
.field0{text-align:right;}
-->
</style>
</head>
<body>


<?php
//テスト用データ
$filename="pref.csv";
$pagerows=10;
$row_from=0;
if($_GET['page_num']){
$row_from=($_GET['page_num']-1)*$pagerows;
}


###ユーザー定義関数fgetcsv2table_page
$row_num=fgetcsv2table_page($filename,$row_from,$pagerows);

echo "<hr>";
echo "全".$row_num."件<br>";
echo "<hr>";
$page=$row_num/$pagerows;
###ユーザー定義関数page_navi
page_navi($page);
if($_GET['page_num']){
$page_num=$_GET['page_num'];
$row_from=$pagerows * $page_num;
}

?>
</body>
</html>



最後のページの画面サンプルも載せておきましょう。

[画面サンプル]ページ切替ナビ付テーブル ページ5
ページ切替ナビ付テーブル5
PR
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.