002.一覧ページの記述方法

 ここでは、上層PHPであるsources/prefecture_list.phpについて説明します。
 ただ、上層PHPはデザインやPOSTする具体的な方法などが記述されます。これらは、各サイトによっても考え方も違うでしょうし、JQueryやJavaScriptの使用状況によっても記述が変わってくると思います。
 ですので、上層ページにおけるコンテンツDBクラスのメンバ関数呼び出しを中心に説明したいと思います。

一覧ページの機能

 前々項で動作チェックしたように、都道府県一覧には以下の機能があります。
1、ページ分けされた一覧表示
2、各項目の削除
3、詳細ページへのリンク
4、新規の形での詳細ページへのリンク
 この項では、それぞれの機能ごとに説明したいと思います。sources/prefecture_list.phpを開いてください。
 まず、phpブロックの最初に
//ライブラリをインクルード
require_once("inc_base.php");
require_once($CMS_COMMON_INCLUDE_DIR . "libs.php");
 という2行があります。これはPHPBaseライブラリのインクルード(require_once()関数を使用してます)です。
 まず、inc_base.phpが呼ばれてます。これはsources/inc_base.phpをさし、以下のような内容になってます。
<?php
$CMS_COMMON_INCLUDE_DIR = "common/";
?>
 このファイルにはcommonディレクトリ(つまりライブラリのディレクトリ)への相対パスを記述します。PHPBase本体commonディレクトリ内にあります。しかし、各ページは、ディレクトリ階層化されていて記述されることも多々あります。
 そのため、各ディレクトリにinc_base.phpというファイルを置き、そのディレクトリからcommonディレクトリへの相対パスを記述しておくのです。こうすると、各ページのPHPがディレクトリを移動することになっても、移動先のディレクトリにinc_base.phpがあれば、commonディレクトリは参照できる形になります。
 inc_base.phpでは$CMS_COMMON_INCLUDE_DIRが定義されますので、require_onceの2行目では、そのパス内のlibs.phpを呼び出しています。以下がcommon/libs.phpの内容です。
<?php
//ユーティリティクラス他
require_once("function.php");
//コントロールクラス他
require_once("controls.php");
//コントロールクラスエクストラ(オプション)
require_once("controls_ex.php");
//他ユーティリティ
require_once("contents_func.php");
//このコンテンツ独自の
//DBの継承クラスの定義
require_once("contents_db.php");
 ここではPHPBaseライブラリを初期化するphpが、すべて呼ばれています。赤くなっている部分は、コンテンツDBのPHPファイル(すなわちcontents_db.php)が呼ばれています。
 サイトによってはテーブルが多数になる場合もあります。そのような場合はcontents_db.phpだけではコンテンツDBクラスを記述しきれません。そんな場合はphpファイルを分けcontents_db2.phpなどをcommonディレクトリ内に作成してそこに記述するといいでしょう。その場合はlibs.phpにそのファイルを追記するのを忘れすに。

1、ページ分けされた一覧表示

 まず、ページ分けですが、ページ分けに必要な情報は、1ページ何行表示するか現在何ページ目を表示しているかレコードの総数です。
 これらの情報があればページ分けされたページを作成できます。
 1ページ何行表示するかは33行目付近に定義されていて、
//1ページのリミット
$limit = 20;
 となっています。何ページ目を表示しているか$page = 1;とデフォルト(1ページ目)を設定した後、$_GET['page']が設定されていたら、そのページにします。
 レコードの総数は後ほど紹介するとして、まず、該当ページのデータ読み込みですがreaddata()関数に記述があります。
function readdata(){
    global $limit;
    global $rows;
    global $page;
    $obj = new cprefecture();
    $from = ($page - 1) * $limit;
    $rows = $obj->get_all(false,$from,$limit);
}
 ここで、赤くなっている部分で、前項で記述したcprefectureクラスのインスタンスを$objに構築しています。
 そして、$from$pageと$limitから割り出し$obj->get_all()関数呼び出し$rowsに代入しています。
 $rowsはグローバル変数ですので、ほか関数等からもアクセスできる形になります。
 $rowsを使ってHTMLを作成しているのがecho_prefecture_list()関数です
function echo_prefecture_list(){
    global $rows;
    global $page;
    $retstr = '';
    $urlparam = '&page=' . $page;
    $rowscount = 1;
    if(count($rows) > 0){
        foreach($rows as $key => $value){
        $javamsg =  '【' . $rows[$key]['prefecture_name'] . '】';
        $nobottom = '';
        if($rowscount == count($rows)){
            $nobottom = ' nobottom';
        }
        $str =<<<END_BLOCK
<tr>
<td width="20%" class="center{$nobottom}">
{$rows[$key]['prefecture_id']}
</td>
<td width="65%" class="center{$nobottom}">
<a href="prefecture_detail.php?pid={$rows[$key]['prefecture_id']}{$urlparam}">{$rows[$key]['prefecture_name']}</a>
</td>
<td width="15%" class="center{$nobottom}">
<input type="button" value="削除確認" onClick="javascript:del_func_form({$rows[$key]['prefecture_id']},'{$javamsg}')" />
</td>
</tr>
END_BLOCK;
        $retstr .= $str;
        $rowscount++;
        }
    }
    else{
        $retstr =<<<END_BLOCK
<tr><td colspan="3" class="nobottom">都道府県が見つかりません</td></tr>
END_BLOCK;
    }
    echo $retstr;
}
 ヒアドキュメントを使いながら<tr>タグや<td>タグを作成しています。
 そして、このecho_prefecture_list()関数を呼び出しているのが、下方のHTMLエリアにある
