前回よりFileMakerフィールド情報の取得に特化したクラス「FileMaker_Field」について紹介している。FileMaker_Field紹介編の最後は、validate()とgetValueList()について紹介しよう。

入力値の事前検証をおこなう - validate()

フォームから送信された値や、テスト用に事前に用意した値がFileMakerフィールドに保存できるかどうかを事前に検証したい場合、validateメソッドをもちいる。

validateメソッド (FileMaker/Field.php 99-116行目より)

/**
 * Returns TRUE if $value is valid for this field, or a
 * FileMaker_Error_Validation object describing how validation
 * failed.
 *
 * @param mixed $value Value to validate.
 * @param FileMaker_Error_Validation $error If validation is being done on more than
 * one field, you may pass an existing error object to validate() to be added to.
 * $error is not passed by reference, though, so you must catch the return value
 * of validate() and use it as the new $error object. An existing $error object will
 * never be overwritten with boolean true.
 *
 * @return boolean|FileMaker_Error_Validation Result of field validation on $value.
 */
function validate($value, $error = null)
{
    return $this->_impl->validate($value, $error);
}
  • mixed $value: バリデートチェックしたい値を指定
  • object FileMaker_Error_Validation $error: FileMaker_Error_Validationオブジェクトを指定。デフォルト値はnull

FileMakerフィールドにたいして$valueをバリデートチェックする。いままでのvalidate()同様、すべての「入力値の制限」をカバーしているわけではないので注意しよう。

API for PHPを使うなら覚えておきたいvalidateの使い方」で紹介したFileMaker_Commandクラスのvalidate()はsetField()でフィールド名と入力値を指定したあとにvalidate()を実行する手順だが、今回のFileMaker_Fieldクラスのvalidate()は、FileMaker_Fieldオブジェクトにたいして直接バリデートをおこないたい値を指定する。どちらかと言えば、テスト用途に向いているだろう。

次のようなテスト用のコードを書いておけば、どのフィールドにどのようなデータが登録できるかを簡単に把握できるようになる。サンプル用に用意したフィールド・入力値の制限情報とPHPコードは次のとおり。

さまざまな入力値の制限を設定したフィールド群。それぞれ左にオプション、右にコメントを表示している

フィールド名 タイプ 入力値の制限
serial 数字 空欄不可, 数字
text_1 テキスト なし
text_1 テキスト 数字
text_1 テキスト 西暦4桁の日付
text_1 テキスト 時刻
number_1 数字 なし
number_2 数字 数字
maxchar 数字 最大値(3)
date_1 日付 なし
date_2 日付 西暦4桁の日付
time_1 時刻 なし
time_2 時刻 西暦4桁の日付
multi_1 テキスト 空欄不可, 数字, 最大値(3)
multi_2 数字 空欄不可, 西暦4桁の日付

fmapi_field_validate.php

<?php

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

// バリデーションルールを配列で定義 / 入力値の制限に抵触した場合に表示
$FileMaker_ValidationRule = array
(
    '',
    'NOTEMPTY',
    'NUMERICONLY',
    'MAXCHARACTERS',
    'FOURDIGITYEAR',
    'TIMEOFDAY',
    'TIMESTAMP_FIELD',
    'DATE_FIELD'
);

// バリデートに使用する入力値
$inputValue = array
(
    '',
    'test',
    1,
    '2010/1/20',
    '1/20/2010',
    '12:00:00',
    '1/20/2010 12:00:00'
);
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout('validate_test');
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th rowspan="2">getName</th>
            <th colspan="<?php echo count($inputValue); ?>">$value</th>
        </tr>
        <tr>
            <?php
            foreach ($inputValue as $th )
            {
                echo '<th>' . $th . '</th>';
            }
            unset($th);
            ?>
        </tr>
        <?php
        foreach ( $layoutObj->getFields() as $fieldObj )
        {
            ?>
            <tr>
                <td valign="top"><?php echo ($fieldObj->getName()); ?></td>
                <?php
                foreach ($inputValue as $value )
                {
                    echo '<td valign="top"><pre>';
                    $error = array();
                    if ( true !== ($fieldObj->validate($value)))
                    {
                        $FileMakerErrorValidationObj = $fieldObj->validate($value);
                        $error = $FileMakerErrorValidationObj->getErrors();
                        echo $FileMaker_ValidationRule[$error[0][1]];
                    }
                    echo '</pre></td>';
                }
                unset($value);
                ?>
            </tr>
            <?php
        }
        ?>
    </table>
    <?php
}
?>

fmapi_field_validate.phpでは先頭でバリデートチェックしたい値を配列として定義しておき、指定したレイアウトに配置されている全フィールドにたいしてvalidate()を実施、結果を表で表示する。

Webブラウザでfmapi_field_validate.phpにアクセス。列にファイル先頭で定義したバリデートチェックしたい値が、行にレイアウトに配置されている全フィールドが展開される。空欄になっている箇所はエラーなし、そのほかはバリデートエラーが起こっていることを示す

