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行目付近に定義されていて、
 となっています。
何ページ目を表示しているかは
$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=3が
3ページ目を意味することになります。
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引数無しで呼び出すと
新規の状態を表示します。