前回までにFileMaker API for PHPでの機能の基礎ともいうべき、「登録」「検索」「編集」「複製」「削除」の5機能について紹介してきた。今回からはワンランクレベルアップし、応用編を紹介していこう。
今回はまず、FileMaker API for PHPでの「オブジェクトフィールド」に関する取り扱いについて取りあげよう。
オブジェクトフィールドへのアクセス方法・注意点 - 基本的にFX.phpと同様
FileMaker API for PHPでの「オブジェクトフィールド」へのアクセス方法は、基本的にFX.phpと同様だ。ポイントを簡単にまとめてみよう。
- Webアプリケーションからオブジェクトフィールドの内容を変更、追加することは不可能
- getField()でオブジェクトフィールドを指定した場合、オブジェクトフィールドの内容を表示するためのURIが取得できる
- getField()で返るURIを使用し、getContainerData()でオブジェクトフィールドの内容を取得するためのリクエストを発行、結果としてオブジェクトフィールドに保存されているバイナリを取得する
どれもFX.phpで気をつけるべき点と共通だ。ここでもポイントとして押さえておきたいのは「3」――1オブジェクトフィールドの内容を取得するために、1回のリクエストが発行されるようになっている点だろう。
このため複数のレコードを一度に表示する一覧画面などでオブジェクトフィールドへのアクセスをおこなうと、FileMaker Serverへおおきな負荷をかけることになる。コラム11回目の『オブジェクトフィールドは鬼門?! Webから取り扱うときの注意点』で紹介したとおり、オブジェクトフィールドは同時ユーザ数が多ければ多いほど、格納されているバイナリファイルのサイズが大きければ大きいほどパフォーマンスが低下する。これらの点に注意しながら実装をおこなおう。
オブジェクトフィールドへのアクセス方法 実装編
それでは実際に実装をおこなってみよう。今回はオブジェクトフィールドを2つ用意した。用意したオブジェクトフィールドとレイアウト情報は次のとおり。
- 作成したオブジェクトフィールド: fd_object_1, fd_object_2
- アクセスするFileMakerレイアウト: (配置したフィールドは図を参照)
作成した2つのオブジェクトフィールド。1つはオブジェクトフィールドが空欄だった場合の確認用 |
作成したFileMakerの「fmapi_obj」レイアウト。fm_object_1にはGIF形式の画像ファイルを格納している。fm_object_2にはなにも格納していない |
ソースコードは次のとおり。
fmapi_obj_test.php
<?php
include_once('../FileMaker.php');
// 文字列エスケープ用関数
function h($string)
{
return htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');
}
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$findCommand = $data->newFindCommand('fmapi_obj');
$findCommand->setRecordId(2);
$result = $findCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
$records = $result->getRecords();
foreach ($records as $record)
{
?>
<table border="1">
<tr>
<th>ft_serial</th>
<td><?php echo h($record->getField('ft_serial')); ?></td>
</tr>
<tr>
<th>ft_registTimeStamp</th>
<td><?php echo h($record->getField('ft_registTimeStamp')); ?></td>
</tr>
<tr>
<th>ft_updateTimeStamp</th>
<td><?php echo h($record->getField('ft_updateTimeStamp')); ?></td>
</tr>
<tr>
<th>ft_recordId</th>
<td><?php echo h($record->getField('ft_recordId')); ?></td>
</tr>
<tr>
<th>ft_object_1 (getField)</th>
<td><?php echo h($record->getField('ft_object_1')); ?></td>
</tr>
<tr>
<th>ft_object_1 (getContainerData)</th>
<td><img src="./fmapi_getObjectFieldData.php?path=<?php echo h(urlencode($record->getField('ft_object_1'))); ?>"></td>
</tr>
<tr>
<th>ft_object_2 (getField)</th>
<td><?php echo h($record->getField('ft_object_2')); ?></td>
</tr>
<?php
}
?>
</table>
<?php
}
?>
fmapi_getObjectFieldData.php
<?php
header('Content-type: image/gif');
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
echo $data->getContainerData($_GET['path']);
?>
fmapi_obj_test.phpではgetField('fmapi_object_1')およびgetField('fmapi_object_2')の結果を表示。<img>タグ内でgetField('fmapi_object_1')の結果をurlencodeして、fmapi_getObjectFieldData.phpに渡している。fmapi_getObjectFieldData.phpはfmapi_obj_test.phpの<img>タグ内から呼び出しているファイルで、fmapi_obj_test.phpから渡されるURI情報をもとにオブジェクトフィールドの内容を取得、必要なヘッダをつけて出力をおこなっている。実際に Webブラウザでfmapi_obj_test.phpにアクセスしてみよう。
GIF形式の画像を格納していたfmapi_object_1フィールドの中身が表示される。getFieldでアクセスするためのURIを取得し、それをfmapi_getObjectFieldData.phpに渡して画像を表示している。fmapi_object_2にはフィールドになにも格納されていないため、getField()の結果は空欄となる |
GIF形式の画像を格納していたfmapi_object_1フィールドの中身が表示された。FX.php同様、「URL取得→画像の表示」までにいくつかのステップがある。前述のとおりFileMaker ServerやWebサーバにかかる負荷もあるため、可能なかりぎオブジェクトフィールドの使用は控えたいところだ。
今回紹介したソースコード中に使用しているメソッドであらたに出てきたのは、getContainerData()ひとつのみ。
getContainerDataメソッド (FileMaker.php 402-409行目より)
/**
* Get the data for a given container field.
*
* @param string $url The location of the data.
*
* @return string The raw field data.
*/
function getContainerData($url)
- string $url: オブジェクトフィールドへアクセスするためのURIを指定
オブジェクトフィールドの内容を取得する実装法を紹介した。なお、FileMaker API for PHPの場合はFX.phpで言う「image_proxy.php」に相当するPHPファイルがない。そのまま使用すると、オブジェクトフィールドにアクセスするためのURIがHTMLソース中に難読化されることなく表示されてしまう。このURIをセキュリティ上ユーザに見せたくない場合はimage_proxy.phpを参考にして、URIを難読/複合化する関数・クラスを別途自作しよう。