前回より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の表示形式を"ドロップダウンリスト"から"ラジオボタンセット"に変更した。
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_LayoutクラスとFileMaker_FieldクラスはFileMaker_Commandに関連するクラスと比較した場合、意識しないとあまり使わないクラスだ。しかし用意されている機能はどれも有用なものばかり。まだ使ったことのない方は、これを機会にぜひ触れてみていただきたい。