複雑な入力値の制限を設定したフィールドばかりのテーブルでも、Web側でテスト用のPHPファイルを用意しておくことで、一部ながらではあるが作業を自動化できる。前回前々回で紹介してきた機能を組み合わせ、処理ごとにFileMakerのレイアウトを分けておけば、PHP側でレイアウト名を変更するだけで仕様書などに転用できるI/Fテーブルのできあがりだ。

値一覧情報を取得 - getValuteList()

フィールドに設定されている値一覧を取得するには、getValueListメソッドをもちいる。

getValueListメソッド (FileMaker/Field.php 231-243行目より)

/**
 * Loads FMPXMLLAYOUT data. If this field is associated with a
 * value list, return the list of choices in that value
 * list. Otherwise returns NULL.
 *
 * @param string  $recid Record from which the value list should be displayed.
 * 
 * @return array The value list array.
 */
function getValueList($recid = null)
{
    return $this->_impl->getValueList($recid);
}
  • string $recid: レコードIDを指定。デフォルト値はnull

そのフィールドに設定されている値一覧を配列で取得する。使い方はFileMaker_LayoutクラスのgetValueListsメソッドとほぼ一緒だ。

それでは実際にこのgetValueList()と、いままで紹介してきたFileMaker_Fieldのいくつかのメソッドを使って、自動的にフォームを作るPHPを作成してみよう。レイアウトはFileMaker_LayoutクラスのgetValueListメソッド紹介時に使用した「valueLists_test」をもちいる。vlt_code_1の表示形式を"ドロップダウンリスト"から"チェックボックスセット"に。vlt_code_3の表示形式を"ドロップダウンリスト"から"ラジオボタンセット"に変更した。

変更後のFileMakerレイアウト「valueLists_test」

getValueList(), getName(), getStyleType()を使って、編集用のフォームを作成する。

fmapi_field_valuelist.php

<?php

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

// アクセスしたいFileMakerレイアウトを指定
$layoutName = 'valueLists_test';

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout($layoutName);
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>getName</th>
            <th>form</th>
        </tr>
        <?php
        foreach ( $layoutObj->getFields() as $fieldObj )
        {
            $increment = 1;
            ?>
            <tr>
                <td valign="top"><?php echo ($fieldObj->getName()); ?></td>
                <td valign="top">
                <?php
                switch($fieldObj->getStyleType())
                {
                    case 'EDITTEXT':
                       echo '<input type="textbox" name="' . $fieldObj->getName() . '" id="' . $fieldObj->getName() . '">';
                       break;
                    case 'POPUPLIST':
                    case 'POPUPMENU':
                        echo '<select name="' . $fieldObj->getName() . '">';
                        foreach($fieldObj->getValueList() as $value )
                        {
                            echo '<option value="' . $value . '">' . $value . '</option>';
                        }
                        unset($value);
                        echo '</select>';
                        break;
                    case 'CHECKBOX':
                        foreach($fieldObj->getValueList() as $value )
                        {
                            echo '<input type="checkbox" name="' . $fieldObj->getName() . '" id="' . $fieldObj->getName() . '_' . $increment . '" value="' . $value . '">';
                            echo '<label for="' . $fieldObj->getName() . '_' . $increment . '">' . $value . '</label>';
                            $increment++;
                        }
                        unset($value);
                        break;
                    case 'RADIOBUTTONS':
                        foreach($fieldObj->getValueList() as $value )
                        {
                            echo '<input type="radio" name="' . $fieldObj->getName() . '" id="' . $fieldObj->getName() . '_' . $increment . '" value="' . $value . '">';
                            echo '<label for="' . $fieldObj->getName() . '_' . $increment . '">' . $value . '</label>';
                            $increment++;
                        }
                        unset($value);
                        break;
                    default :
                        break;
                }
                ?>
                </td>
            </tr>
            <?php
        }
        ?>
    </table>
    <?php
}
?>

ファイル先頭部分で定義したレイアウトにアクセス。配置されているフィールドすべてを、<input>や<select>に展開する。

getStyleTypeの返り値 出力するタグ
EDITTEXT <input type="text">
POPUPLIST <select><option>
POPUPMENU <select><option>
CHECKBOX <input type="checkbox">
RADIOBUTTONS <input type="radio">

実際にWebブラウザでfmapi_field_valuelist.phpにアクセスしてみよう。

FileMakerレイアウト「valueLists_test」に配置されているフィールドをすべてフォームとして出力する

FileMaker_LayoutクラスとFileMaker_FieldクラスはFileMaker_Commandに関連するクラスと比較した場合、意識しないとあまり使わないクラスだ。しかし用意されている機能はどれも有用なものばかり。まだ使ったことのない方は、これを機会にぜひ触れてみていただきたい。