前回より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ブラウザで確認してみよう。
このなかで期待した動作をしているのはdescribeLocalValidationRules(), getLocalValidationRules(), describeValidationRules(), getValidationRules()のみとなった。また次の機会に環境を変更・整理して再チャレンジしてみたいと思う。