前回よりFileMakerフィールド情報の取得に特化したクラス「FileMaker_Field」についての紹介している。今回は入力値の制限情報を取得する機能を中心に紹介しよう。

入力値の制限情報に関する設定情報の取得

前回は取りあつかう情報がすくなく、簡単に使えるメソッドから紹介した。今回は1ステップ進み、入力値の制限情報を取得するメソッドを紹介する。「API for PHPを使うなら覚えておきたいvalidateの使い方」で触れた内容がいくつか出てくるので、これを機におさらいしておこう。今回取りあげるメソッドは次のとおり。

  • describeLocalValidationRules()
  • getLocalValidationRules()
  • describeValidationRule()
  • describeValidationRules()
  • getValidationMask()
  • getValidationRules()
  • hasValidationRule()

このうちいくつかは環境によってマニュアル・ソースコメントどおりの型で結果を返さなかったり、入力値の制限設定の内容によっては予期しない値を返すようだ。使用する際は注意されたい。

describeLocalValidationRulesメソッド (FileMaker/Field.php 180-195行目より)

/**
 * Return an array of arrays containing the extra information for
 * all validation rules on this field that can be evaluated by
 * PHP. Rules such as "unique" and "exists" can only be validated
 * on the server and are not included in this list. Indexes of the
 * outer array are validation constants, and values are the same
 * array returned by describeValidationRule().
 *
 * @return array An associative array of all extra validation info,
 *               with rule constants as keys and extra info as the
 *               values.
 */
function describeLocalValidationRules()
{
    return $this->_impl->describeLocalValidationRules();
}

フィールドに設定されている入力値の制限を取得し、結果を配列で返す。配列はあらかじめ対応するキーにbool値で構成される。

キー 定数 内容
1 FILEMAKER_RULE_NOTEMPTY 「空欄不可」にチェック
2 FILEMAKER_RULE_NUMERICONLY タイプが「数字」
3 FILEMAKER_RULE_MAXCHARACTERS 「最大文字数」にチェック
4 FILEMAKER_RULE_FOURDIGITYEAR タイプが「西暦4桁の日付」
5 FILEMAKER_RULE_TIMEOFDAY タイプが「時刻」
6 FILEMAKER_RULE_TIMESTAMP_FIELD フィールドタイプが「タイムスタンプ」
7 FILEMAKER_RULE_DATE_FIELD フィールドタイプが「日付」
8 FILEMAKER_RULE_TIME_FIELD フィールドタイプが「時刻」

該当フィールドの「タイプ」や「入力値の制限」に一致した内容がtrueとなる。設定していない場合は、キーも返らない。

上記のうち一部は重複しないものがある。たとえばフィールドタイプが「時刻」でも、入力値の制限設定でタイプが「時刻」となっていた場合は、5のFILEMAKER_RULE_TIMEOFDAYだけが返り、8のFILEMAKER_RULE_TIME_FIELDは返らない。日付フィールドも同様、入力値の制限設定でタイプが「西暦4桁の日付」となっている場合は4のFILEMAKER_RULE_FOURDIGITYEARが、設定していなければ7のFILEMAKER_RULE_DATE_FIELDが返るようになっている。ちょっとわかりづらい動きをする箇所なので注意しよう。

getLocalValidationRulesメソッド (FileMaker/Field.php 118-129行目より)

/**
 * Returns an array of FILEMAKER_RULE_* constants for each rule
 * set on this field that can be evaluated by PHP. Rules such as
 * "unique" and "exists" can only be validated on the server and
 * are not included in this list.
 *
 * @return array Local rule array.
 */
function getLocalValidationRules()
{
    return $this->_impl->getLocalValidationRules();
}

こちらもフィールドに設定されている入力値の制限を取得し、結果を配列で返す。describeLocalValidationRules()の結果のキーと値が反対になったものが返ると覚えておけばよいだろう。

describeValidationRuleメソッド (FileMaker/Field.php 166-178行目より)

/**
 * Returns any additional information for a given rule. Used for
 * range rules and other rules that have additional validation
 * parameters.
 *
 * @param integer $validationRule The validation rule constant to get info for.
 *
 * @return array Any extra information for $validationRule.
 */
function describeValidationRule($validationRule)
{
    return $this->_impl->describeValidationRule($validationRule);
}
  • integer $validationRule: 対応するバリデーションルールの定数を指定

定数を指定し、バリデーションルールを配列として取得する・・・が、筆者の環境では残念ながらうまく動作させることができなかった(かならずnullが返る)。内部の実装に関係するファイルは次の2つ。

  • FileMaker/Implementation/FieldImpl.php
  • Filemaker/Implementation/Parser/FMResultSet.php

