特集
2004/01/23 23:50:00 更新

全3回「WebプログラミングPHP言語入門」
特集:第2回 ショッピングカートの作成で分かる「PHP」の力 (5/5)


画面遷移を作る

 前章でカタログとカートのクラスを作成したが、次は画面遷移を作ってみよう。

 Webアプリケーションは、フォームやリンクによって別の画面へと遷移することで成り立っている。画面遷移を作るには、次の3つのルールを決める必要がある。

  • 画面の種類
  • 画面間の遷移
  • 遷移に使うリクエストパラメータの内容

 ショッピングカートという身近な題材であるため、どのような画面の種類と遷移があるのか、オンラインショッピングサイトを参考にすれば容易に見当が付くだろう。今回は、下図の4つの画面を作成し、オレンジの線で結んだように遷移させる。

画面の種類と遷移

画面の種類と遷移


 さて、最後に残った「遷移に使うリクエストパラメータの内容」だが、これを曖昧に決めてしまうと、後でバグの原因になりかねないので、必ず明確に決めておこう。

リクエストパラメータ一覧
画面名 リクエストパラメータ
カタログ act="catalog"
賞品の追加 act="add"
id="(商品ID)"
カートの内容を表示 act="cart"
取消(カートの内容を表示) act="remove"
id="(商品ID)"

 上表の通り、今回のショッピングカートで用いるリクエストパラメータは、どの画面に遷移するかを指示する"act"と、商品IDを示す"id"の、たった2種類だけである。

 これらの情報を基にして作成したスクリプトがsample4.phpである。

sample4.php

<?php
require_once("Cart.php");
require_once("Catalog.php");
// 指定されたリクエストパラメータを取得する
function getRequest($key, $default=null)
{
    if (isset($_REQUEST[$key])) {
        // 存在するときはリクエストパラメータを返す
        return $_REQUEST[$key];
    } else {
        // 存在しないときはデフォルト値を返す
        return $default;
    }
}
$cart =& new Cart(); // カートのインスタンス生成
$catalog =& new Catalog(); // カタログのインスタンス生成
$act = getRequest("act", "catalog"); // アクションを取得
// 変数 $act の値によって動作を変える
switch ($act) {
case "catalog": // カタログの表示
    $items = $catalog->getAll();
    $tpl = "catalog.tpl";
    break;
case "add": // カートに追加
    $id = getRequest("id");
    if (!is_null($id)) {
        $item = $catalog->getItem($id);
        $cart->addItem($item);
        $tpl = "add.tpl";
    } else {
        $items = $catalog->getAll();
        $tpl = "catalog.tpl";
    }
    break;
case "cart": // カートの中身を表示
    $items = $cart->getAll();
    $tpl = "cart.tpl";
    break;
case "remove": // カートから削除
    $id = getRequest("id");
    if (!is_null($id)) {
        $cart->removeItem($id);
    }
    $items = $cart->getAll();
    $tpl = "cart.tpl";
    break;
case "order": // 注文する
    $cart->removeAll();
    $tpl = "order.tpl";
    break;
default: // (存在しない動作)
    echo "bad action.";
    exit;
    break;
}
require($tpl);
?> 

 上記スクリプトの2〜3行目にあるrequire_onceと、スクリプトの最後にあるrequireは、このスクリプトの中に外部ファイルを読み込むことを意味している。後者は同じファイルを2回以上読み込むが、前者は1度読み込んだファイルは2度以上読み込まないという違いがある。

 2〜3行目は、前章で作成したカタログとカートのクラス定義を読み込んでおり、後ろから2行目では、画面毎のテンプレートファイル(正確には、PHPスクリプトを含んだHTMLファイル)を読み込んでいる。

 actやidの値は、スクリプトの冒頭にあるgetRequestユーザー定義関数を用いて取得している。この関数は、該当するリクエストパラメータが存在しない場合に任意の値を返すようになっている。これを、switch〜case〜default文を用いて値に応じた処理を行っている。どの画面に遷移するかは、変数 $tplに代入されたファイル名によって決まる。

テンプレートを用意する

 お気付きかもしれないが、このままの状態ではサンプルは動作しない。$tplで指定されている4つのテンプレートファイルを用意しなければならない。

