ここまでレコードの登録・検索・編集を紹介した。FileMaker API for PHPでの、レコード操作における基本機能の紹介もいよいよ終盤。最後に複製・削除機能について取りあげよう。
レコードの複製方法
レコードの複製はFileMaker_Command_Duplicateクラスを使用し、レコードIDを指定して複製クエリを発行する。手順は次のとおりだ。
- newDuplicateCommand()でFileMaker_Command_Duplicateオブジェクトを生成
- newDuplicateCommand()の第二引数またはsetRecordId()で複製したいレコードのレコードIDを指定
- execute()でクエリを発行し、レコードを複製
ここで注意しておきたいのは「レコードIDを使用して複製したいレコードを指定すること」だ。FileMakerスクリプトを併用しない限り「検索結果に該当するレコードを複製」といった動作はおこなえないので注意しよう。
それでは実際に「レコードIDが20」のレコードを複製するコードを書いてみよう。FileMakerレイアウトは編集時に使用した「fmapi_edit」を使用する。
fmapi_dupe_test.php
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$dupeCommand = $data->newDuplicateCommand('fmapi_edit',20);
$result = $dupeCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
$records = $result->getRecords();
?>
<table border="1">
<tr>
<th>ft_serial</th>
<th>ft_registTimeStamp</th>
<th>ft_updateTimeStamp</th>
</tr>
<?php
foreach ($records as $record)
{
echo '<tr>';
echo '<td>' . $record->getField('ft_serial') . '</td>';
echo '<td>' . $record->getField('ft_registTimeStamp') . '</td>';
echo '<td>' . $record->getField('ft_updateTimeStamp'). '</td>';
echo '</tr>';
}
?>
</table>
<?php
}
?>
指定するパラメータがレコードIDのみとなるので、登録や検索・編集に比べるとだいぶシンプルなコードとなる。実際にWebブラウザでアクセスしてみよう。
fmapi_dupe_test.phpをWebブラウザで表示させたところ。表示される内容(クエリ発行後に返るレコードセット)は、複製後のレコード情報だ |
FileMakerの「fmapi_edit」レイアウト。fmapi_dupe_test.phpを表示した回数だけ、レコードが複製されていることがわかる |
指定したレコードが複製できていることが確認できた。それではFileMaker_Command_Duplicateクラスで使用できるメソッドを確認しておこう。
newDuplicateCommandメソッド (FileMaker.php 231-239行目より)
/**
* Create a new FileMaker_Command_Duplicate object.
*
* @param string $layout The layout the record to duplicate is in.
* @param string $recordId The id of the record to duplicate.
*
* @return FileMaker_Command_Duplicate The new duplicate command.
*/
function &newDuplicateCommand($layout, $recordId)
- string $layout: 使用するFileMakerレイアウト名を指定
- string $recordId: 複製したいレコードのレコードIDを指定
newDuplicateCommandメソッド (Command/Duplicate.php 37-45行目より)
/**
* Duplicate command constructor.
*
* @ignore
* @param FileMaker_Implementation $fm The FileMaker_Implementation object the command was created by.
* @param string $layout The layout the record to duplicate is in.
* @param string $recordId The id of the record to duplicate.
*/
function FileMaker_Command_Duplicate($fm, $layout, $recordId)
このほかにもFileMaker_Commandクラスから次のメソッドを継承する。
- execute()
- setPreCommandScript()
- setPreSortScript()
- setRecordClass()
- setRecordId()
- setResultLayout()
- setScript()
- validate()
FileMaker_Command_Duplicateクラスにはコンストラクタ以外に独自のメソッドを持っていない。フィールドを編集するためのsetFieldも使用できないので、入力値の制限に「ユニークな値」がセットされているフィールド/テーブルのレコードを複製する場合には注意が必要だ。FileMaker_Command_Duplicateクラスではこのようなレコードを複製できないので、冒頭で少し触れた「FileMaker_Command_Findクラスで検索をおこなった後、FileMakerスクリプトで該当のレコードを複製する」実装方法を取らなければならない。FileMakerスクリプトを実行させる方法は、追って応用編にて紹介していこう。
入力値の制限に「ユニークな値」がセットされているフィールド/テーブルのレコードを複製しようとすると504エラーが返る。この方法では複製できないので、応用編にて紹介するFileMakerスクリプトを使用した方法で複製する |
レコードの削除方法
レコードの削除方法も複製方法とまったく同じだ。FileMaker_Command_Deleteクラスを使用し、レコードIDを指定して削除クエリを発行する。手順は次のとおりだ。
- newDeleteCommand()でFileMaker_Command_Deleteオブジェクトを生成
- newDeleteCommand()の第二引数またはsetRecordId()で削除したいレコードのレコードIDを指定
- execute()でクエリを発行し、レコードを削除
複製同様、削除にはレコードIDを指定する。FileMakerスクリプトを併用しない限り「検索結果に該当するレコードを一括で削除」といった動作はおこなえないので注意されたい。それではさきほど複製に使用したレコードを削除してみよう。
fmapi_delete_test.php
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$deleteCommand = $data->newDeleteCommand('fmapi_edit',20);
$result = $deleteCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
var_dump($result->getRecords());
var_dump($result->getTableRecordCount());
}
?>
クエリ発行後はレイアウト情報と関連するレコード情報が返るが、削除処理のためレコード情報は返らない。ここでは参考に、FileMaker_ResultクラスのgetRecords()メソッドとgetTableRecordCount()の実行結果表示するようにした。このファイルをWebブラウザで表示する
fmapi_delete_test.phpをWebブラウザで表示させたところ。レコードを削除するので、当然のことながらレコード情報は返らない |
再度Webブラウザで開くと、レコードが存在しないので101エラーが表示される |
レコード削除処理はこのほかにも、FX.phpのときに紹介した「削除フラグを用意しておき、フラグ値で削除されたかどうかを判定する」実装方法がある。用途によって使いわけたいところだ。最後に、FileMaker_Command_Duplicateクラスで使用できるメソッドを確認する。
newDeleteCommandメソッド (FileMaker.php 218-226行目より)
/**
* Create a new FileMaker_Command_Delete object.
*
* @param string $layout The layout to delete from.
* @param string $recordId The id of the record to delete.
*
* @return FileMaker_Command_Delete The new delete command.
*/
function &newDeleteCommand($layout, $recordId)
- string $layout: 使用するFileMakerレイアウト名を指定
- string $recordId: 削除したいレコードのレコードIDを指定
newDeleteCommandメソッド (Command/Delete.php 37-45行目より)
/**
* Delete command constructor.
*
* @ignore
* @param FileMaker_Implementation $fm The FileMaker_Implementation object the command was created by.
* @param string $layout The layout to delete from.
* @param string $recordId The id of the record to delete.
*/
function FileMaker_Command_Delete($fm, $layout, $recordId)
このほかにもFileMaker_Command_Duplicateクラス同様、FileMaker_Commandクラスから次のメソッドを継承する。
- execute()
- setPreCommandScript()
- setPreSortScript()
- setRecordClass()
- setRecordId()
- setResultLayout()
- setScript()
- validate()
FileMaker API for PHPの、レコード操作における基礎機能ともいうべきレコード登録・検索・編集・複製・削除までを紹介した。今後応用編をふくめ、当コラムでは
- FileMakerスクリプトの呼び出し・オブジェクトフィールドの扱い
- FileMakerファイル/レイアウトへのアクセス方法(FileMakerクラス)
- FX.phpとの機能・パフォーマンス詳細比較
- コマンドラインツール「fmsadmin」との連携
- <まとめ> FileMaker×PHPで作る、簡単・便利なWebアプリ 実践編チュートリアル
の紹介を予定している。乞うご期待!