ここまでレコードの登録・検索・編集を紹介した。FileMaker API for PHPでの、レコード操作における基本機能の紹介もいよいよ終盤。最後に複製・削除機能について取りあげよう。

レコードの複製方法

レコードの複製はFileMaker_Command_Duplicateクラスを使用し、レコードIDを指定して複製クエリを発行する。手順は次のとおりだ。

  1. newDuplicateCommand()でFileMaker_Command_Duplicateオブジェクトを生成
  2. newDuplicateCommand()の第二引数またはsetRecordId()で複製したいレコードのレコードIDを指定
  3. 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を指定して削除クエリを発行する。手順は次のとおりだ。

  1. newDeleteCommand()でFileMaker_Command_Deleteオブジェクトを生成
  2. newDeleteCommand()の第二引数またはsetRecordId()で削除したいレコードのレコードIDを指定
  3. 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アプリ 実践編チュートリアル

の紹介を予定している。乞うご期待!