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スクリプトを実行するまでの手順

  1. new FXでインスタンスを作成、接続先を指定
  2. 必要に応じて、FileMakerスクリプトを実行したいレコードを指定
  3. PerformFMScript/PerformFMScriptPrefind/PerformFMScriptPresortで実行したいFileMakerスクリプト名を指定
  4. AddDBParamでFileMakerスクリプト引数を指定
  5. FMNew/FMEdit/FMFind/FMDeleteなどでリクエスト発行

APIでFileMakerスクリプトを実行するまでの手順

  1. new FileMakerでFileMakerのインスタンスを作成、接続先を指定
  2. 実行したいコマンドに対応するオブジェクトを作成。この際にFileMakerスクリプトを実行したいレイアウトとレコードを指定
  3. setScript/setPreCommandScript/setPreSortScriptで実行したいFilemakerスクリプト名と引数を指定
  4. executeでリクエスト発行

今回もシンプルな構文で実装することが可能。サンプルで使用するDB情報は次のとおり。

ファイル・テーブル情報

FileMaker DB情報 名前
ファイル名 fmapi_test.fp7
テーブル名 script_test
レイアウト名 script_test

フィールド情報

フィールド名 タイプ 備考
layoutName 計算 Get ( レイアウト名 )
scriptName テキスト FileMakerスクリプト中でフィールド設定を使用して代入
scriptParam テキスト FileMakerスクリプト中でフィールド設定を使用して代入

テーブル「script_test」のフィールド定義

使用するレイアウト「script_test」

使用するFileMakerスクリプト

  • FileMakerスクリプト名: saveScriptInfo
  • 処理内容: scriptNameに「Get ( スクリプト名 )」の結果を、scriptParamに「Get ( スクリプト引数 )」の結果を代入する

PHP側から渡される引数は、Get ( スクリプト引数 )を使用して取得する。

作成したFileMakerスクリプト。「互換性を表示」機能を使って、Web公開に対応しているスクリプトステップのみで構成すること

対応していないスクリプトステップがスクリプト中にある場合、途中で処理が止まるなど、おかしな動作を引きおこす。また一見ただしく動作しているように見えても、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スクリプトが起動し、フィールド設定が機能していることがわかる

FileMakerスクリプトを使うときは「レイアウト」「レコード取得数」の2点に注意しておくこと。PHP側で指定するレイアウトとFileMakerスクリプトを実行後のレイアウトが異なる場合、PHP側に返るレコードデータは「FileMakerスクリプトを実行した後、最後に表示されているレイアウト」となる。たとえば「関連レコードへ移動」スクリプトステップを使用してスクリプト終了までにレイアウトを戻さなかった場合、別テーブルのレコードが返り、意図しない動作を招くことがある。

FileMakerスクリプトを実行するタイミングは全部で3パターン。実行した際、いずれも「FileMakerスクリプトを実行後、最後に表示されているレイアウトの対象レコード中、-skip/-max指定範囲内のレコード」を取得する。この動作はFX.php/APIとも共通。FileMakerスクリプトを使用してなにか変な動きをすると感じたら、まずはこの2点をチェックされたい。