Installation
- Remove FileMaker's API For PHP class files (
FileMaker.php
and the adjacentFileMaker
directory) from your project. - Copy the
fmPDA/v0
directory into your project, typically in the same directory where FileMaker's old API resided. - Wherever you do this:
require_once 'PATH-TO-FILEMAKER-CLASS-FILES/FileMaker.php';
replace with:require_once 'PATH-TO-FMPDA-CLASS-FILES/fmPDA/v0/fmPDA.php';
fmPDA v0 Overview
-
fmCURL
fmCURL
is a wrapper for CURL calls. Thecurl()
method sets the typical parameters and optionally encode/decodes JSON data.fmCURL
is independent of the FM API; it can be used to communicate with virtually any host (Google, Swipe, etc.). ThefmDataAPI
class (see below) usesfmCURL
to communicate with FileMaker's API.
Additionally,$curl = new fmCURL();
$curlResult = $curl->curl('https://www.example.com');fmCURL
instantiates a globalfmLogger
object to log various messages these classes generate. You can use this for your own purposes as well. See any of the example files on how it's used.
fmDataAPI
encapsulates interactions with FileMaker's Data API. The class provides methods for directly interacting with the Data API (Get, Find, Create, Edit, Delete, Set Globals, Scripts, etc.)
$fm = new fmDataAPI($database, $host, $userName, $password);
$apiResult = $fm->apiGetRecord($layout, $recordID);
Caution
- The Data API replaces the name of the Table Occurrence in portals with the layout object name (if one exists). If you name your portals on the dedicated Web layouts (you do have those, right?) you've been using with the old API, you'll need to change your code (ugh) or remove the object names.
- The Data API translates FM line separators from a line feed (\n) in the old API is now a carriage return (\r). If your code looks for line feeds, look for carriage returns now.
-
fmPDA provides method & data structure compatibility with FileMaker's 'old' API For PHP.
$fm = new fmPDA($database, $host, $userName, $password); /* fmPDA instead of FileMaker */
$findAllCommand = $fm->newFindAllCommand($layout);
$findAllCommand->addSortRule($fieldName, 1, FILEMAKER_SORT_DESCEND);
$result = $findAllCommand->execute();
Remember, wherever you did this:
$fm = new FileMaker(...);
replace it with:$fm = new fmPDA(...);
Within the limits described below, your existing code should function as is, with the exception that it's using FileMaker's Data API instead of the XML interface. Not everything is supported, so you may have to make some changes to your code.
fmPDA can also return the 'raw' data from the Data API; if you want to use
fmPDA
to create the structures for passing to the Data API but want to process the data on your own, set the 'translateResult
' element to false in the $options array you pass to the fmPDA
constructor. Alternatively, you can override fmPDA::newResult()
to return the result in whatever form you wish.What is supported
- Get Record By ID
- Find All
- Find Any
- Find (Non compound & Compound)
- Add Record
- Create Record & Commit
- Edit Record
- Get Record, Edit & Commit
- Delete Record
- Get Container Data
- Get Container Data URL
- Script execution - emulated with the old XML interface (v1 now supports script calls). This is only for direct script calls: pre-script, pre-command, and pre-sort are not be emulated.
What isn't supported
- Duplicate record
- Pre-script, pre-command, pre-sort script execution
- Setting the Result layout
- List scripts
- List databases
- List layouts
- Get layout metadata (some of it is available through an undocumented API)
- Validation
- Value Lists
- Using
Commit()
to commit data on portals. getTableRecordCount()
andgetFoundSetCount()
- fmPDA will create afmLogger()
message and returngetFetchCount()
. One suggestion as a workaround was made to create an unstored calculation field in your table to return these values and place them on your layout.
Changes you'll likely have to make to your code
The biggest change is replacing all calls to FileMaker::isError() to use the function fmGetIsError() as the FileMaker class no longer exists. If this is a major hassle, you can change conf.fmPDA.php and modify the following line:define('DEFINE_FILEMAKER_CLASS', false);
to:define('DEFINE_FILEMAKER_CLASS', true);
This will create a 'glue' FileMaker class that fmPDA inherits from, and you can continue to use FileMaker::isError()
. Even so, it's recommended that you should switch to fmGetIsError()
in the future to reduce/eradicate your dependence on a class called FileMaker. You'll likely run into conflicts if you do this and keep FileMaker's old classes in your include tree, so beware.Things to look out for with the new Data API
- Do not name a field called omit; that name is used in a find query to omit records.
- Do not name a field called deleteRelated; that name is used when editing a record to delete a related record.
fmRecord::getFieldAsTimestamp() (FileMaker_Record::getFieldAsTimestamp() in the old API)
can't automatically determine the field type as the Data API doesn't return field metadata. There is now a new third parameter ($fieldType
) to tell the method how to convert the field data. SeeFMRecord.class.php
for details.