catalog.tpl: 商品カタログ

<html><body>
<head><title>商品一覧画面</title></head>
<body>
<h1>商品リスト</h1>
<form action="<?=$_SERVER["SCRIPT_URL"]?>" method="post">
<table border=1>
<tr><th>商品名</th><th>価格</th><th></th></tr>
<?php foreach ($items as $id => $item) { ?>
<tr>
<td><?=$item["name"]?></td><td><?=$item["price"]?>円</td>
<td><input type="radio" name="id" value="<?=$item["id"]?>">注文</td>
</tr>
<?php } ?></table>
<input type="hidden" name="act" value="add">
<input type="submit" value="追加">
</form>
<p>[
<a href="<?=$_SERVER["SCRIPT_URL"]?>?act=cart">カートの中身を確認</a>
]</p>
</body>
</html> 
add.tpl: 商品の追加

<html><body>
<head><title>カート登録画面</title></head>
<body>
<p>下記の商品をカートに追加しました。</p>
<p>
商品名:<?=$item["name"]?><br>
価格:<?=$item["price"]?>円
</p>
<p>[
<a href="<?=$_SERVER["SCRIPT_URL"]?>">カタログに戻る</a>
|
<a href="<?=$_SERVER["SCRIPT_URL"]?>?act=cart">カートの中身を確認</a>
]</p>
</body>
</html> 
cart.tpl: カートの内容を表示

<html><body>
<head><title>カート確認画面</title></head>
<body>
<form action="<?=$_SERVER["SCRIPT_URL"]?>" method="post">
<table border=1>
<tr><th>商品名</th><th>価格</th><th>個数</th><th>合計</th><td></td></tr>
<?php foreach ($items as $id => $item) { ?>
<tr>
<td><?=$item["name"]?></td>
<td><?=$item["price"]?>円</td>
<td><?=$item["order"]?>個</td>
<td><?=$item["order"] * $item["price"]?>円</td>
<td><input type="radio" name="id" value="<?=$item["id"]?>">取消</td>
</tr>
<?php } ?></table>
<input type="hidden" name="act" value="remove">
<input type="submit" value="取消">
</form>
<p>[
<a href="<?=$_SERVER["SCRIPT_URL"]?>?act=order">この内容で注文する</a>
|
<a href="<?=$_SERVER["SCRIPT_URL"]?>">カタログに戻る</a>
]</p>
</body>
</html> 
order.tpl: 注文画面

<html><body>
<head><title>注文画面</title></head>
<body>
<p>注文を承りました。</p>
<p>[
<a href="<?=$_SERVER["SCRIPT_URL"]?>">カタログに戻る</a>
]</p>
</body>
</html>

 全てのファイルを同一ディレクトリに配置し、ブラウザからsample4.phpにアクセスしてみて欲しい。ショッピングカートのカタログ画面がWebブラウザに表示されたはずだ。

 次に、動作検証も兼ねて、スクリプトの内容と付き合わせながら操作してみよう。正しく動作していることが確認できたら、少しずつスクリプトに手を加えて試してみるのも良い。他人の作成したスクリプトを読んで手を加えるという行為は、スクリプトに含まれるノウハウを吸収できるというメリットがある。また、スクリプトが含んでいる問題点を自力で改善することで、それが自分だけのノウハウとなって蓄積されていくのだ。

次回予告

 スペースの都合上、今回は少し早足になってしまった事を深くお詫びする。次回は、PHPを使った開発現場でのノウハウなど、現場で役に立つ情報をお届けする予定である。

 今回は、サンプルスクリプトの行数およびファイルの数が多いため、筆者が勤務するゼンド・オープンソースシステムズのWebサイト上からダウンロードができるようになっている。必要な方は下記のURLにアクセスして頂きたい。

URL:http://www.zend.co.jp/archives/ITmedia/sample/

関連記事
▼特集:第1回 今から始めるWebプログラミング言語は「PHP」だ
▼ゼンド、PHP統合開発環境の最新版を販売開始

関連リンク
▼PHP米国公式サイト
▼日本PHPユーザー会

前のページ | 1 2 3 4 5 |      

[照井進吾,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.