前回よりFileMakerレイアウト情報の取得に特化したクラス「FileMaker_Layout」について紹介している。最後に値一覧に関するレイアウト情報を取得するときに便利な機能を紹介する。

各機能の解説に先立ち、さきにFileMaker側でいくつか取得する元となる値一覧とテーブル、レイアウトを用意しておこう。

今回用意した値一覧は「valueLists_1」「valueLists_2」「valueLists_3」「valueLists_4」の4つ。うち3つが「フィールドの値を使用」、1つは「カスタム値を使用」

「valueLists_1」はvalueLists_1テーブルのvl1_nameを参照する

「valueList_2」はvalueLists_1テーブルのvl1_serialおよびvl1_nameを参照する

「valueLists_3」はカスタム値を使用した値一覧

値一覧「valueLists_1」「valueLists_2」で使用するテーブル「valueListsTable_1」。FileMaker社の製品をサンプルデータとして格納している

「valueLists_4」は"次のテーブルから関連レコードの値のみ含める"機能を使用した値一覧

値一覧「valueLists_4」で使用するテーブル「valueListsTable_2」。「valueListsTable_1」内の製品に対応するバージョンをサンプルデータとして格納している

PHPから参照する「valueLists_test」レイアウト。vlt_code_nにはそれぞれ対応する値一覧をセットしている

値一覧「valueLists_4」で使用するためのリレーション。vlt_code_2に対応する値一覧のみを表示できるようになる

ここまで準備ができたら、これらの値一覧をどのように取得していくのかを確認してみる。

値一覧に関するレイアウト情報を取得

各フィールドに設定された値一覧情報を取得するには、getValueList(), getValueLists(), getValueListsTwoField(), getValueListTwoFields(), listValueLists()をもちいる。

getValueListメソッド (FileMaker/Layout.php 153-164行目より)

/**
 * Returns the list of defined values in the specified value list.
 *
 * @param string $valueList Name of value list.
 * @param string  $recid Record from which the value list should be 
 *        displayed.
 *
 * @return array List of defined values.
 * @deprecated Use getValueListTwoFields instead.
 * @see getValueListTwoFields
 */
function getValueList($valueList, $recid = null)
  • string $valueList: 取得したい値一覧名を指定
  • string $recid: レコードIDを指定。デフォルト値はnull

指定された値一覧を取得する。ここで取得できるのは、最初のフィールド値のみ。

getValueListsメソッド (FileMaker/Layout.php 185-198行目より)

/**
 * Returns a multi-level associative array of value lists. 
 * The top-level array has names of value lists as keys and arrays as 
 * values. The second level arrays are the lists of defined values from 
 * each value list.
 *
 * @param string  $recid Record from which the value list should be 
 *        displayed.
 * 
 * @return array Array of value-list arrays.
 * @deprecated Use getValueListTwoFields instead.
 * @see getValueListsTwoFields
 */
function getValueLists($recid = null)
  • string $recid: レコードIDを指定。デフォルト値はnull

レイアウト内のフィールドに設定された値一覧情報すべてを配列で返す。getValueList同様、ここで取得できるのは、最初のフィールド値のみ。

getValueListsTwoFieldsメソッド (FileMaker/Layout.php 203-214行目より)

/**
 * Returns a multi-level associative array of value lists. 
 * The top-level array has names of value lists as keys and associative arrays as 
 * values. The second level associative arrays are lists of display name and its corresponding 
 * value from the value list.
 *
 * @param string  $recid Record from which the value list should be 
 *        displayed.
 * 
 * @return array Array of value-list associative arrays.
 */
function getValueListsTwoFields($recid = null)
  • string $recid: レコードIDを指定。デフォルト値はnull

レイアウト内のフィールドに設定された値一覧情報すべてを配列で返す。getValueList(), getValueLists()とは異なり、2番目のフィールド値も取得できる(配列のキーの中に格納される)。