<table>
<tr>
<th>都道府県ID</th>
<th>都道府県名</th>
<th>操作</th>
</tr>
<?php echo_prefecture_list(); ?>
</table>
 の部分です。<table>タグで挟んでいます。

 さてページ分けの部分ですがページのリンクを作成します。これを作成しているのがecho_page_block()関数です。
function echo_page_block(){
    global $limit;
    global $page;
    $obj = new cprefecture();
    $allcount = $obj->get_all_count(false);
    $ctl = new cpager($_SERVER['PHP_SELF'],$allcount,$limit);
    $ctl->show('page',$page);
}
 $limit$pageはグローバル変数を参照しています。そしてレコード総数ですが、これはcprefectureのインスタンス$objに作成し、メンバ変数get_all_count()関数を呼び出します。
 そのあとの赤くなっている部分ですが、ページへのリンクをページャーと称しています。ページャーcpagerクラスというクラスで簡単に作成できます。
 cpagerクラスcommon/controls.phpに記述されています。内容は説明しませんので各自読んでください。
 cpagerクラスはコンストラクタで基準のURLレコード総数1ページ当たりの行数を渡します。
 その後show()メンバ関数を呼び出せばそこに表示されます。
 show()メンバ関数に渡す('page',$page)という引数は、$_GETページを表す変数名とその値です。
 このページではhttp://www.hoge.huga/sources/prefecture_list.php?page=3のようにアクセスすると3ページ目にアクセスできます。('pg',$page)のように記述するとhttp://www.hoge.huga/sources/prefecture_list.php?pg=33ページ目を意味することになります。

2、各項目の削除

 項目の削除はJavaScriptによる記述と、PHPによる削除の両方で実装します。
 まずJavaScriptですが、HTMLブロックの<head>タグ内に
function del_func_form(pm,mess){
    var message = "本当に\r\n";
    message += mess;
    message += "\r\nを削除しますか?";
    if(confirm(message)){
        document.form1.target = "_self";
        document.form1.func.value = 'del';
        document.form1.param.value = pm;
        document.form1.submit();
    }
}
 と記述します。この関数のパラメータに渡されるのはpmが削除するID、messが都道府県名を【 】で強調した文字列です。
 PHPについては、上記紹介したecho_prefecture_list()関数のヒアドキュメント内の1行分の記述に
        $str =<<<END_BLOCK
<tr>
<td width="20%" class="center{$nobottom}">
{$rows[$key]['prefecture_id']}
</td>
<td width="65%" class="center{$nobottom}">
<a href="prefecture_detail.php?pid={$rows[$key]['prefecture_id']}{$urlparam}">
    {$rows[$key]['prefecture_name']}</a>
</td>
<td width="15%" class="center{$nobottom}">
<input type="button" value="削除確認" 
    onClick="javascript:del_func_form({$rows[$key]['prefecture_id']},'{$javamsg}')" />
</td>
</tr>
END_BLOCK;
 の赤くなっているところのように記述します。(このドキュメントの表示領域の関係で必要のない改行が入ってますが、ソースを確認ください)。なおあらかじめ$javamsgに装飾した都道府県名を代入しておきます。

 実際の削除処理はPHPのdeljob()関数で行います。
function deljob(){
    $chenge = new cchange_ex();
    if($_POST['param'] > 0){
        $chenge->delete("prefecture","prefecture_id=" . $_POST['param']);
    }
}
 このようにcchange_exクラスのインスタンスを構築し、$chenge->delete()関数を呼び出します。引数はテーブル名、条件になります。
 cchange_exクラスSELECT文のように派生クラスを作成する必要はありません。このように直接操作します。
cchange_exクラスでは、このほかにinsertとupdateを行うことができます。

3、詳細ページへのリンク

 こちらも削除同様、ヒアドキュメント内の1行分の部分に記述します。
        $str =<<<END_BLOCK
<tr>
<td width="20%" class="center{$nobottom}">
{$rows[$key]['prefecture_id']}
</td>
<td width="65%" class="center{$nobottom}">
<a href="prefecture_detail.php?pid={$rows[$key]['prefecture_id']}{$urlparam}">
    {$rows[$key]['prefecture_name']}</a>
</td>
<td width="15%" class="center{$nobottom}">
<input type="button" value="削除確認" 
    onClick="javascript:del_func_form({$rows[$key]['prefecture_id']},'{$javamsg}')" />
</td>
</tr>
END_BLOCK;

4、新規の形での詳細ページへのリンク

 こちらはHTMLブロックにリンクを記述します。
<p><a href="prefecture_detail.php">新規</a></p>
 詳細ページであるprefecture_detail.phpはGET引数無しで呼び出すと新規の状態を表示します。