改行コードで区切られた回答データをラジオボタンに展開
次に、上で取得したデータをアンケートフォームに展開していくことになります。ここでのポイントの一つに、上の3で取得した関連データのフィールド「回答種類」のデータを、Webページで選択形式(ラジオボタン)で表示するように処理を行う必要があります。
回答種類のデータは改行ごとに回答データが登録されている形になっていますので、PHPのexplode
関数を使って、改行区切りで配列データに変換し、ラジオボタンに展開するようにします。
Webページでこの処理が簡単に行えるように、カスタム関数を作ります。「index.php」の上の方に記述しましょう。
<?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');
- 関数
changeRadio
に、改行を含むフィールドのデータと、Webフォームにセットするフォーム名の値を引数で渡すようにします。 - フィールドのデータを
explode
関数を使って改行区切りで配列に変換します。 - 配列に変換されたフィールドのデータ$valueListを、
foreach
関数を使って個々に取り出し、Webフォームのラジオボタンにして出力します。
アンケートフォーム表示画面 その1
次に、アンケートフォーム画面「enquete.php」のコーディングです。この画面が実際にユーザーに表示される画面となります。まずはフォームの上半分タイトルやリードなどを表示する箇所からです。
<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>
- Webページのタイトルと見出し・リードに、FileMakerから取得したフィールドの値をレコードクラスの
getField()
関数を用いて表示させています。引数でフィールド名を指定します。また、このgetField()
関数は、フィールドのデータにサニタイズ処理がされており、HTML
タグなどが変換されて表示されるようになっていますので(PHPのhtmlspecialchars
関数を適用)、フィールドデータにHTMLタグが含まれていてもセキュリティ上問題になることはございません。フィールド内のHTMLタグなどをそのまま画面上に表示させたい場合は、getFieldUnencoded()
関数を利用します。 - このアンケートフォームの値を、「receive.php」に送信して処理をするように
form
タグの値をセットします。 - このアンケートフォームからFileMakerに送信される値は、[氏名]、[年代]、[性別]([質問明細No]、[回答])×質問の数、となります。[氏名]、[年代]、[性別]は回答見出しテーブルに登録し、[質問明細No]、[回答]は回答明細テーブルに登録するようにします。
- 取得した年代と性別のデータを、
foreach
関数を使ってプルダウンやラジオボタンに展開します。
アンケートフォーム表示画面 その2
次は、質問と回答の表示部分です。
//ソース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>
- 関連データのレコードオブジェクトの配列として返ってきているので、
foreach
関数を使ってそれぞれ個々のレコードのデータを取り出します。getField()
関数を使ってフィールドの値を取り出します。フィールド名を指定する際は、テーブル名::フィールド名
という正式名称で指定します。 - 複数ある質問と回答のデータをFileMakerへの登録の際に処理しやすくするため、フォーム名を配列形式にセットします。
登録先の回答明細の明細Noフィールドにはアンケート質問テーブルの質問No、回答明細の回答フィールドには、回答種類のデータをセットするようにします。その際のフォーム名は、明細Noは「質問回答[質問No][no]」、回答は「質問回答[質問No][value]」という形になるようにします。これにより、配列質問回答には、質問No分のデータがセットされ、さらにその中に明細Noと回答のデータがセットされるようにします。
次のような形になります。
Array ( [質問回答] => Array ( [質問No] => Array ( [no] => 質問No [value] => 回答データ ) ) )
- 上で作成した
changeRadio
という自作関数を使い、フィールドのデータをラジオボタンに展開するようにします。フォーム名は配列形式になるようにしています。
以上でアンケートフォームの画面は終了です。レコードの検索に成功してアンケートデータを展開した場合の画面イメージは次のようになります。
対象のアンケートが検索できなかった場合のエラー表示画面
次に、アンケートの検索が失敗した場合のエラー画面を作成します。
<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>
エラーページにメッセージを表示させています。
アンケートフォームアクセス時に、対象のアンケートがない場合のエラー画面のイメージは次のようになります。
以上で、アンケートフォームの表示部分は終了です。
次回について
次回は、このフォームデータからのFileMakerへの登録処理、そして回答データの集計処理の作り方を解説します。