getValueListTwoFieldsメソッド (FileMaker/Layout.php 169-180行目より)

/**
 * Returns the list of defined values in the specified value list. 
 * This method supports single, 2nd only, and both fields value lists. 
 *
 * @param string $valueList Name of value list.
 * @param string  $recid Record from which the value list should be 
 *        displayed.
 *
 * @return array of display names and its corresponding 
 * value from the value list.
 */
function getValueListTwoFields($valueList, $recid = null)
  • string $valueList: 取得したい値一覧名を指定
  • string $recid: レコードIDを指定。デフォルト値はnull

指定された値一覧を取得する。getValueListsTwoFields同様、2番目のフィールド値は配列のキーに格納する。

listValueListsメソッド (FileMaker/Layout.php 142-148行目より)

/**
 * Returns the names of any value lists associated with this
 * layout.
 *
 * @return array List of value list names as strings.
 */
function listValueLists()

このメソッドに引数はない。レイアウトに設定されたすべての値一覧名を配列で取得する。

listValueLists()以外のメソッドには引数に「レコードID」が用意されているが、これはFileMakerの値一覧において「次のテーブルから関連レコードの値のみ含める」機能を使用する場合にもちいる。たとえばレコードのフラグ値をベースに使用する値一覧を分けたい場合、引数にレコードIDを指定することで値一覧の中でさらに絞り込みを効かせた結果が返るというわけだ。今回のサンプルの場合、「valueLists_4」値一覧を取得するにはこのレコードIDの指定が必須になる。

紹介した5つのメソッドをそれぞれの用途をまとめると次のようになる。

  • getValueList(): 返り値は値一覧の配列。あらかじめ使用したい値一覧名がわかっている場合に
  • getValueLists(): 返り値は値一覧の配列。レイアウトに設定した値一覧すべてを取得したい場合に
  • getValueListTwoFields(): 返り値は値一覧の配列。キーには「最初の」「2番目の」フィールド情報の2つが格納される。あらかじめ使用したい値一覧名がわかっている場合に
  • getValueListsTwoFields(): 返り値は値一覧の配列。キーには「最初の」「2番目の」フィールド情報の2つが格納される。レイアウトに設定した値一覧すべてを取得したい場合に
  • listRelatedSets(): 返り値は値一覧名の配列。レイアウトに設定した値一覧名だけを一括で取得したい場合に

2番目のフィールドの値を使用したい場合はgetValueListTwoFields(), getValueListsTwoFields()を。値一覧単体をシンプルに使いたい場合はgetValueList(), getValueListTwoFields()で随時取り出して加工するのが便利だろう。実際にいくつか使ってみて、その動作を確認する。

まずはgetValueList()。これをレコードIDの指定なしで使ってみよう。

fmapi_getvaluelist.php

<?php

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

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout('valueLists_test');
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    $getValueList = array();
    $getValueList['valueLists_1'] = $layoutObj->getValueList('valueLists_1');
    $getValueList['valueLists_2'] = $layoutObj->getValueList('valueLists_2');
    $getValueList['valueLists_3'] = $layoutObj->getValueList('valueLists_3');
    $getValueList['valueLists_4'] = $layoutObj->getValueList('valueLists_4');
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>getValueList('valueLists_1')</th>
            <th>getValueList('valueLists_2')</th>
            <th>getValueList('valueLists_3')</th>
            <th>getValueList('valueLists_4')</th>
        </tr>
        <tr>
            <td valign="top"><pre><?php var_dump($getValueList['valueLists_1']); ?></pre></td>
            <td valign="top"><pre><?php var_dump($getValueList['valueLists_2']); ?></pre></td>
            <td valign="top"><pre><?php var_dump($getValueList['valueLists_3']); ?></pre></td>
            <td valign="top"><pre><?php var_dump($getValueList['valueLists_4']); ?></pre></td>
        </tr>
    </table>
    <?php
}

