関数の使用例
それではこれらの関数を利用した実際のコーディングの例を見てみましょう。
レコードの検索
まずはレコードの検索から解説します。
//APIの読み込み include_once('FileMaker.php'); //関数の読み込み ※1 include_once('function.php'); //データベースに接続 $fm = new FileMaker(); $fm->setProperty('database', 'Catalog'); $fm->setProperty('hostspec', 'http://localhost'); $fm->setProperty('username', 'web'); $fm->setProperty('password', 'pass'); $layout = 'web_catalog'; //レイアウトオブジェクトの取得 ※2 $layout_obj=$fm->getLayout($layout); $fields_obj=$layout_obj->getFields(); //カスタム関数を使って、リクエストデータをフィールドオブジェクトに //フィルタリングして有効なデータのみ抽出。 ※3 $setData = setFields($fields_obj,$_GET); $fields_array = $setData['field']; $search_query = $setData['query']; //検索オブジェクトの作成 $findCommand =& $fm->newFindCommand($layout); //レコードの取得範囲の指定。 $findCommand->setRange($skip,$max); //検索条件のセット ※4 foreach($fields_array as $key => $value){ $findCommand->addFindCriterion($key,$value); } $findCommand->addSortRule('ID',1,FILEMAKER_SORT_ASCEND); //検索実行 $result = $findCommand->execute();
- 作成した関数「function.php」を読み込みます。
getLayout
関数を使って指定したレイアウトのレイアウトオブジェクトを取得し、そこからさらにgetFields
関数を利用して対象レイアウトのフィールドオブジェクトを取得します。- 作成した関数
setData
に、取得したフィールドオブジェクト$field_obj
とWebフォームからのデータ$_GET
を渡して、フィールドと値の配列、および検索条件のセットを取得します。 foreach
関数でフィールドと値のセットを展開し、addFindCriterion
関数に検索条件をセットしていきます。
これでPHPのコーディング内には具体的な各フォーム名などを記述することなく、必要なすべての値をセットすることができます。レコード検索時のコーディングをするときは、上のソースをコピペして、レイアウト名やソート条件など最低限なところだけ変更するだけで済みます。とっても楽になりますね。
レコード登録・編集
上の例では、フォームデータをsetFields
関数を使って、FileMakerに送信するもののみに絞り込み、PHPのforeach
関数でaddFindCriterion
関数にセットしました。レコード登録や編集などは、レコード登録・編集オブジェクト作成時に、同時にフィールド名と値のデータをセットできるので、記述はもっと楽になります。
//APIの読み込み include_once('FileMaker.php'); //関数の読み込み ※1 include_once('function.php'); //データベースに接続 $fm = new FileMaker(); $fm->setProperty('database', 'Catalog'); $fm->setProperty('hostspec', 'http://localhost'); $fm->setProperty('username', 'web'); $fm->setProperty('password', 'pass'); $layout = 'web_catalog'; //レイアウトオブジェクトの取得 $layout_obj=$fm->getLayout($layout); $fields_obj=$layout_obj->getFields(); //カスタム関数を使って、リクエストデータをフィールドオブジェクトに //フィルタリングして有効なデータのみ抽出。※1 $setData = setFields($fields_obj,$_GET); $fields_array = $setData['field']; //レコード登録オブジェクトを作成。フィールドデータも渡す。※2 $record =& $fm->createRecord($layout,$fields_array); //登録実行 $result = $record->commit();
- 「result.php」と同様に、フォームからのデータを
setFields
関数を使ってフィールド名と値のセットにします。 createRecord
関数を使ってレコード登録オブジェクトを作成するときに、引数にフィールド名と値のセットを渡します。
記述がさらに簡単になりました。フィールドと値のセットを渡せる関数を利用する場合(注2)はこの方法がとても便利です。
処理 | 関数 |
レコード登録 | createRecord、newAddCommand |
レコード編集 | newEditCommand |
foreach
関数などで、値のセットをaddFindCriterion
関数に流し込むようにします。まとめ
いかがでしたか? 前回紹介したコーディングに比べれば、カスタム関数を利用した場合の方がコーディングがとてもすっきりし、しかも汎用性のあるものになったことに気付くと思います。
今回は、日付データの処理やフォームデータの処理など、よく利用される機能を関数化する方法を紹介しました。毎回同じことを記述して面倒だなと感じるところを関数化することにより、それ以降のコーディングがとても楽になり、しかもバグなどに悩まされることも少なくなります。
さらに、今回のフォームデータの処理の関数も、引数でフィールドオブジェクトを渡していますから、フィールドオブジェクト内の関数validate
を使ってフォームデータの事前検証も行うことができるようにするなど、機能をさらに拡張する方法も考えられます。
PHPの関数などと組み合わせることにより、面倒なコーディングを減らしていけば、旧来のFileMakerカスタムWebのCDML時代と同じぐらい簡単な記述で、しかも比較にならないぐらい豊かな表現力を、現在のカスタムWebは持っていることを実感できると思います。