SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

FileMaker Pro 実践チュートリアル(AD)

FileMakerとPHPによるWebアンケートフォームの作成(中編)

第9回 PHPによるFileMakerのカスタムWeb公開 - (2)

  • X ポスト
  • このエントリーをはてなブックマークに追加

改行コードで区切られた回答データをラジオボタンに展開

 次に、上で取得したデータをアンケートフォームに展開していくことになります。ここでのポイントの一つに、上の3で取得した関連データのフィールド「回答種類」のデータを、Webページで選択形式(ラジオボタン)で表示するように処理を行う必要があります。

 回答種類のデータは改行ごとに回答データが登録されている形になっていますので、PHPのexplode関数を使って、改行区切りで配列データに変換し、ラジオボタンに展開するようにします。

 Webページでこの処理が簡単に行えるように、カスタム関数を作ります。「index.php」の上の方に記述しましょう。

ソース3 index.php - (3)
<?php

//文字コード指定 ※1
header("Content-Type: text/html;charset=utf-8");

//フィールドデータを値一覧にするための関数。
//展開するデータと、フォーム名を引数に渡す。 ※13
function changeRadio($data,$name){
    if(!empty($data)){
        //改行コードを区切りにして配列に収める。※14
        $valueList = explode("\n",$data);
        echo "<p>";
        //配列に収めたデータを、ラジオボタンとして出力。※15
        foreach($valueList as $value){
            echo '<input type="radio" name="'.$name.
'" value="'.$value.'">'.$value;
        }
        echo "</p>\n";
    }

}

//APIのインクルード
include_once('FileMaker.php');
  1. 関数changeRadioに、改行を含むフィールドのデータと、Webフォームにセットするフォーム名の値を引数で渡すようにします。
  2.  
  3. フィールドのデータをexplode関数を使って改行区切りで配列に変換します。
  4.  
  5. 配列に変換されたフィールドのデータ$valueListを、foreach関数を使って個々に取り出し、Webフォームのラジオボタンにして出力します。

アンケートフォーム表示画面 その1

 次に、アンケートフォーム画面「enquete.php」のコーディングです。この画面が実際にユーザーに表示される画面となります。まずはフォームの上半分タイトルやリードなどを表示する箇所からです。

ソース4 enquete.php - (1)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?=$record->getField('WEBタイトル')?></title>
</head>

<body>
<h1><?=$record->getField('WEBタイトル')?></h1>
<p><?=nl2br($record->getField('WEBリード'))?></p>
<form action="receive.php" method="post">
<input type="hidden" name="アンケートNo"
       value="<?=$record->getField('アンケートNo')?>" />
<p>氏名:<input type="text" name="氏名" value="" /></p>
<p>年代:<select name="年代">
<option value=""></option>
<?php
foreach($ages as $age){
    echo '<option value="'.$age.'">'.$age.'</option>';
}
?>
</select></p>
<p>性別:
<?php
foreach($sexs as $sex){
    echo '<input type="radio" name="性別" value="'.$sex.'">'.$sex;
}
?></p>
  1. Webページのタイトルと見出し・リードに、FileMakerから取得したフィールドの値をレコードクラスのgetField()関数を用いて表示させています。引数でフィールド名を指定します。また、このgetField()関数は、フィールドのデータにサニタイズ処理がされており、HTMLタグなどが変換されて表示されるようになっていますので(PHPのhtmlspecialchars関数を適用)、フィールドデータにHTMLタグが含まれていてもセキュリティ上問題になることはございません。フィールド内のHTMLタグなどをそのまま画面上に表示させたい場合は、getFieldUnencoded()関数を利用します。
  2.  
  3. このアンケートフォームの値を、「receive.php」に送信して処理をするようにformタグの値をセットします。
  4.  
  5. このアンケートフォームからFileMakerに送信される値は、[氏名]、[年代]、[性別]([質問明細No]、[回答])×質問の数、となります。[氏名]、[年代]、[性別]は回答見出しテーブルに登録し、[質問明細No]、[回答]は回答明細テーブルに登録するようにします。
  6.  
  7. 取得した年代と性別のデータを、foreach関数を使ってプルダウンやラジオボタンに展開します。

アンケートフォーム表示画面 その2

 次は、質問と回答の表示部分です。

ソース4 enquete.php - (1)
//ソース4の続き。
<?php
if(count($questions)){
    echo "<ul>\n";
    //質問と回答のデータを質問の数だけ展開する。 ※16
    foreach($questions as $question){
        echo "<li>".
            $question->getField('アンケート質問::質問')."</li>\n";
        //隠しタグで回答明細の明細Noにセットする質問Noを出力 ※17
        echo '<input type="hidden" name="質問回答['
.$question->getField('アンケート質問::質問No').'][no]" value="'
.$question->getField('アンケート質問::質問No').'">';
        //上で作成した関数に、フィールドのデータとフォーム名を
        //引数にしてラジオボタンに展開する。※18
        echo changeRadio($question->getField('アンケート質問::回答種類'),
        '質問回答['.$question->getField('アンケート質問::質問No').'][value]');
    }
    echo "</ul>\n";
}
?>
<p>
<input type="submit" name="_create" value="送信" />
<input type="reset" value="リセット" />
</p>
</form>
</body>
</html>
  1. 関連データのレコードオブジェクトの配列として返ってきているので、foreach関数を使ってそれぞれ個々のレコードのデータを取り出します。getField()関数を使ってフィールドの値を取り出します。フィールド名を指定する際は、テーブル名::フィールド名という正式名称で指定します。
  2.  
  3. 複数ある質問と回答のデータをFileMakerへの登録の際に処理しやすくするため、フォーム名を配列形式にセットします。

 登録先の回答明細の明細Noフィールドにはアンケート質問テーブルの質問No、回答明細の回答フィールドには、回答種類のデータをセットするようにします。その際のフォーム名は、明細Noは「質問回答[質問No][no]」、回答は「質問回答[質問No][value]」という形になるようにします。これにより、配列質問回答には、質問No分のデータがセットされ、さらにその中に明細Noと回答のデータがセットされるようにします。

 次のような形になります。

Array
(
    [質問回答] => Array
        (
            [質問No] => Array
                (
                    [no] => 質問No
                    [value] => 回答データ
                )
    )
)
  1. 上で作成したchangeRadioという自作関数を使い、フィールドのデータをラジオボタンに展開するようにします。フォーム名は配列形式になるようにしています。

 以上でアンケートフォームの画面は終了です。レコードの検索に成功してアンケートデータを展開した場合の画面イメージは次のようになります。

図22 アンケートフォーム
図22 アンケートフォーム

対象のアンケートが検索できなかった場合のエラー表示画面

 次に、アンケートの検索が失敗した場合のエラー画面を作成します。

ソース5 enquete_error.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WEBアンケート</title>
</head>

<body>
<h1>WEBアンケート</h1>
<p>現在募集しているアンケートはございません。(<?=$error_mes?>)</p>
</body>
</html>

 エラーページにメッセージを表示させています。

 アンケートフォームアクセス時に、対象のアンケートがない場合のエラー画面のイメージは次のようになります。

図22-1 アンケートフォームエラー画面
図22-1 アンケートフォームエラー画面

 以上で、アンケートフォームの表示部分は終了です。

次回について

 次回は、このフォームデータからのFileMakerへの登録処理、そして回答データの集計処理の作り方を解説します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
FileMaker Pro 実践チュートリアル連載記事一覧

もっと読む

この記事の著者

堀 直樹(ホリ ナオキ)

大学卒業後入社の企業にて、趣味のFileMaker使いからなりゆきで社内のシステム担当となり社内システムの開発に孤軍奮闘する。その後ソフトハウスに転職してFileMakerによるシステム開発に従事し、現在は株式会社キクミミにて数々の企業のシステムを開発する。PHPによるカスタムWebでのシステム構築...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2211 2009/01/19 19:15

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング