SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

FileMaker API for PHPの利用

カスタム関数を作って効率的よくPHPと連携しよう

FileMaker API for PHPの利用 2:カスタム関数で効率的なPHPベースのカスタムWeb


  • このエントリーをはてなブックマークに追加

フォームデータの処理

 次にフォームデータの処理からいきましょう。前回の記事でWebフォームから受け取ったデータをFileMakerにセットする箇所は次のようにコーディングしました。検索フォームからの値をそれぞれのフィールドにセットし、同時に検索結果を複数ページで分割して受け取れるように、現在の検索条件を引き継ぐための処理もしています。

ソース1:「検索時における通常のフォームデータの処理」
//データベースに接続
$fm = new FileMaker();
$fm->setProperty('database', 'Catalog');
$fm->setProperty('hostspec', 'http://localhost');
$fm->setProperty('username', 'web');
$fm->setProperty('password', 'pass');

//検索オブジェクトの作成
$findCommand =& $fm->newFindCommand('web_catalog');
//レコードの取得範囲の指定
$findCommand->setRange($skip,$max);
//検索条件の指定
if(!empty($_GET['ID'])){
    $findCommand->addFindCriterion('ID','=='.$_GET['ID']);
    $search_query .= 'ID='.urlencode($_GET['ID']).'&';
}
if(!empty($_GET['Name'])){
    $findCommand->addFindCriterion('Name',$_GET['Name']);
    $search_query .= 'Name='.urlencode($_GET['Name']).'&';
}
if(!empty($_GET['Genre_Name'])){
    $findCommand->addFindCriterion(
        'Genre::Genre_Name',$_GET['Genre_Name']);
    $search_query .= 'Genre_Name='.urlencode(
        $_GET['Genre_Name']).'&';
}
if(!empty($_GET['Maker_Name'])){
    $findCommand->addFindCriterion(
        'Maker::Maker_Name',$_GET['Maker_Name']);
    $search_query .= 'Maker_Name='.urlencode(
        $_GET['Maker_Name']).'&';
}
if(!empty($_GET['RegistDate'])){
    //検索条件の対象が日付フィールドの場合は、
    //日付の形式をmm/dd/yyyyに変換。
    $registdate = date('m/d/Y', strtotime($_GET['RegistDate']));
    $findCommand->addFindCriterion('RegistDate',$registdate);
    $search_query .= 'RegistDate='.urlencode($_GET['RegistDate']).'&';
}
$findCommand->addSortRule('ID',1,FILEMAKER_SORT_ASCEND);
//検索実行
$result = $findCommand->execute();

 上のような処理は、対象となるフィールド数が少ないときはいいですが、フィールド数が増えると記述する量がとても多くなり大変です。スペルミスや記述漏れなどでバグなどを発生させてしまう恐れもあります。

 こういったフォームデータの処理を、関数化してもっと簡単に処理できるようにしましょう。

 作成する関数の要件は次のようにします。

     
  1. newFindCommandnewEditCommand(getRecordById)newAddCommand(createRecord)関数などを使って、レコードの登録や編集、検索を行う際に、フィールド名と値のセットとしてまとめてこれら関数にセットできるように、フォームデータをフィールド名と値の配列に変換します。
  2.  
  3. 各Webフォームの名称を対象となるFileMakerのフィールド名と同じにして、フィールド名と同じ名称のフォームの値がFileMakerに送信されるようにします。
  4.  
  5. 送信先のフィールドが日付フィールドの場合は、上記関数setDateを利用して日付書式を変換するようにします。
  6.  
  7. 検索時に、検索条件を引き継ぐことができるように、フィールド名と検索条件の対のデータを保存するようにします。

 1、2の機能を実現するため、API for PHPのレイアウトオブジェクトの関数getFieldsを使ってフィールドオブジェクトを取得し、作成した関数内でフィールドオブジェクトから取得した値を使ってフォームデータの検証を行います。

