API for PHPの中枢、FileMakerクラスでできること

基礎編ではおもに、FileMakerファイルに格納されているレコード操作に関するクラスを中心に紹介してきた。これまで何気なくnew FileMaker()と使ってきたFileMakerクラスだが、もちろん同クラスにも便利な機能が用意されている。何回かにわけて、FileMaker API for PHPの中枢となっているFileMakerクラスの使い方について紹介しよう。

FileMakerクラスで用意されている機能は、大別するとおもに次の4種に分類できる。

  • 各種コマンドクエリ発行: newAddCommand(), newEditCommand(), newCompoundFindCommand()など (FileMaker_Command_*クラスで使用)
  • FileMakerサーバ・ファイルの各種情報取得: listDatabases(), listLayouts(), listScripts()
  • FileMaker API for PHPバージョン情報: getAPIVersion(), getMinServerVersion()
  • その他、共通利用など: isError(), isError(), getContainerData(), setLogger()など

基礎編ではおもに各種コマンドクエリ発行のためのメソッドと関連するクラス、およびisError()といった一部を紹介してきた。FileMakerクラスにはそのほかにも、FileMaker API for PHPのバージョン確認手段や共通で利用するためのメソッド、FileMakerサーバ・ファイルの情報を取得する重要な機能が用意されている。本稿ではおもに「FileMakerファイルの各種情報を取得」する3つのメソッドのうちのひとつ、「listDatabases()」の使い方について紹介しよう。

FileMakerサーバで公開されているファイルリストを取得
- listDatabases()

listDatabases()ではコンストラクタやsetPropaty('hostspec', ...)で指定されたFileMakerサーバ上に公開されているFileMakerファイル一覧を配列で取得する。

listDatabasesメソッド (FileMaker.php 366-373行目)

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

このメソッドに引数は存在しない。また実際のロジックが記載されている難読化されたImplementation/FileMakerImpl.phpを追うと、「-dbnames」クエリが使用されていることがわかる。このほかPHPソース中のコメントに次の一文がある。

   with the current server settings and the current username and password credentials.

「指定したユーザ名とパスワードで認証できるファイルのみを表示する」とあるが、期待どおりの動作結果を得るにはあらかじめFileMakerサーバ側の「データベースサーバー > セキュリティ」の"ファイル表示フィルタ"で「各ユーザがアクセスを許可されているデータベースのみをリスト表示」にチェックを入れておく必要がある。「すべてのデータベースをリスト表示」になっている場合、PHP側で指定するユーザID・パスワードに関係なく公開されているFileMakerファイルすべてを取得してしまうため、充分に注意されたい。

FileMaker Serverで公開しているFileMakerファイルが表示された

実際に簡単なコードで試してみよう。

fmapi_listdb.php

<?php

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

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

$result = $data->listDatabases();

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

$data->listDatabases()でhttp://localhost:80/fmi/xml/fmresultset.xml?-dbnamesへのアクセス結果を取得し、結果として返る配列を$resultに格納、正常処理ならばvar_dump()で$resultを展開・表示する。Webブラウザで表示してみよう。

FileMaker Serverで公開しているFileMakerファイルが表示された

FileMaker Serverで公開されているファイルが表示された。ここで注意してほしいのは、取得するFileMakerファイルリストは拡張アクセス権に「fmphp」キーワードが指定されているFileMakerファイルのみが対象になるということだ。たとえばFX.phpのみの利用で「fmxml」キーワードしか指定していないファイルはlistDatabasesでは取得できないので留意されたい。

FileMakerでWebアプリをやるならお馴染み「アカウントとアクセス権の管理>拡張アクセス権」ダイアログ。listDatabasesで取得できる前提となるのは、キーワード「fmphp」が指定されたファイルのみ

FileMaker Server Admin Consoleのデータベース管理画面。PHPにチェックが入っているファイルのみ取得可能

実際に「PHP」以外のキーワードを使用したファイルをいくつか用意してみた。

いままでテストに使用してきていた「fmapi_test.f7」ファイル以外に、それぞれのキーワードを設定したファイルを用意して公開した。「PHP」にチェックがついているのはこのうち3ファイル

この状態でさきほど作成したfmapi_listdb.phpにアクセスしてみよう。

さきほどのFileMaker Server Admin Console上で「PHP」にチェックがついていた3ファイルのみが表示された

拡張アクセス権で「fmphp」キーワードを設定したFileMakerファイルのみがlistDatabases()の結果として取得できることが確認できた。取得できるFileMakerファイルが限定されてしまっているものの、listDatabases()はファイルメンテナンス用のPHPスクリプトや独自のFileMaker管理画面などを実装する際に活用できる機能だ。ぜひ覚えておこう。