FX.phpとFileMaker API for PHPの機能比較として、登録と検索・編集・削除を紹介してきた。これでデータベースの基本操作であるCRUDの違いについてを取りあげた。最後にFileMaker独自の機能である、スクリプトの実行方法について解説していこう。
FileMakerスクリプトの実行方法 - FX.php / API での違い
FileMakerスクリプトを実行するためのメソッドは次のとおり。
FX.php | API | 備考 | |
---|---|---|---|
スクリプト実行 | PerformFMScript | setScript | |
指定コマンド実行前にスクリプト実行 | PerformFMScriptPrefind | setPreCommandScript | |
ソート実行前にスクリプト実行 | PerformFMScriptPresort | setPreSortScript | |
引数指定 | 専用メソッドなし | setScript, setPreCommandScript, setPreSortScriptの第二引数 | FX.phpではAddDBParam('-script.param', '(スクリプト引数)')で代用する |
FileMakerスクリプトに複数の引数を渡したい場合、特定の区切り文字を決めておき、FileMakerスクリプト側でGet(スクリプト引数)を加工する必要がある。FX.phpではFileMakerスクリプトに引数を渡すためのメソッドがない。自作するか、AddDBParamで代用する。
- AddDBParam('-script.param', '(スクリプト引数)')
- AddDBParam('-script.prefind.param', '(スクリプト引数)')
- AddDBParam('-script.presort.param', '(スクリプト引数)')
なお、FX.phpでFileMaker以外のデータベースに接続するときにこれらのメソッドを使用するとエラー(The '-script' parameter is not currently supported for SQL.)となる。
それではFileMakerスクリプトを実行する実装方法に移る。
FX.phpでFileMakerスクリプトを実行するまでの手順
- new FXでインスタンスを作成、接続先を指定
- 必要に応じて、FileMakerスクリプトを実行したいレコードを指定
- PerformFMScript/PerformFMScriptPrefind/PerformFMScriptPresortで実行したいFileMakerスクリプト名を指定
- AddDBParamでFileMakerスクリプト引数を指定
- FMNew/FMEdit/FMFind/FMDeleteなどでリクエスト発行
APIでFileMakerスクリプトを実行するまでの手順
- new FileMakerでFileMakerのインスタンスを作成、接続先を指定
- 実行したいコマンドに対応するオブジェクトを作成。この際にFileMakerスクリプトを実行したいレイアウトとレコードを指定
- setScript/setPreCommandScript/setPreSortScriptで実行したいFilemakerスクリプト名と引数を指定
- executeでリクエスト発行
今回もシンプルな構文で実装することが可能。サンプルで使用するDB情報は次のとおり。
ファイル・テーブル情報
FileMaker DB情報 | 名前 |
---|---|
ファイル名 | fmapi_test.fp7 |
テーブル名 | script_test |
レイアウト名 | script_test |
フィールド情報
フィールド名 | タイプ | 備考 |
---|---|---|
layoutName | 計算 | Get ( レイアウト名 ) |
scriptName | テキスト | FileMakerスクリプト中でフィールド設定を使用して代入 |
scriptParam | テキスト | FileMakerスクリプト中でフィールド設定を使用して代入 |
使用するFileMakerスクリプト
- FileMakerスクリプト名: saveScriptInfo
- 処理内容: scriptNameに「Get ( スクリプト名 )」の結果を、scriptParamに「Get ( スクリプト引数 )」の結果を代入する
PHP側から渡される引数は、Get ( スクリプト引数 )を使用して取得する。
対応していないスクリプトステップがスクリプト中にある場合、途中で処理が止まるなど、おかしな動作を引きおこす。また一見ただしく動作しているように見えても、FileMaker Serverに重要なエラーログが記録されていることもある。WebからFileMakerスクリプトを実行する場合は、スクリプトデバッガ/データビューアの使い方とエラーログの見方に慣れておいたほうがいい。
次のサンプルではそれぞれFMFind/newFindCommandを使用してFileMakerスクリプトを実行している。
FX.phpの場合 - fx_script.php
<?php
include_once('../fx/FX.php');
include_once('../fx/FX_Fuzzy_Debugger.php');
// 1. new FXでインスタンスを作成、接続先を指定
$data = new FX('localhost', 80, 'FMPro9', 'http');
// 2. 必要に応じて、FileMakerスクリプトを実行したいレコードを指定
$data->SetDBData('fmapi_test','script_test', 1);
$data->SetDBUserPass('admin','admin');
$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');
// 3. PerformFMScript/PerformFMScriptPrefind/PerformFMScriptPresortで実行したいFileMakerスクリプト名を指定
$data->PerformFMScript('saveScriptInfo');
//$data->PerformFMScriptPrefind('saveScriptInfo');
//$data->PerformFMScriptPresort('saveScriptInfo');
// 4 AddDBParamでFileMakerスクリプト引数を指定
$data->AddDBParam('-script.param', 'FX.phpよりスクリプト実行');
//$data->AddDBParam('-script.prefind.param', 'FX.phpよりスクリプト実行');
//$data->AddDBParam('-script.prefsort.param', 'FX.phpよりスクリプト実行');
// 5. FMNew/FMEdit/FMFind/FMDeleteなどでリクエスト発行
$data->FMFind();
?>
APIの場合 - api_script.php
<?php
include_once('../FileMaker.php');
// 1. new FileMakerでFileMakerのインスタンスを作成、接続先を指定
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// 2. 実行したいコマンドに対応するオブジェクトを作成。この際にFileMakerスクリプトを実行したいレイアウトとレコードを指定
$findCommand = $data->newFindCommand('script_test');
$findCommand->setRange(0, 1);
// 3. setScript/setPreCommandScript/setPreSortScriptで実行したいFilemakerスクリプト名と引数を指定
$findCommand->setScript('saveScriptInfo', 'APIよりスクリプト実行');
//$findCommand->setPreCommandScript('saveScriptInfo', 'APIからスクリプト実行';
//$findCommand->setPreSortScript('saveScriptInfo', 'APIからスクリプト実行');
// 4. executeでリクエスト発行
$findCommand->execute();
?>
Webブラウザでこれらのファイルにアクセス。FileMaker Proで実際にスクリプトが動作しているかを確認する。
FileMakerスクリプトを使うときは「レイアウト」「レコード取得数」の2点に注意しておくこと。PHP側で指定するレイアウトとFileMakerスクリプトを実行後のレイアウトが異なる場合、PHP側に返るレコードデータは「FileMakerスクリプトを実行した後、最後に表示されているレイアウト」となる。たとえば「関連レコードへ移動」スクリプトステップを使用してスクリプト終了までにレイアウトを戻さなかった場合、別テーブルのレコードが返り、意図しない動作を招くことがある。
FileMakerスクリプトを実行するタイミングは全部で3パターン。実行した際、いずれも「FileMakerスクリプトを実行後、最後に表示されているレイアウトの対象レコード中、-skip/-max指定範囲内のレコード」を取得する。この動作はFX.php/APIとも共通。FileMakerスクリプトを使用してなにか変な動きをすると感じたら、まずはこの2点をチェックされたい。