FileMaker Webアプリを実装するにあたり、FX.php, FileMaker API for PHPの使い方やパフォーマンス比較を紹介してきた。前回よりFMCakeMixの最近の更新点を軸に紹介をおこなっている。今回は「データベースレベルでdefaultLayoutを指定できるように」「値一覧のサポート」を中心に、FMCakeMixでFileMakerレイアウトを指定・値一覧を使用する方法を取りあげる。

FMCakeMixでFileMakerレイアウトを指定する方法

6月17日(米国時間)に、データベースレベルでdefaultLayoutを指定できるように修正がおこなわれた。前回解説したとおり、defaultLayoutとはFileMakerにアクセスする際、処理の中心となるレイアウトのこと。これまでこのdefaultLayoutはモデル(/app/model/*.php)で指定していたが、これをデータベースレベル(/app/config/database.php)でも指定できるようになった。

FMCakeMixでFileMakerレイアウトを指定する方法は、これで3通りとなった。

  • データベースレベルで指定 (/app/config/database.php)
  • モデル内で指定 (app/model/*.php)
  • コントローラ内で指定 (app/controller/*.php)

データベースレベルで指定する場合

6月17日(米国時間)の修正で使用できるようになった方法。CakePHP内の/app/config/database.phpにおいてdefaultLayoutを記述する。

データベースでのdefaultLayout指定例

var $default = array
(
    'driver' => 'fmcakemix',
    'persistent' => false,
    'dataSourceType' => 'FMPro7',
    'scheme' => 'http',
    'port' => 80,
    'host' => '127.0.0.1',
    'login' => 'myUserName',
    'password' => 'myPassword',
    'database' => 'FMServer_Sample',
    'prefix' => '',
    'defualtLayout' => 'web_books_general';
);

モデル内で指定する場合

CakePHP内の/app/model/*.phpにおいてdefaultLayoutを記述する。

モデルでのdefaultLayout指定例

class Book extends AppModel
{
    var $name = 'Book'; 
    var $useDbConfig = 'default';
    var $primaryKey = 'ID';

    // FMCakeMix specific attributes
    var $defualtLayout = 'web_books_general';
    var $fmDatabaseName = 'FMServer_Sample';

    // Optionally assign related models
    var $hasMany = array
    (
        'Comment' => array
        (
            'foreignKey' => '_fk_book_id'
        ),
        'History' => array
        (
            'foreignKey' => '_fk_book_id'
        )
    );

    // Optionally provide translations of related FileMaker table occurrences
    // that may be returned through FileMaker portals into Cake model names
    var $fmTOtranslations = array
    (
        'CommentsTO' => 'Comment'
    );

    // Optionally provide validation criteria for our model
    var $validate = array
    (
        'Title' => array
        (
            'rule' => 'notEmpty'
        ),
        'Author' => array
        (
            'rule' => 'notEmpty'
        )
    );
}

コントローラ内で指定する場合

CakePHP内の/app/controller/*.phpにおいてdefaultLayoutを記述する。

コントローラでのdefaultLayout指定例

function add()
{
    $this->Book->defaultLayout = 'web_books_general';
    if (!empty($this->data))
    {
    $this->Book->create();
    if ($this->Book->save($this->data))
    {
        $this->Session->setFlash(__('The Book has been saved', true));
        $this->redirect(array('action'=>'index'));
    }
    else
    {
        $this->Session->setFlash(__('The Book could not be saved. Please, try again.', true));
    }
}

なお、コントローラ内でもデータベースファイルを指定することが可能だ。指定する場合は「fmDatabaseName」を変更する。

DBOドライバ本体(dbo_fmcakemix.php)において、FileMakerレイアウトに関する記述がおこなわれている箇所は次のとおり。

dbo_fmcakemix.php 186行目

$fm_layout = empty($model->defaultLayout) ? $this->config['defaultLayout'] : $model->defaultLayout;

同様の構文が404行目、449行目、527行目、597行目、799行目と各種関数の先頭に記述されている。データベースレベルでdefaultLayoutが指定されていない場合は、モデルで指定したdefaultLayoutが適用される。これらのことから、FileMakerレイアウトの指定優先順は

  1. コントローラ内で指定したFileMakerレイアウト
  2. モデル内で指定したFileMakerレイアウト
  3. データベースレベルで指定したFileMakerレイアウト

となる。処理レベルで細かくFileMakerレイアウトを指定したい場合はコントローラ内で指定すればOKだが、多用してしまうと後々メンテナンスが大変になる可能性がある。おおまかなレイアウトはデータベースレベルで指定しておき、処理単位でモデルを分離してFileMakerレイアウトもそこで指定しておけば、ほかのチーム/開発者がコードを追うときにコントローラを見渡す必要がなくなる。自分たちの体制にあった開発手法を選ぼう。

FMCakeMixで値一覧を使用する方法

値一覧を取得したいモデル(/app/model/*.php)に「var $returnValueLists = true;」の一文を加えることで、スキーマに値一覧情報が格納されるようになる。モデル側でvar $returnValueLists = true;の一文を追加をしていないと、スキーマ情報に値一覧が格納されないので注意されたい。

サンプル用のファイル構成・値一覧情報は次のとおり。

  • FileMakerファイル名: fmcake_test
  • FileMakerレイアウト名: fmcake_test
  • FileMaker値一覧名: valueList_tool
  • 値一覧を設定したフィールド名: tool

レイアウト「fmcake_test」には値一覧を設定したフィールドを1つだけ配置

表示形式はチェックボックスセット、値一覧は「valueLists_tool」とした。なお、この値一覧名はPHP上で指定することはない

それではデータベースのコンフィグ、モデル・コントローラ・ビューを書いてみよう。

データベース設定例

    var $default = array
    (
        'driver' => 'fmcakemix',
        'dataSourcetype' => 'FMPro7',
        'persistent' => false,
        'scheme' => 'http',
        'host' => 'localhost',
        'port' => 80, 
        'login' => 'admin',
        'password' => 'admin',
        'database' => 'fmcake_test',
        'prefix' => '', 
        'encoding' => 'utf8'
    );

モデル記述例

<?php

class Tool extends AppModel
{
    var $defaultLayout = 'fmcake_test';
    var $fmDatabaseName = 'fmcake_test';
    var $returnValueLists = true;
}

?>

値一覧を使用したいコントローラ(/app/controller/*.php)でスキーマ情報を取得し、set()でビューに渡してやることで値一覧の中身を使うことが可能になる。

コントローラ記述例

<?php

class ToolsController extends AppController
{

    function index()
    {   
        $this->layout = false;
        $this->set('schema', $this->Tool->schema(););
    }

}
?>

ここではschemaに取得したスキーマ情報を格納した。ビューからは$schemaで参照できる。値一覧情報を使用するときはwhile()なりforeach()なりで展開しよう。

ビュー記述例

<p>興味がある/実際に使っているツール</p>
<?php
foreach ($schema['tool']['valuelist'] as $value)
{
?>
    <input type="checkbox"> <?php echo $value; ?><br>
<?php
}
?>

ここで注意したいのは、PHP内で指定するのは「使用したい値一覧名」ではなくて「使用したい値一覧が設定されているフィールド名」だということだ。実際にWebブラウザでこのコントローラにアクセスする。

モデルに「var $returnValueLists = true;」の一文を加えることで、値一覧が使用可能に

FX.phpのFMView()を使った値一覧取得では「値一覧名」を指定するが、こちらは値一覧が設定されたフィールド名を指定するのが特徴。FileMakerレイアウト上に1つのダミーフィールドを複数配置し、別々の値一覧をセットするといった手段は使えないので注意されたい。