前回はFileMakerクラスのおおまかな機能と、FileMakerサーバ・ファイルの各種情報を取得するためのメソッドの一つ「listDatabases()」を紹介した。今回は各種情報を取得するためのメソッド残り2つ「listLayouts()」「listScripts()」をあわせて紹介しよう。

ファイルのレイアウト一覧を取得 - listLayouts()

listLayouts()では指定したFileMakerファイルに用意されているレイアウトの一覧を配列で取得する。取得できるレイアウトは、使用するアカウントの権限で「変更可能」「表示のみ」権限が設定されているものに限られる。

listLayoutsメソッド (FileMaker.php 390-397行目より)

    /**
     * Obtain a list of layouts from the current database that are
     * available with the current server settings and the current
     * username and password credentials.
     *
     * @return array|FileMaker_Error Either an array of layout names or an error.
     */
    function listLayouts()

このメソッドに引数は存在しない。また実際のロジックが記載されている難読化されたImplementation/FileMakerImpl.phpを追うと、「-db」クエリと「-layoutnames」クエリが使用されていることがわかる。

前回紹介したlistsDatabases()はFileMakerサーバに公開されているファイル単位だったが、listLayouts()では1FileMakerファイル単位となっている。前回のようにFileMakerファイル名を省略すると「802: Unable to open file」エラーが返るので注意しよう。それでは早速実際にコードを書いてみる。

fmapi_listlay.php

<?php

include_once('../FileMaker.php');

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');

$result = $data->listLayouts();

if (FileMaker::isError($result))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result->getCode();
    echo '<p>'. $result->getMessage() . '</p>';
}
else
{
    // 正常処理..
    echo '<pre>';
    var_dump($result);
    echo '<pre>';
}
?>

前回紹介したlistDatabases()のサンプルと違う箇所は、おもに次の2点。

  • 5行目のnew FileMakerの第一引数に「レイアウト一覧を取得したいFileMakerファイル名」を指定
  • 7行目で使用するメソッドをlistLayouts()に変更

7行目の$result = $data->listLayouts();でhttp://localhost:80/fmi/xml/fmresultset.xml?-db=fmapi_test&-layoutnamesへのアクセス結果を取得し、結果として返る配列を$resultに格納、正常処理ならばvar_dump()で$resultを展開・表示する。このほか、var_dumpで出力する結果を<pre>でかこみ見やすくしている。Webブラウザで表示してみよう。

アカウント名「admin」でアクセス可能なFileMakerレイアウトの一覧が表示された

上記のコードで使用したアカウントは「admin」。このアカウントはアクセス権セットが「完全アクセス」となっているため、すべてのレイアウト名を取得することが可能だ。独自のアクセス権セットを作成し「データアクセスとデザイン > レイアウト」で"カスタムアクセス権"を指定したアカウントを使用する場合は、アクセス権のあるレイアウトのみが取得される。

特定のレイアウトのみに権限を設定したアクセス権セットを作成し、あたらしく作成したアカウント「user」に割りあてた

特定のレイアウトのみに権限を設定したアクセス権セット「test_listsLayout」を作成。拡張アクセス権「fmphp」にチェックを入れ、あたらしく作成したアカウント「user」に割りあてた。fmapi_listlay.php上で記述しているアカウント「admin」を「user」に置きかえて再度Webブラウザで開いてみよう。

アカウント「user」でアクセス可能なレイアウトのみがリスト表示された

アカウントとアクセス権セットが複数ある複雑な権限構成のファイルの場合、このlistLayouts()を活用すればレイアウト遷移用のUIやメンテナンス用の機能を楽に実装することが可能となる。

ファイルのFileMakerスクリプト一覧を取得 - listScripts()

listScripts()では指定したFileMakerファイルに実装されたFileMakerスクリプトの一覧を配列で取得する。取得できるスクリプトはlistLayoutsと同様、使用するアカウントの権限で「変更可能」「実行のみ」権限が設定されているものに限られる。

listScriptsメソッド (FileMaker.php 378-385行目より)

    /**
     * Obtain a list of scripts from the current database that are
     * available with the current server settings and the current
     * username and password credentials.
     *
     * @return array|FileMaker_Error Either an array of script names or an error.
     */
    function listScripts()

このメソッドに引数は存在しない。内部の実装では「-db」クエリと「-scriptnames」クエリが使用されている。

FileMakerスクリプトを取得する単位や使い方は、listLayouts()とほぼ同じだ。実際にコードを書いてみよう。

fmapi_listscripts.php

<?php

include_once('../FileMaker.php');

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');

$result = $data->listScripts();

if (FileMaker::isError($result))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result->getCode();
    echo '<p>'. $result->getMessage() . '</p>';
}
else
{
    // 正常処理..
    echo '<pre>';
    var_dump($result);
    echo '<pre>';
}
?>

listLayouts()のサンプルの7行目で使用するメソッドをlistLayouts()からlistScripts()に変更しているだけだ。$result = $data->listScripts();でhttp://localhost:80/fmi/xml/fmresultset.xml?-db=fmapi_test&-scriptnamesへのアクセス結果を取得し、結果を展開・表示する。Webブラウザで表示してみよう。

アカウント名「admin」で利用可能なFileMakerスクリプトの一覧が表示された

アカウント名「admin」で利用可能なFileMakerスクリプトの一覧が表示された。listScripts()もlistLayouts()同様、使用するアカウントで利用できるFileMakerスクリプトのみを取得するようになっている。さきほどと同様にテスト用のアクセス権セット・アカウントを用意し、fmapi_listscripts.phpのアカウントを変更してWebブラウザで表示してみよう。

特定のスクリプトのみに変更・実行権限を設定したアクセス権セットを作成し、あたらしく作成したアカウント「user2」に割りあてた

アカウント「user2」で実行可能なFileMakerスクリプトのみがリスト表示された

今回紹介したlistLayouts()とlistScripts()はインスタントWeb公開のような「FileMakerライクなWebアプリ」をPHPで実装する場合に重宝する。うまく使えば、複数権限での機能制限が正しく動作しているかを自動確認するユニットテストにも組みこめる。シンプルながらじつに活用方法の幅が広い機能だ。