前回よりFileMakerレイアウト情報の取得に特化したクラス「FileMaker_Layout」について紹介している。今回はおもにポータルに関するレイアウト情報を取得するときに便利な機能を紹介していこう。

ポータルに関するレイアウト情報を取得

レイアウトに配置されているポータル情報を取得するには、それぞれgetRelatedSet(), getRelatedSets(), listRelatedSets()をもちいる。

getRelatedSetメソッド (FileMaker/Layout.php 117-126行目より)

/**
 * Returns a FileMaker_RelatedSet object that describes the specified 
 * portal.
 *
 * @param string $relatedSet Name of the related table for a portal.
 *
 * @return FileMaker_RelatedSet|FileMaker_Error RelatedSet object, if 
 *         successful. Otherwise, an Error object.
 */
function &getRelatedSet($relatedSet)
  • string $relatedSet: FileMaker_RelatedSetオブジェクトとして取得したいポータルのテーブルオカレンス名を指定

ポータル設定の「関連レコードを表示」で$relatedSetが指定されているポータル情報を取得し、FileMaker_RelatedSetオブジェクトとして返す。失敗した場合はFileMaker_Errorオブジェクトが返る。

$relatedSetで指定するのは、ポータル設定の「関連レコードを表示:」で選択したテーブルオカレンス名。「テーブル名」とは違うので注意しよう。

getRelatedSetsメソッド (FileMaker/Layout.php 131-137行目より)

/**
 * Returns an associative array with the related table names of all 
 * portals as keys and FileMaker_RelatedSet objects as the array values.
 *
 * @return array Array of {@link FileMaker_RelatedSet} objects.
 */
function &getRelatedSets()

getRelatedSets()に引数はない。getRelatedSetsと似ているが、こちらは1ポータルだけでなくFileMaker_Layoutオブジェクトに格納されているすべてのポータル情報をFileMaker_RelatedSetオブジェクトの配列として返す。

listRelatedSetsメソッド (FileMaker/Layout.php 106-112行目より)

/**
 * Returns an array of related table names for all portals on
 * this layout.
 *
 * @return array List of related table names as strings.
 */
function listRelatedSets()

listRelatedSets()に引数はない。FileMaker_Layoutオブジェクトに格納されている全ポータルのテーブルオカレンス名を配列で取得する。前回紹介したlistRelatedSets()と似たような動作となっている。

前回後半で紹介したgetField(), getFields(), listFields()同様、どれも似たような名前のメソッドとなっている。実際に使うときはスペルミスに注意されたいところだ。これらの用途をまとめると次のようになる。

  • getRelatedSet(): 返り値はFileMaker_RelatedSetオブジェクト。あらかじめ使用したいポータルが定まっており、特定のポータルだけFileMaker_RelatedSetオブジェクトとして取得したい場合に
  • getRelatedSets(): 返り値はFileMaker_RelatedSetオブジェクトの配列。レイアウトに配置されたポータルすべてのFileMaker_RelatedSetオブジェクトを取得したい場合に
  • listRelatedSets(): 返り値はテーブルオカレンス名の配列。レイアウトに配置されたポータルのテーブルオカレンス名だけを一括で取得したい場合に

単純に関連するテーブルオカレンスの名前だけを取得したい場合はlistRelatedSets()だが、関連先テーブルのフィールド一覧やフィールド情報の詳細を取得したい場合はFileMaker_RelatedSetオブジェクトのほうが都合がいいのでgetRelatedSet()/getRelatedSets()を使おう。

それではこれら3つの機能の動作を確認してみよう。確認用にFileMakerファイルで親-子-孫関係となるテーブルを用意し、リレーションを組んでおく。レイアウトにポータルを配置して準備完了だ。

作成したテーブルは「table_a」「table_b」「table_c」の3つ

親から子、孫につながるようにリレーションを設定。親から直接孫テーブルへのリレーションも設定している

動作確認用のレイアウト「getRelatedSet」を作成し、ポータルを3つ配置した。リレーションで使用しているシリアル番号が格納されたフィールドを色分けしている

このレイアウトを使って、3つのメソッドがどのような動作をするかを確認してみよう。

fmapi_layout_2.php

<?php

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

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

// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout('getRelatedSet');

// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>getRelatedSet()</th>
            <th>getRelatedSets()</th>
            <th>listRelatedSets()</th>
        </tr>
        <tr>
            <td valign="top"><pre><?php
                var_dump($layoutObj->getRelatedSet('table_a_x_table_b')->getName());
                var_dump($layoutObj->getRelatedSet('table_a_x_table_b')->listFields());
                ?></pre></td>
            <td valign="top"><pre><?php
                foreach ($layoutObj->getRelatedSets() as $key => $value)
                {
                    var_dump($value->getName());
                    var_dump($value->listFields());
                    echo '<hr>';
                }
                ?></pre></td>
            <td valign="top"><pre><?php var_dump($layoutObj->listRelatedSets()); ?> </pre></td>
        </tr>
    </table>
    <?php
}

?>

FileMaker_RelatedSetオブジェクトを返すメソッドが2つあるが、このまま表示すると情報量が多く見にくいので、まだ紹介できていないがFileMaker_RelatedSetクラスのgetName(), listFields()を使用している。実際にこれをWebブラウザで表示してみよう。

fmapi_layout_2.php - 3つのメソッドの動作結果

getRelatedSet()では「table_a_x_table_b」テーブルを設定したポータルの名称とフィールド一覧を。getRelatedSets()では配列を展開し、それぞれのテーブルオカレンス名とフィールド一覧を。listRelatedSets()ではレイアウトに配置されているポータルの関連先テーブルオカレンス名を展開している。

単体では使い方がパッと思い浮かびにくいこれらの機能だが、ユニットテストでは大活躍する。PHPから参照するFileMakerレイアウトに対してのフィールド追加・削除やポータル関連の修正は、思わぬトラブルを引き起こしがちだ。これらの機能を組み合わせれば、レイアウトに配置されているポータル・フィールドを監視させることで、FileMakerレイアウト修正後のWebアプリケーションのテストをある程度自動化できる。興味がある方はいろいろ試してみよう。