describeValidationRulesメソッド (FileMaker/Field.php 197-207行目より)

/**
 * Returns all additional information for all validation rules.
 *
 * @return array An associative array of all extra validation info,
 *               with rule constants as keys and extra info as the
 *               values.
 */
function describeValidationRules()
{
    return $this->_impl->describeValidationRules();
}

こちらもバリデーションルールを配列として取得する。describeLocalValidationRules()とおなじ動作か?

getValidationMaskメソッド (FileMaker/Field.php 142-151行目より)

/**
 * Returns the full additive bitmask of validation rules for this
 * field.
 *
 * @return integer Rule bitmask.
 */
function getValidationMask()
{
    return $this->_impl->getValidationMask();
}

バリデーションのビットマスクが数値型で返る。こちらも筆者の環境では結果が左右してしまった。

getValidationRulesメソッド (FileMaker/Field.php 131-140行目より)

/**
 * Returns an array of FILEMAKER_RULE_* constants for each rule
 * set on this field.
 *
 * @return array Rule array.
 */
function getValidationRules()
{
    return $this->_impl->getValidationRules();
}

フィールドに設定されている入力値の制限のうち、対応するFILEMAKER_RULE_*が格納された配列が返る。describeLocalValidationRules()とおなじ動作か?

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

/**
 * Returns TRUE if the given FILEMAKER_RULE_* constant matches the
 * field's validation bitmask, FALSE otherwise.
 *
 * @param integer $validationRule The validation rule constant to test presence of.
 *
 * @return boolean
 */
function hasValidationRule($validationRule)
{
    return $this->_impl->hasValidationRule($validationRule);
}
  • integer $validationRule: 対応するバリデーションルールの定数を指定

指定したバリデーションルールが、該当フィールドのビットマスクも含まれている場合はtrueを。そうでない場合はfalseのbool型を返す・・・とのことだが、実際には数値型の結果が返るようだ。

前回使用したFileMakerレイアウト「fmapi_field_test」に"ft_serial", "ft_registTimeStamp", "ft_updateTimeStamp" の3フィールドだけを残し、これらを使用したコードを書いてみる。

fmapi\_field\_validate.php

<?php

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

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout('fmapi_field_test');
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    // 正常処理
    ?>
    <table border="1">
        <?php
        foreach ( $layoutObj->getFields() as $fieldObj )
        {
            ?>
            <tr>
                <th>getName</th>
                <th>describeLocalValidationRules</th>
                <th>describeValidationRule</th>
                <th>getValidationMask</th>
                <th>hasValidationRule</th>
            </tr>
            <tr>
                <td valign="top" rowspan="3"><pre><?php var_dump($fieldObj->getName()); ?></pre></td>
                <td valign="top"><pre><?php var_dump($fieldObj->describeLocalValidationRules()); ?></pre></td>
                <td valign="top"><pre><?php var_dump($fieldObj->describeValidationRule(FILEMAKER_RULE_MAXCHARACTERS)); ?></pre></td>
                <td valign="top"><pre><?php var_dump($fieldObj->getValidationMask()); ?></pre></td>
                <td valign="top" rowspan="3">
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_NOTEMPTY)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_NUMERICONLY)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_MAXCHARACTERS)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_FOURDIGITYEAR)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_TIMEOFDAY)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_TIMESTAMP_FIELD)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_DATE_FIELD)); ?>
                    <?php var_dump($fieldObj->hasValidationRule(FILEMAKER_RULE_TIME_FIELD)); ?>
                </td>
            </tr>
            <tr>
                <th>getLocalValidationRules</th>
                <th>describeValidationRules</th>
                <th>getValidationRules</th>
            </tr>
            <tr>
                <td valign="top"><pre><?php var_dump($fieldObj->getLocalValidationRules()); ?></pre></td>
                <td valign="top"><pre><?php var_dump($fieldObj->describeValidationRules()); ?></pre></td>
                <td valign="top"><pre><?php var_dump($fieldObj->getValidationRules()); ?></pre></td>
            </tr>
            <?php
        }
        ?>
    </table>
    <?php
}
?>

このスクリプトでは「fmapi_field_test」レイアウトにアクセスし、配置されている3フィールドの「入力値の制限」情報をテーブルとして表示する。実際にWebブラウザで確認してみよう。

fmapi_field.phpの実行結果。いくつかのメソッドは筆者の環境では期待した結果を得ることができなかった

このなかで期待した動作をしているのはdescribeLocalValidationRules(), getLocalValidationRules(), describeValidationRules(), getValidationRules()のみとなった。また次の機会に環境を変更・整理して再チャレンジしてみたいと思う。