関数4:「setFields」
/*
リクエストデータを、FileMakerにセットできる値のみに絞り込むための関数
引数は、1番目に該当レイアウトのフィールドオブジェクトの配列、
2番目がリクエストデータ。
*/
function setFields($fields,$data){ //フィールドオブジェクトの有無を判定 if(count($fields)){ //フィールドオブジェクトを展開。 foreach($fields as $field){ //フィールド名を取得 $fieldname = $field->getName(); //フィールドの属性を取得 //(日付フィールドかどうかを判断するため) $fieldtype = $field->getResult(); //フィールド名と同じキーのデータが //リクエストにあるかどうか判断。 if(array_key_exists($fieldname,$data)){ //フィールド属性が日付の場合は、 //書式変換をして配列に収める。 if($fieldtype=='date'){ $setData['field'][$fieldname] = setDate($data[$fieldname]); //その他のフィールド属性の場合は、 //そのまま配列に収める。 }else{ $setData['field'][$fieldname] = $data[$fieldname]; } //範囲指定検索のリンク用に //フィールド名と値のセットをURLにする。 if(strlen($data[$fieldname])){ $setData['query'] .= urlencode($fieldname).'=' .urlencode($data[$fieldname]).'&'; } } } //レイアウト上のフィールドデータのみに //フィルタリングされたデータと範囲指定用のURLの配列を返す。 return $setData; } }

 上記関数から次のような形式での配列データを取得できます。

Array
(
    [field] => Array
        (
            [フィールド名1] => 値1
            [フィールド名2] => 値2
        ・
        ・
    
        )

    [query] => フィールド名1=値&フィールド名2=値2&
)

関数をまとめよう

 ここまで紹介した関数を別ファイルにまとめておき、利用する場合はこのファイルをインクルードして利用するようにしましょう。

ソース2:「function.php」
<?php

//日付データ表示用の書式変換の関数。引数に、リクエストデータと書式を渡す。
function viewDate($data , $format='Y/m/d'){
    if(strlen($data)){
        echo date($format,$data);
    }
}

//日付データの送信用に書式をmm/dd/yyyyに変換する関数。
//引数はリクエストデータ。
function setDate($data){
    if(strlen($data)){
        return date( 'm/d/Y' , strtotime($data));
    }
}

//数字書式変換用の関数。引数にリクエストデータと桁数。
function necho($data,$dec=0){
    if(is_numeric($data)){
        echo number_format($data,$dec);
    }
}

/*
リクエストデータを、FileMakerにセットできる値のみに絞り込むための関数
引数は、1番目に該当レイアウトのフィールドオブジェクトの配列、
2番目がリクエストデータ。
*/
function setFields($fields,$data){ //フィールドオブジェクトの有無を判定 if(count($fields)){ //フィールドオブジェクトを展開。 foreach($fields as $field){ //フィールド名を取得 $fieldname = $field->getName(); //フィールドの属性を取得 //(日付フィールドかどうかを判断するため) $fieldtype = $field->getResult(); //フィールド名と同じキーのデータが //リクエストにあるかどうか判断。 if(array_key_exists($fieldname,$data)){ //フィールド属性が日付の場合は、 //書式変換をして配列に収める。 if($fieldtype=='date'){ $setData['field'][$fieldname] = setDate($data[$fieldname]); //その他のフィールド属性の場合は、そのまま配列に収める。 }else{ $setData['field'][$fieldname] = $data[$fieldname]; } //範囲指定検索のリンク用に //フィールド名と値のセットをURLにする。 if(strlen($data[$fieldname])){ $setData['query'] .= urlencode($fieldname).'=' .urlencode($data[$fieldname]).'&'; } } } //レイアウト上のフィールドデータのみに //フィルタリングされたデータと範囲指定用のURLの配列を返す。 return $setData; } } ?>

次のページ
関数の使用例

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
FileMaker API for PHPの利用連載記事一覧
この記事の著者

堀 直樹(ホリ ナオキ)

大学卒業後入社の企業にて、趣味のFileMaker使いからなりゆきで社内のシステム担当となり社内システムの開発に孤軍奮闘する。その後ソフトハウスに転職してFileMakerによるシステム開発に従事し、現在は株式会社キクミミにて数々の企業のシステムを開発する。PHPによるカスタムWebでのシステム構築...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2710 2008/09/05 11:30

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング