今回はFileMakerレイアウト情報の取得に特化したクラス「FileMaker_Layout」について取りあげよう。ひとつのレイアウトに複数のポータルや値一覧を設定し、それをWebアプリ化したいとなった場合はFileMaker_Layoutクラスの出番だ。

FileMaker_Layoutで取得できる情報

FileMaker_Layoutクラスに用意されているメソッドで取得できる情報は、おもに次のとおり。

  • そのレイアウトがあるデータベースファイル名: getDatabase()
  • レイアウト名: getName()
  • レイアウトに配置されているフィールド情報: getField(), getFields(), listFields()
  • ポータル内の関連レコード情報: getRelatedSet(), getRelatedsSets(), listRelatedSets()
  • レイアウト内で使用されている値一覧情報: getValueLists(), getValueLists(), getValueListsTwoFields(), getValueListTwoFields(), listValueLists()

これらの情報は、基本的に前回の最後に紹介したFileMakerクラスのgetLayout()などを使用して取得・生成したFileMaker_Layoutオブジェクトから取得する。前回のfmapi_getlayout.phpをベースに、FileMaker_Layoutクラスの機能を順に紹介していこう。1回目はこのうち比較的使い方が簡単な「データベースファイル名を取得」「レイアウト名」「レイアウトに配置されているフィールド情報」の3点をピックアップして紹介する。

データベースファイル名・レイアウト名・フィールド情報の取得

まずはデータベースファイル名とレイアウト名取得方法からだ。これらを取得するにはそれぞれgetDatabase(), getName()をもちいる。

getDatabaseメソッド (FileMaker/Layout.php 62-67行目より)

    /**
     * Returns the name of the database that this layout is in.
     *
     * @return string Database name.
     */
    function getDatabase()

getNameメソッド (FileMaker/Layout.php 52-57行目より)

    /**
     * Returns the name of this layout.
     *
     * @return string Layout name.
     */
    function getName()

この2つのメソッドに引数はない。結果は両者とも文字列型で返る。

レイアウトに配置しているフィールド情報は、getField(), getFields(), listFields()をもちいる。

getFieldメソッド (FileMaker/Layout.php 82-90行目より)

    /**
     * Returns a FileMaker_Field object that describes the specified field.
     *
     * @param string $fieldName Name of field.
     *
     * @return FileMaker_Field|FileMaker_Error Field object, if successful. 
     *         Otherwise, an Error object.
     */
    function &getField($fieldName)
  • string $fieldName: FileMaker_Fieldオブジェクトとして取得したいフィールド名を指定

getFieldsメソッド (FileMaker/Layout.php 95-101行目より)

    /**
     * Returns an associative array with the names of all fields as
     * keys and FileMaker_Field objects as the array values.
     *
     * @return array Array of {@link FileMaker_Field} objects.
     */
    function &getFields()

listFieldsメソッド (FileMaker/Layout.php 72-77行目より)

    /**
     * Returns an array with the names of all fields in this layout.
     *
     * @return array List of field names as strings.
     */
    function listFields()

getFields(), listFields()に引数はない。

似たような名前のメソッドだがそれぞれ用途が異なるので注意されたい。これらの用途をまとめると次のようになる。

  • getField(): 返り値はFileMaker_Fieldオブジェクト。特定のフィールドだけ、FileMaker_Fieldオブジェクトとして取得したい場合に
  • getFields(): 返り値はFileMaker_Fieldオブジェクトの配列。レイアウトに配置されたフィールドすべてのFileMaker_Fieldオブジェクトを取得したい場合に
  • listFields(): 返り値はフィールド名の配列。レイアウトに配置されたフィールド名だけを一括で取得したい場合に

フィールドのタイプや入力値の制限といったフィールド情報の詳細を追いかけたい場合はこのFileMaker_Layoutクラス同様、getField()やgetFields()を用いてFileMaker_Fieldオブジェクトを生成し、FileMaker_Fieldクラスを使用するのが便利だ。単純にフィールド名だけを取得したい場合はlistFields()を使おう。

FileMaker_Fieldオブジェクトを返す2オブジェクトを除き、getDatabase(), getName(), listFields()がどのような値を返すのか実際に確認する。

fmapi_layout.php

<?php

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

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

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

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

?>

このスクリプトでは今回紹介したメソッドのうち3つの取得結果をテーブルで表示する。実際にWebブラウザで確認してみよう。

getDatabase(), getName(), listFields()の取得結果。listFields()はそのシンプルさから様々な場所で応用が効くのでぜひ覚えておこう

それぞれのオブジェクトがどのような役割を持っていて、どのような情報が格納されているかをあらかじめ把握しておけば、対応するクラスに用意されている機能を使って欲しい情報をどんどん取り出せる。FileMaker API for PHPで使用するfmresultsetは一度に取得する情報量がおおい分、FX.phpで使用するFMPXMLRESULTと比較するとパフォーマンスが落ちやすい。しかしすくないリクエスト数でさまざまな情報を取得・ループで自在に加工できるのは有利な点だ。これらをうまく活用し、自動化できるところは積極的に自動化していこう。