【コラム】
FileMaker×PHPで作る、簡単・便利なWebアプリ
36 API for PHPでのオブジェクトフィールド取り扱い
2009/11/05
前回までに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を難読/複合化する関数・クラスを別途自作しよう。
関連記事
- ファイルメーカー、FileMaker Business Allianceメンバー向け割引購入プログラム[2009/6/4]
- ファイルメーカー、参加無料イベント「FileMaker Road Show 2009」開催[2009/6/4]
- 【インタビュー】ファイルメーカー粟倉社長に聞く、DBアプリ「Bento for iPhone」の国内展開[2009/6/3]
- 『ファイルメーカー選手権』でMacBook ProやVAIOを手に入れよう[2009/6/3]
- 【コラム】Mac Fan ソフトウェアレビュー 第58回 データベース作成ソフト「FileMaker Pro 10」[2009/5/25]
- FileMaker、iPhone/iPod touch版「Bento」が登場 - Bento 2.0と同期可能[2009/5/5]
- ファイルメーカー、FileMaker用テーマパックを期間限定で無料配布[2009/4/17]
- 【インタビュー】FileMaker Pro 10の魅力はいかに? - 米FileMaker社長 ドミニーク P.グピール氏に聞く[2009/2/24]
- ファイルメーカーの新社長に粟倉豊氏が就任[2009/2/2]
- インタフェースを一新した「FileMaker Pro 10」が発売[2009/1/6]
関連サイト
ヘッドライン
- 三菱電機、太陽光発電向けパワコン用パワー半導体モジュールを発表[20:27 3/18]エレクトロニクス
- テクトロら、アナライザとオシロによるコヒーレントPM-QPSK信号観測を実現[19:58 3/18]エレクトロニクス
- アジレント、光変調アナライザにCD/PMD測定機能オプションを追加[19:36 3/18]エレクトロニクス
- CSR、オーディオ処理とハンドセット向けBluetoothの統合チップを発表[19:11 3/18]エレクトロニクス
- ARM、スマートカード市場向けセキュアプロセッサを発表[18:59 3/18]エレクトロニクス
- MIPSとDMPがAndroid on MIPSで協業[18:46 3/18]エレクトロニクス
- Xilinx、Spartan-6を用いたFAシステムデザイン向けTDPを発表[18:33 3/18]エレクトロニクス
- TI、DLP Cinemaの2Kおよび4K対応プラットフォームがDCIの評価基準を達成[18:17 3/18]エレクトロニクス
- 【連載】『TechNet』の歩き方 第21回 リニューアルしたTechNet Online[09:00 3/18]WinServer2008 R2 導入体験記
- 【ハウツー】概説 Springプロダクト(2) - 柔軟な配備を可能にするSpring DM[09:00 3/18]プログラミング






