フォームデータの処理
次にフォームデータの処理からいきましょう。前回の記事でWebフォームから受け取ったデータをFileMakerにセットする箇所は次のようにコーディングしました。検索フォームからの値をそれぞれのフィールドにセットし、同時に検索結果を複数ページで分割して受け取れるように、現在の検索条件を引き継ぐための処理もしています。
//データベースに接続 $fm = new FileMaker(); $fm->setProperty('database', 'Catalog'); $fm->setProperty('hostspec', 'http://localhost'); $fm->setProperty('username', 'web'); $fm->setProperty('password', 'pass'); //検索オブジェクトの作成 $findCommand =& $fm->newFindCommand('web_catalog'); //レコードの取得範囲の指定 $findCommand->setRange($skip,$max); //検索条件の指定 if(!empty($_GET['ID'])){ $findCommand->addFindCriterion('ID','=='.$_GET['ID']); $search_query .= 'ID='.urlencode($_GET['ID']).'&'; } if(!empty($_GET['Name'])){ $findCommand->addFindCriterion('Name',$_GET['Name']); $search_query .= 'Name='.urlencode($_GET['Name']).'&'; } if(!empty($_GET['Genre_Name'])){ $findCommand->addFindCriterion( 'Genre::Genre_Name',$_GET['Genre_Name']); $search_query .= 'Genre_Name='.urlencode( $_GET['Genre_Name']).'&'; } if(!empty($_GET['Maker_Name'])){ $findCommand->addFindCriterion( 'Maker::Maker_Name',$_GET['Maker_Name']); $search_query .= 'Maker_Name='.urlencode( $_GET['Maker_Name']).'&'; } if(!empty($_GET['RegistDate'])){ //検索条件の対象が日付フィールドの場合は、 //日付の形式をmm/dd/yyyyに変換。 $registdate = date('m/d/Y', strtotime($_GET['RegistDate'])); $findCommand->addFindCriterion('RegistDate',$registdate); $search_query .= 'RegistDate='.urlencode($_GET['RegistDate']).'&'; } $findCommand->addSortRule('ID',1,FILEMAKER_SORT_ASCEND); //検索実行 $result = $findCommand->execute();
上のような処理は、対象となるフィールド数が少ないときはいいですが、フィールド数が増えると記述する量がとても多くなり大変です。スペルミスや記述漏れなどでバグなどを発生させてしまう恐れもあります。
こういったフォームデータの処理を、関数化してもっと簡単に処理できるようにしましょう。
作成する関数の要件は次のようにします。
newFindCommand
、newEditCommand(getRecordById)
、newAddCommand(createRecord)
関数などを使って、レコードの登録や編集、検索を行う際に、フィールド名と値のセットとしてまとめてこれら関数にセットできるように、フォームデータをフィールド名と値の配列に変換します。- 各Webフォームの名称を対象となるFileMakerのフィールド名と同じにして、フィールド名と同じ名称のフォームの値がFileMakerに送信されるようにします。
- 送信先のフィールドが日付フィールドの場合は、上記関数
setDate
を利用して日付書式を変換するようにします。 - 検索時に、検索条件を引き継ぐことができるように、フィールド名と検索条件の対のデータを保存するようにします。
1、2の機能を実現するため、API for PHPのレイアウトオブジェクトの関数getFields
を使ってフィールドオブジェクトを取得し、作成した関数内でフィールドオブジェクトから取得した値を使ってフォームデータの検証を行います。
/*
リクエストデータを、FileMakerにセットできる値のみに絞り込むための関数
引数は、1番目に該当レイアウトのフィールドオブジェクトの配列、
2番目がリクエストデータ。
*/ function setFields($fields,$data){ //フィールドオブジェクトの有無を判定 if(count($fields)){ //フィールドオブジェクトを展開。 foreach($fields as $field){ //フィールド名を取得 $fieldname = $field->getName(); //フィールドの属性を取得 //(日付フィールドかどうかを判断するため) $fieldtype = $field->getResult(); //フィールド名と同じキーのデータが //リクエストにあるかどうか判断。 if(array_key_exists($fieldname,$data)){ //フィールド属性が日付の場合は、 //書式変換をして配列に収める。 if($fieldtype=='date'){ $setData['field'][$fieldname] = setDate($data[$fieldname]); //その他のフィールド属性の場合は、 //そのまま配列に収める。 }else{ $setData['field'][$fieldname] = $data[$fieldname]; } //範囲指定検索のリンク用に //フィールド名と値のセットをURLにする。 if(strlen($data[$fieldname])){ $setData['query'] .= urlencode($fieldname).'=' .urlencode($data[$fieldname]).'&'; } } } //レイアウト上のフィールドデータのみに //フィルタリングされたデータと範囲指定用のURLの配列を返す。 return $setData; } }
上記関数から次のような形式での配列データを取得できます。
Array ( [field] => Array ( [フィールド名1] => 値1 [フィールド名2] => 値2 ・ ・ ) [query] => フィールド名1=値&フィールド名2=値2& )
関数をまとめよう
ここまで紹介した関数を別ファイルにまとめておき、利用する場合はこのファイルをインクルードして利用するようにしましょう。
<?php //日付データ表示用の書式変換の関数。引数に、リクエストデータと書式を渡す。 function viewDate($data , $format='Y/m/d'){ if(strlen($data)){ echo date($format,$data); } } //日付データの送信用に書式をmm/dd/yyyyに変換する関数。 //引数はリクエストデータ。 function setDate($data){ if(strlen($data)){ return date( 'm/d/Y' , strtotime($data)); } } //数字書式変換用の関数。引数にリクエストデータと桁数。 function necho($data,$dec=0){ if(is_numeric($data)){ echo number_format($data,$dec); } } /*
リクエストデータを、FileMakerにセットできる値のみに絞り込むための関数
引数は、1番目に該当レイアウトのフィールドオブジェクトの配列、
2番目がリクエストデータ。
*/ function setFields($fields,$data){ //フィールドオブジェクトの有無を判定 if(count($fields)){ //フィールドオブジェクトを展開。 foreach($fields as $field){ //フィールド名を取得 $fieldname = $field->getName(); //フィールドの属性を取得 //(日付フィールドかどうかを判断するため) $fieldtype = $field->getResult(); //フィールド名と同じキーのデータが //リクエストにあるかどうか判断。 if(array_key_exists($fieldname,$data)){ //フィールド属性が日付の場合は、 //書式変換をして配列に収める。 if($fieldtype=='date'){ $setData['field'][$fieldname] = setDate($data[$fieldname]); //その他のフィールド属性の場合は、そのまま配列に収める。 }else{ $setData['field'][$fieldname] = $data[$fieldname]; } //範囲指定検索のリンク用に //フィールド名と値のセットをURLにする。 if(strlen($data[$fieldname])){ $setData['query'] .= urlencode($fieldname).'=' .urlencode($data[$fieldname]).'&'; } } } //レイアウト上のフィールドデータのみに //フィルタリングされたデータと範囲指定用のURLの配列を返す。 return $setData; } } ?>