?>

getValueList()でレイアウトに設定されている4つの値一覧すべてを指定し、var_dump()で表示している。これをWebブラウザで表示してみよう。

fmapi_getvaluelist.phpの表示結果。valueLists_1~valueLists_3までは値一覧を取得できているが、valueLists_4はレコードIDを指定していないため取得できていない。またvalueLists_2は最初のフィールドであるvl1_serialのみが返っている

最初のフィールド値のみを表示するvalueLists_1とカスタム値を表示するvalueLists_3はうまく取得できたが、2番目のフィールドの値も表示するように設定したvalueLists_2はvl1_serialフィールド内の数字だけが返る結果となった。またレコードIDを指定しなかったため、関連する値のみを表示するように設定した「valueLists_4」にいたってはなにも返らなかった。

それではvalueLists_4を表示するために18-21行目の「$layoutObj->getValueList(...);」の第二引数にレコードIDを追加し、「valueLists_test」レイアウトのvlt_code_2に"2"をセットした状態でWebブラウザで表示してみよう。

レコードIDを指定したので、vlt_code_2にセットした「2」に関連する「valueLists_4」の値一覧を取得できた

ここで気をつけたいのは、getValueListを最初にコールした際に渡すレコードIDしか正常に動作しないということだ。たとえば今回の場合、valueLists_4の値一覧を取得する21行目だけにレコードIDを指定したくなりがちだが、この場合はすでに18行目のgetValueList()で指定されているNULL = 1番目のレコードから見える値一覧を優先して取得してしまうようだ。実装の際は注意されたい。

それでは続けて2番目のフィールド値も取得できるgetValueListTwoFields()を試してみよう。

fmapi_getvaluelisttwofields.php

<?php

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

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout('valueLists_test');
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    $getValueList = array();
    $getValueListTwoFields['valueLists_1'] = $layoutObj->getValueListTwoFields('valueLists_1');
    $getValueListTwoFields['valueLists_2'] = $layoutObj->getValueListTwoFields('valueLists_2');
    $getValueListTwoFields['valueLists_3'] = $layoutObj->getValueListTwoFields('valueLists_3');
    $getValueListTwoFields['valueLists_4'] = $layoutObj->getValueListTwoFields('valueLists_4');
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>getValueListTwoFields('valueLists_1')</th>
            <th>getValueListTwoFields('valueLists_2')</th>
            <th>getValueListTwoFields('valueLists_3')</th>
            <th>getValueListTwoFields('valueLists_4')</th>
        </tr>
        <tr>
            <td valign="top"><pre><?php var_dump($getValueListTwoFields['valueLists_1']); ?></pre></td>
            <td valign="top"><pre><?php var_dump($getValueListTwoFields['valueLists_2']); ?></pre></td>
            <td valign="top"><pre><?php var_dump($getValueListTwoFields['valueLists_3']); ?></pre></td>
            <td valign="top"><pre><?php var_dump($getValueListTwoFields['valueLists_4']); ?></pre></td>
        </tr>
    </table>
    <?php
}

?>

fmapi_getvaluelist.phpをベースに、値一覧を取得するメソッドをgetValueList()からgetValueListTwoFields()に変更しただけだ。これをWebブラウザで表示する。

getValueListTwoFields()では2番目のフィールド値を取得する。これらは配列の実データにではなく、キーに格納される

getValueListTwoFields('valueLists_2')の部分を見ればわかるとおり、getValueListTwoFields()では最初のフィールド値と2番目のフィールド値を組み合わせた文字列がキーに格納される。

値一覧系の情報を取得するメソッドはどれもシンプルな配列で返るため、そのあとの加工がしやすい。あとはこれらをforeach構文で<input type="checkbox">や<select><option>と組み合わせるだけでUIの完成だ。値一覧のUI実装については、「値一覧でユーザビリティアップ! JavaSciptを活用せよ」も参考にしてほしい。