はじめに
クライアント側ではもちろん、JavaScriptのプログラムを記述できますが、一般的なJavaScriptの関数などを使うことに加えて、INTER-Mediatorが稼働していれば利用できるメソッドについて、ここで解説をします。
ページ合成処理
INTERMediator.construct(targetContext)
- 解説:INTERMediator.constructMainと同じ
INTERMediator.constructMain(targetContext)
- 解説:ページ合成を行う。asyncで定義されている。
- 引数:targetContext:省略あるいはtrueで、ページファイルのすべての要素に対して合成を行う。引数にコンテキストのオブジェクト(IMLibContext)を指定すれば、そのオブジェクトに対応したエンクロージャー内部のみを合成する。
- 返り値:なし
INTERMediatorOnPage.doBeforeConstruct = function() { }
ページの合成処理が実行される関数を定義します。引数のない関数を代入します。INTERMediator.constructMain(true)でページ合成を行いますが、その処理の最初に関数が実行されます。例えば、URLのパラメータを取り出して、検索条件として設定するなどの処理を組み込めます。
INTERMediatorOnPage.doAfterConstruct = function() { }
ページの合成処理が終わったときに実行される関数を定義します。引数のない関数を代入します。INTERMediator.constructMain(true)でページ合成を行いますが、非同期に処理を進めるため、このステートメントの次に書かれた命令は、通常は合成途中に実行されるなど、少なくともページを作り終える前になってしまいます。ページができていないと取得できないような情報もあるので、このようなコールバックの仕組みを用意してあります。
INTERMediatorOnPage.doBeforePartialConstruct = function(context) { }
INTERMediator.constructMain(context)のように、コンテキストを与えてページの合成処理を実施して部分的に合成する場合に、ページ合成処理よりも前に実行される関数を定義します。引数にはconstructMainの引数に指定したコンテキストへの参照が設定されます。
INTERMediatorOnPage.doAfterPartialConstruct = function(context) { }
INTERMediator.constructMain(context)のように、コンテキストを与えてページの合成処理を実施して部分的に合成する場合に、ページ合成処理よりも後に実行される関数を定義します。引数にはconstructMainの引数に指定したコンテキストへの参照が設定されます。
INTERMediatorOnPage.isAutoConstruct
このプロパティをfalseにすると、ページの合成を行わなくなります。doBeforeConstructに指定した関数の中などで、条件に応じてページ合成をしたくない場合は、このプロパティにfalseを代入してください。初期値はtrueです。
INTERMediatorOnPage.isFinishToConstruct
ページ生成中(つまり、constractMainメソッド実行中)であれば、trueになる。
INTERMediator.partialConstructing
ページ構築中に参照することで、現在の構築がページ全体なのか、ページの一部分なのかが判定できる。
検索条件やソート条件の追加
INTERMediator.addCondition(contextName, {field:xxx,operator:xxx,value:xxxx})
コンテキストに従ってデータベースのクエリを行うとき、ここで指定した検索条件が、他の条件に対してAND条件で追加される。引数contextNameにはコンテキスト名を指定する。第2引数は条件を示すオブジェクトを指定する。このオブジェクトではfield、operator、valueのプロパティを指定し、それぞれフィールド名、演算子、値を指定する。複数の条件を追加する場合には、このメソッドを繰り返し呼べば良い。additionalConditionプロパティはセッター/ゲッターで実装しているため、内部のオブジェクトへの追加はこのAPIを使うようにする。
INTERMediator.clearCondition(contextName)
検索条件に追加される設定を、引数に指定したコンテキスト名のものついて初期化して、指定なしにする。そのコンテキストがページネーションを持っている場合はページ番号は1にリセットされる。引数なしで呼び出し場合、全ての追加条件をクリアし、ページ番号を1にする。
INTERMediator.additionalCondition = {};
すべての検索条件に追加される設定を消す。
INTERMediator.addSortKey(contextName, {field:xxx,direction:xxxx})
コンテキストに従ってデータベースのクエリを行うとき、ここで指定したソート条件が設定される。コンテキストのソート条件より高い優先順になっている。引数contextNameにはコンテキスト名を指定する。第2引数はそーと条件を示すオブジェクトを指定する。このオブジェクトではfield、directionのプロパティを指定し、それぞれフィールド名、昇順か降順かをASCないしはDESCを指定する。複数の条件を追加する場合には、このメソッドを繰り返し呼べばよく、先に指定した方が優先順位が高い。
INTERMediator.clearSortKey(contextName)
ソート条件に追加される設定を、引数に指定したコンテキスト名のものついて初期化して、指定なしにする。
INTERMediator.additionalSortKey = {};
すべてのソート条件に追加される設定を消す。
INTERMediator.setRecordLimit(contextName, n);
引数に指定したコンテキスト名のコンテキストに対してクエリーを実施するとき、レコードの個数の上限値を設定できる。なお、同じことは、コンテキストのrecordsキーの値でも指定できる。
INTERMediator.clearRecordLimit(contextName);
setRecordLimitで指定した値をクリアする。
INTERMediator.setRecordStart(contextName, n);
引数に指定したコンテキスト名のコンテキストに対してクエリーを実施するとき、レコードの開始番号を指定できる。
INTERMediator.clearRecordStart(contextName);
setRecordStartで指定した値をクリアする。
INTERMediator.additionalFieldValueOnNewRecord
新規レコードを作った時のフィールドの既定値を、JavaScript上で追加定義する。INTERMediator.additionalFieldValueOnNewRecord["コンテキスト名"] = [{field: フィールド名, value: 値}, ...] の形式で利用する。
INTERMediator.additionalFieldValueOnUpdate
レコード更新時に変更するフィールドとその値を、JavaScript上で追加定義する。INTERMediator.additionalFieldValueOnUpdate["コンテキスト名"] = [{field: フィールド名, value: 値}, ...] の形式で利用する。
INTERMediator.additionalFieldValueOnDelete
レコード削除時の検索条件を、JavaScript上で追加定義する。INTERMediator.additionalFieldValueOnDelete["コンテキスト名"] = [{field: フィールド名, value: 値}, ...] の形式で利用する。
INTERMediator_DBAdapter.eliminateDuplicatedConditions = logical_value (default is false)
trueの場合検索条件で同一の検索式を自動的に取り除く。既定値はfalse。
ページ合成処理に割り込む処理の記述
INTERMediatorOnPage.additionalExpandingEnclosureFinish = {コンテキスト名: function (target) { }},
INTERMediatorOnPage.expandingEnclosureFinish = function (name, target) { }
INTERMediatorOnPage.postEnclosure_《コンテキスト名》 (target)
INTERMediatorOnPage.《コンテキストで指定した名前》 (target)
- 引数:name:展開が終わった箇所で利用した定義ファイルのコンテキストのname属性の値
- 引数:target:展開が終わったエンクロージャのノード
- 返り値:なし
エンクロージャの展開が終わる度に呼び出されます。4つメソッドがあり、前述の順序で呼び出されますが、3番目が存在すれば4番目は呼び出されません。2つ目は全てのコンテキストで呼び出され、その他のものはコンテキストごとに呼び出すかどうかを制御できます。最初のものは呼び出すプログラム自体をプログラムで指定できます。そこまで複雑ではない場合には3ないしは4番目の手法が良いでしょう。2番目の手法は、全てのエンクロージャの展開後に実行したい処理を記述します。4番目の《コンテキストで指定した名前》は、定義ファイルのコンテキストの指定で、'post-enclosure'というキーに対応する文字列で、メソッド名を指定します。1〜3番目はメソッドの定義をすればそれで呼び出されますが、3番目の手法がいちばん手軽だと思われます。
INTERMediatorOnPage.additionalExpandingRecordFinish: {コンテキスト名: function (repeaters) { }},
INTERMediatorOnPage.expandingRecordFinish(name, repeaters)
INTERMediatorOnPage.postRepeater_《コンテキスト名》(repeaters)
INTERMediatorOnPage.《コンテキストで指定した名前》(repeaters)
- 引数:name:展開が終わった箇所で利用した定義ファイルのコンテキストのname属性の値
- 引数:repeaters:1レコード分の展開をしたリピーターの配列
- 返り値:なし
リピータの展開時に、1レコード分の処理が終わった度に呼び出されます。4つメソッドがあり、前述の順序で呼び出されますが、3番目が存在すれば4番目は呼び出されません。2つ目は全てのコンテキストで呼び出され、その他のものはコンテキストごとに呼び出すかどうかを制御できます。最初のものは呼び出すプログラム自体をプログラムで指定できます。そこまで複雑ではない場合には3ないしは4番目の手法が良いでしょう。2番目の手法は、全てのリピーターの展開後に実行したい処理を記述します。4番目の《コンテキストで指定した名前》は、定義ファイルのコンテキストの指定で、'post-repeater'というキーに対応する文字列で、メソッド名を指定します。そのメソッドを以下のように定義して、プログラムを記述します。1〜3番目はメソッドの定義をすればそれで呼び出されますが、3番目の手法がいちばん手軽だと思われます。
INTERMediatorOnPage.notShowHeaderFooterOnNoResult
trueの場合、data-im-control属性の値がfooter、headerのリピーターについて、検索結果にレコードが存在しない場合に表示しなくする。既定値はfalse。
INTERMediator.noRecordClassName: '_im_for_noresult_',
INTERMediatorLib.ignoreEnclosureRepeaterClassName: '_im_ignore_enc_rep',
INTERMediatorLib.ignoreEnclosureRepeaterControlName: 'ignore_enc_rep',
INTERMediatorLib.roleAsRepeaterClassName: '_im_repeater',
INTERMediatorLib.roleAsEnclosureClassName: '_im_enclosure',
INTERMediatorLib.roleAsRepeaterDataControlName: 'repeater',
INTERMediatorLib.roleAsEnclosureDataControlName: 'enclosure',
INTERMediatorLib.roleAsSeparatorDataControlName: 'separator',
INTERMediatorLib.roleAsHeaderDataControlName: 'header',
INTERMediatorLib.roleAsFooterDataControlName: 'footer',
INTERMediatorLib.roleAsNoResultDataControlName: 'noresult',
リピーターやエンクロージャーに指定するクラス名やdata-im-control属性に指定する文字列を定義したプロパティ。通常は変更する必要はないが、どうしても名前を変えたい場合にはプロパティへの書き込みによって変更は可能であるが、この仕組みは厳密にはデバッグされていないので、使用するときは注意が必要である。
アプリケーション動作のための様々なプロパティ
INTERMediatorOnPage.dbCache
cacheキーの値がtrueのコンテキストによって集積されたキャッシュデータがこのオブジェクトに設定される。
INTERMediatorOnPage.creditIncluding: null,
INTER-Mediatorのクレジットサイン(ページ下部に表示されるもの)を挿入するノードのid値。nullだとbodyタグ直下の最後に追加
INTERMediatorOnPage.getEditorPath
定義ファイルエディタやページファイルエディタが使える場合、エディタへのパス。
INTERMediatorOnPage.getEntryPath
定義ファイルへのパス。
INTERMediatorOnPage.getDataSources
定義ファイルのIM_Entry関数の第1引数に指定したデータソースを記述したオブジェクト。
INTERMediatorOnPage.getOptionsAliases: null,
定義ファイルのIM_Entry関数の第2引数に指定したaliasesキーの値。
INTERMediatorOnPage.getOptionsTransaction: null,
定義ファイルのIM_Entry関数の第2引数に指定したtransactionキーの値。
INTERMediatorOnPage.dbClassName: null,
定義ファイルのIM_Entry関数の第3引数に指定したデータベースクラス名。例えば「PDO」。
INTERMediatorOnPage.serviceServerStatus
サービスサーバーが起動しているかどうか。
INTERMediatorOnPage.appLocale
サーバーで設定あるいは識別したロケールのコード。例えば「ja_JP」
INTERMediatorOnPage.appCurrency
サーバーで設定あるいは識別した通貨の国コード。例えば「JP」
INTERMediatorLocale
このオブジェクトに、サーバーで設定あるいは識別したロケールに基づく小数点の記号などの情報が設定されている。
INTERMediatorOnPage.metadata
composer.jsonから得られたINTER-Mediatorに関する情報で、キーはversionとreleasedate
INTERMediatorOnPage.showProgress()
処理中を示すギアが回るアニメーションを表示する。
INTERMediatorOnPage.hideProgress()
処理中を示すギアが回るアニメーションを非表示にする。
INTERMediatorOnPage.isShowProgress
trueの場合、処理中を示すギアが回るアニメーションを表示する。既定値はtrue。
INTERMediatorOnPage.buttonClassCopy
INTERMediatorOnPage.buttonClassDelete
INTERMediatorOnPage.buttonClassInsert
INTERMediatorOnPage.buttonClassMaster
INTERMediatorOnPage.buttonClassBackNavi
これらのプロパティに設定した文字列が、「複製」ボタンや「削除」ボタン等にclass属性に追加される。例えば、Bootstrapを使っている場合には、doBeforeConstructプロパティの関数内で、これらのプロパティに"btn btn-info"を代入するなどができる。
ブラウザのバージョンや種類の判定
INTERMediator.isTablet
クライアントのUserAgentから判定したタブレットかどうかのチェック結果。
INTERMediator.isMobile
クライアントのUserAgentから判定したモバイルデバイスかどうかのチェック結果。
INTERMediator.isIE
クライアントのUserAgentから判定したInternet Explorerかどうかのチェック結果。「MSIE/」が含まれているかをチェック。
INTERMediator.isTrident
クライアントのUserAgentから判定したTridentエンジンかどうかのチェック結果。「Trident/」が含まれているかをチェック。
INTERMediator.isEdge
クライアントのUserAgentから判定したEdgeエンジンかどうかのチェック結果。「Edge/」が含まれているかをチェック。
INTERMediatorOnPage.browserCompatibility
接続してきたブラウザの種類やバージョンから、アプリケーションが利用可能かどうかを判定するための情報をオブジェクトで指定する。詳細は、INTER-MediatorによるWebアプリケーションの概要にある「ブラウザのバージョンを調べる仕組み」を参照。
INTERMediatorOnPage.nonSupportMessageId
INTERMediatorOnPage.browserCompatibilityの仕組みを用いれば、サポートブラウザである場合にはエラーメッセージを非表示にすることができるが、その時のエラーメッセージが記載されたHTML要素のid属性値の文字列を指定する。既定値は「nonsupportmessage」
特定のターゲット指定を持つノードの検索
INTERMediatorOnPage.getNodeIdsHavingTargetFromNode(fromNode, imDefinition)
- 引数:fromNode:基準となるノードで、このノードより下位のノードを検索する。ノードの配列でもOK
- 引数:imDefinition:ターゲット指定。例えば、「<input type="text" class="IM[item@unitprice]" />」については、引数に "item@unitprice" を指定する
- 返り値:ノードのid属性を示す文字列の配列。ノードが発見された場合でid属性がない場合は、そのノードへの参照
INTERMediatorOnPage.getNodeIdsHavingTargetFromRepeater(fromNode, imDefinition)
- 引数:fromNode:基準となるノードで、このノードより上位のノードを検索し最初に見つかったリピータよりも下位のノードを検索する
- 引数:imDefinition:ターゲット指定。例えば、「<input type="text" class="IM[item@unitprice]" />」については、引数に "item@unitprice" を指定する
- 返り値:ノードのid属性を示す文字列の配列。ノードが発見された場合でid属性がない場合は、そのノードへの参照
INTERMediatorOnPage.getNodeIdsHavingTargetFromEnclosure(fromNode, imDefinition)
- 引数:fromNode:基準となるノードで、このノードより上位のノードを検索し最初に見つかったエンクロージャよりも下位のノードを検索する
- 引数:imDefinition:ターゲット指定。例えば、「<input type="text" class="IM[item@unitprice]" />」については、引数に "item@unitprice" を指定する
- 返り値:ノードのid属性を示す文字列の配列。ノードが発見された場合でid属性がない場合は、そのノードへの参照
URLからパラメータを取り出す
INTERMediatorOnPage.getURLParametersAsArray()
URLの中のパラメータを取り出し、パラメータ名をキーとしたオブジェクトを返す。たとえば、「http://domain.name/page.html?a=1&b=2」というページなら、返り値は {a:1, b:2}となる。
安全に別のページに移動する
INTERMediator.moveAnotherURL(url[, task])
location.hrefに文字列を代入することで別のページに移動できますが、フィールドの更新の途中かもしれません。このメソッドを利用すれば、更新処理を全て終えるのを待って引数urlで指定する別のページに移動できます。また、クライアント間同期処理を行っている場合、別ページに移動する前にページに表示している内容に関する情報を削除したいのですが、このメソッドで移動する前に削除を行います。taskはページ移動前に行う処理をクロージャで記述できますが、省略可能です。
Post Onlyモードでのメソッド
INTERMediatorOnPage.processingBeforePostOnlyContext = function(targetNode) {}
バリデーションが完了し、データベースへの書き込み前に呼び出される。falseを返すとデータベースの書き込み処理はキャンセルされる。引数targetにはPost Onlyモードのエンクロージャーへの参照が設定される。
INTERMediatorOnPage.processingAfterPostOnlyContext = function(targetNode, idValue) {}
新規レコードを作成した直後に呼び出される。引数targetにはPost Onlyモードのエンクロージャーへの参照が設定される。引数idValueは新たに作成されたレコードの主キー値が設定される。設定されていない場合は、レコード作成ができなかったことを示す。
INTERMediator.waitSecondsAfterPostMessage
ポストオンリーモードで、送信後の処理を何秒後に開始するかを秒数で指定。既定値は4秒後。
数値の書式設定
INTERMediatorLib.toNumber( str );
引数の文字列を数値に変換する。なお、JavaScript標準のparseInt、parseFloatを使う方が良いと思われる。
IMLibFormat.numberFormat( str, digit );
引数strの文字列を数値に変換し、カンマ区切りで表示する。小数点以下の桁数をdigitで指定する。
日付時刻のデータから文字列を生成
INTERMediatorLib.dateTimeStringISO( dt );
引数のDateクラスの値を、ISO8601形式(2015-06-21 00:00:00)に変換する。引数を省略すると、現在の日付を得る。日時はブラウザのローカル時刻。
INTERMediatorLib.dateTimeStringFileMaker( dt );
引数のDateクラスの値を、FileMaker Serverが受け付ける形式(06/21/2015 00:00:00)に変換する。引数を省略すると、現在の日付を得る。日時はブラウザのローカル時刻。
INTERMediatorLib.dateStringISO( dt );
引数のDateクラスの値を、ISO8601形式(2015-06-21)に変換する。引数を省略すると、現在の日付を得る。日付はブラウザのローカル時刻。
INTERMediatorLib.dateStringFileMaker( dt );
引数のDateクラスの値を、FileMaker Serverが受け付ける形式(06/21/2015)に変換する。引数を省略すると、現在の日付を得る。日付はブラウザのローカル時刻。
INTERMediatorLib.timeString( dt );
引数のDateクラスの値を、時刻の形式(12:34:56)に変換する。引数を省略すると、現在の時刻を得る。時刻はブラウザのローカル時刻。
要素の値を更新する
IMLibUI.valueChange(idValue)
引数にINTER-Mediatorによって展開されたノードのid属性値を指定すると、現在の値をもってデータベース側に更新を行う。INTER-Mediatorによる自動更新をしない場合に利用するかもしれない。
- 注記:バージョン4.5でINTERMediator.valueChange(idValue)からIMLibUI.valueChange(idValue)に変更されました。
INTERMediatorOnPage.doBeforeValueChange = function(idValue)
INTERMediatorOnPageオブジェクトにdoBeforeValueChangeメソッドを実装することで、ユーザーが値を変更しバリデーションが通った直後で、データベース等への書き込みが行われる前にこのメソッドが実行される。あらゆる要素の変更時にこのメソッドを通過するようになる。引数は変更のあったUI要素のid属性が得られるので、これを手がかりにして、処理をしたい要素を判定できる。返り値は不要で無視される。
INTERMediatorOnPage.doAfterValueChange = function(idValue)
NTERMediatorOnPageオブジェクトにdoAfterValueChangeメソッドを実装することで、ユーザーが値を変更しバリデーションが通り、データベース等への書き込みが成功した後に、このメソッドが実行される。あらゆる要素の変更時にこのメソッドを通過するようになる。引数は変更のあったUI要素のid属性が得られるので、これを手がかりにして、処理をしたい要素を判定できる。返り値は不要で無視される。
IMLibUI.revertOnValidationError
このプロパティがtrueだと、バリデーションエラーがあった場合、フィールドの値を元に戻す。falseだと何もしない。既定値はtrue。
INTERMediatorクラスのプロパティ
INTERMediator.debugMode = true | false
デバッグモード(展開の過程をページの最初に表示)での実行を行う。IM_Entryの4つ目の引数でコントロールするのが手軽
INTERMediator.separator = '@'
リンク定義の区切り文字で、既定値は@
INTERMediator.defDivider = '|',
複数のリンク定義がある場合の区切り文字で、既定値は |
INTERMediator.defaultTargetInnerHTML = true
リンク設定のターゲット指定がない場合、既定値はテキストノードを作成して下位のノードとする。ここにtrueを指定すると、ターゲット指定がない場合にはinnerHTMLに代入する
INTERMediator.navigationLabel = ...
ナビゲーションのカスタマイズ(別項目で詳細を解説)
INTERMediator.titleAsLinkInfo = true;
titile属性の内容をリンク設定として解釈する。既定値はtrue
INTERMediator.classAsLinkInfo = false;
class属性にあるIM[ ] でかこった箇所をリンク設定として解釈する。既定値はtrue
バリデーション後に呼び出される関数
INTERMediatorOnPage.doAfterValidationSucceed = function(target,linkInfo){}
バリデーションの設定がされていて、ルールの結果がtrueとなった直後に呼び出される。引数targetは調べたノードへの参照、linkInfoは対照となったリンク定義の文字列が得られる
INTERMediatorOnPage.doAfterValidationFailure = function(target,linkInfo){}
バリデーションの設定がされていて、ルールの結果がfalseとなった直後に呼び出される。引数targetは調べたノードへの参照、linkInfoは対照となったリンク定義の文字列が得られる。テキストフィールドの値をもとにして計算処理をしている場合、間違えた値で再計算をしてしまっているかもしれないが、この関数は、元の値に戻された後に呼び出されるので、さらに再計算などを組み込むことができる。
レコード作成後及び削除後に呼び出される関数
INTERMediatorOnPage.doAfterCreateRecord = function(newRedId, targetName){}
レコード作成が成功した後に呼び出される。引数newRedIdには、作成したレコードのキーフィールドの値が設定され、targetNameにはコンテキストのname属性の値が設定されて呼び出される。
INTERMediatorOnPage.doAfterDeleteRecord = function(targetName){}
レコード作成が成功した後に呼び出される。引数targetNameにはコンテキストのname属性の値が設定されて呼び出される。
マスター/ディテール形式のユーザーインタフェース
IMLibPageNavigation.moveDetail(keying)
keyingには「手キーフィールド=値」の形式を指定する。マスター表示しているときにこのメソッドを呼び出すと、引数に指定したレコードに関する詳細表示に切り替わる。
IMLibPageNavigation.moveDetailOnceAgain()
画面更新をして現在のディテールページを表示する。事実上、ディテールのページが表示されているときに、そのページの更新を行う
マスター/ディテール形式のユーザーインタフェース処理前後
INTERMediatorOnPage.naviBeforeMoveToDetail(masterContext, detailContext)
マスター表示からディテール表示への切り替え前に呼び出される。引数はマスターおよびディテールのコンテキストオブジェクト。
INTERMediatorOnPage.naviAfterMoveToDetail(masterContext, detailContext)
マスター表示からディテール表示への切り替え後に呼び出される。引数はマスターおよびディテールのコンテキストオブジェクト。
INTERMediatorOnPage.navibeforeMoveToMaster(masterContext, detailContext)
ディテール表示からマスター表示への切り替え前に呼び出される。引数はマスターおよびディテールのコンテキストオブジェクト。
INTERMediatorOnPage.naviAfterMoveToMaster(masterContext, detailContext)
ディテール表示からマスター表示への切り替え後に呼び出される。引数はマスターおよびディテールのコンテキストオブジェクト。
IMLibUI.mobileSelectionColor
マスター/ディーテイル、あるいはステップ動作する場合、モバイルデバイス、あるいはfullnaviを付けたコンテキストにおいて、ホバーのフィードバックのための背景色。既定値は「#BBBBBB」。
独自にマスター/ディテール形式のユーザーインタフェースを作る場合
マスター/ディテール形式のユーザインタフェースを、navi-controlキーの指定で作るのではなく、それぞれ2つのページを用意して行き来をするよに作成することもできます。この時、一覧側の詳細ボタンをクリックするとINTERMediator.moveAnotherURL(ディテールページのURL?id=xxxx)を実行して、詳細ページに移動し、詳細ページ側ではURLからどのレコードかを求めて検索してレコードの内容を表示するということを行います。この時、INTERMediator.moveAnotherURLを実行する直前に、INTERMediator.prepareToScrollBackを実行します。また、一覧ページのINTERMediatorOnPage.doAfterConstructの関数内でINTERMediator.scrollBackを実行します。すると、詳細から一覧に戻ってきた時に、詳細でみていたレコードが表示され、その行はフラッシュするようになります。
INTERMediator.prepareToScrollBack(contextName, id)
引数には一覧表示のコンテキスト名と、クリックした行に対するキーの値を指定する。
INTERMediator.scrollBack(bias, scrollTarget)
biasの指定が必要なのは、表のヘッダ等をsticky表示にした場合、画面に残る見出し部分等の高さを負数で指定するような時で、スクロール結果がbias分調整される。scrollTargetはスクロール対象で、省略するとwindowとする。ページ内でoverflow: auto;とCSSを設定した要素をスクロールする場合は、その要素への参照を指定する。scrollTargetをfalseにするとスクロールはせず、行のフラッシュだけが行われる。
ステップ動作
INTERMediatorOnPage.《コンテキストで指定した名前》()
コンテキスト定義において、before-move-nextstepキーで指定した名前のメソッドをINTERMediatorOnPageオブジェクトに用意すると、ステップ移動時に呼び出される。このメソッドがない場合や、メソッドの返り値がnullの場合、コンテキスト定義の順序で次のステップに画面遷移する。次のステップが無い場合は、画面の遷移は行わない。このメソッドがfalseを返すと、前の画面に遷移する。コンテキスト名の文字列を返すと、そのコンテキストの画面を表示し、現在のコンテキストは表示しなくなる。
コンテキスト定義において、before-move-thisstepキーで指定した名前のメソッドは、ステップのコンテキストが合成された直後に呼び出される。after-leave-thisstepキーで指定した名前のメソッドは、次のステップが合成される直前に呼び出される。
IMLibPageNavigation.stepNavigation
ステップ動作で選択したそれぞれのセルが順番に入力された配列。最後の要素が、今表示されている画面での選択結果となる。要素は、key、contextの2つのプロパティを持つオブジェクトである。contextは、そのステップで利用されたコンテキストオブジェクト(IMLibContextクラス)を参照するので、選択したデータはもちろん、関連するフィールドや他のレコードを含めて参照できる。keyは、選択したレコードのキーで、「主キーフィールド名=主キー値」の形式を持つ。コンテキストのstoreプロパティで、keyの値をキーにすると、選択したレコードが取り出せる。
IMLibPageNavigation.getStepLastSelectedRecord()
現在のコンテキストで選択したレコードを得る。
IMLibPageNavigation.startStep()
navi-controlにstep-hideをもつ最初のコンテキストを表示する。ステップ動作のコンテキストを全てstep-hideで定義して、ボタン操作で最初のステップに移動したいような場合に利用する。
をするような場合に利用できるでしょう。IMLibPageNavigation.backToPreviousStep()
「戻る」ボタンと同等な処理を行う。なお、複数ステップを戻るには、このメソッドを必要回数指定する。
IMLibPageNavigation.moveNextStep(key)
セルをタップしたのと同じくステップを進める処理を行う。この時、引数keyが、IMLibPageNavigation.stepNavigationの要素のkeyプロパティに設定される。直後に、before-move-nextstepキーで指定した名前のメソッドが呼び出される。
認証に関連する情報
INTERMediatorOnPage.authCountLimit
認証を行うとき、失敗を許す回数。既定値は4。
INTERMediatorOnPage.authCount
認証を行うときに、ここまでに失敗した回数。
INTERMediatorOnPage.authUser
認証に使用されているユーザー名。
INTERMediatorOnPage.requireAuthentication
通信処理後、ユーザー認証が必要な場合にtrueが設定されている。
INTERMediatorOnPage.authStoring
認証情報のキャッシュスル場合で、cookie、sessionstrageなど。設定はサーバー側で行われている。
INTERMediatorOnPage.authExpired
認証情報のキャッシュ時間の秒数。設定はサーバー側で行われている。
INTERMediatorOnPage.isNativeAuth
データベースのアカウントによって認証を行うネイティブ認証を行なっていればtrue。設定はサーバー側で行われている。
INTERMediatorOnPage.realm
認証のレルム。同一レルムのページは、認証のキャッシュ情報を共有できる。設定はサーバー側で行われている。
INTERMediatorOnPage.isShowChangePassword
ログインパネルにパスワード変更のためのテキストフィールドを追加し、パスワード変更機能を追加する。既定値はtrue。
INTERMediatorOnPage.isSetDefaultStyle
認証パネルにおいて、スタイルの設定を古いバージョンと同じにする。既定値はfalseで、既にこのプロパティはtrueにする理由はない。もし、認証パネルのスタイルを変更したい場合は、テーマの修正をするのが適切である。
INTERMediatorOnPage.authPanelTitle
認証パネルのタイトルを文字列で指定する。既定値のnullの場合、タイトルには、realmの文字列が設定される。
INTERMediatorOnPage.isOAuthAvailable
OAuthによる認証を行なっている場合にはtrueになる。既定値はfalse。
INTERMediatorOnPage.isLDAP
LDAP認証が設定されている場合にtrueになる。既定値はnull。
INTERMediatorOnPage.passwordPolicy
サーバー側の設定で定めたパスワードポリシーの定義文字列。
INTERMediatorOnPage.isEmailAsUsername
認証時のユーザー名にメールアドレスが使えるかどうかを示す論理値。
INTERMediatorOnPage.doAfterLoginPanel
ログインパネル表示直後に呼び出される関数をsetteidekiru.
エラーメッセージ、デバッグメッセージ
INTERMediator.setDebugMessage(message, level)
でバッグメッセージを設定する。引数messageが実際のメッセージで、levelはそのレベル。定義ファイルでのIM_Entry関数の4つ目の引数の数値より低いレベルのデバッグメッセージが画面あるいはコンソールに表示される。
INTERMediator.setErrorMessage(ex, moreMessage)
単にエラーメッセージを表示するだけなら第1引数に文字列を指定するだけでよい。フレームワーク内では、exに文字列ないしはExceptionクラスのオブジェクト、第2引数に付加的なメッセージを設定している。ex自身もしくはmessageプロパティに、moreMessageが追加されてエラーメッセージとなる。
INTERMediator.flushMessage()
エラーメッセージやデバッグメッセージを表示する
INTERMediatorLog.errorMessageByAlert
trueにするとエラーメッセージが登録されるとき、その内容をダイアログボックスで表示する。既定値はfalse。
INTERMediatorLog.errorMessageOnAlert
エラ〜メッセージをダイアログボックスで表示するとき、このプロパティに文字列を与えると、システム側からのメッセージは無視して、その文字列のみを表示する。既定値のnullのままだと、setErrorMessageの引数がダイアログボックスに表示される。
INTERMediatorLog.suppressDebugMessageOnPageデバッグログを表示した場合でも、デバッグログをページ上に表示することはしないで、コンソールのみにデバッグ情報を表示する。
INTERMediatorLog.suppressErrorMessageOnPage
エラーログを表示した場合でも、エラーログをページ上に表示することはしないで、コンソールのみにエラー情報を表示する。
INTERMediatorLog.warningMessagePrevent
警告メッセージは通常はダイアログボックスで表示するが、このプロパティにtrueを設定すると、警告メッセージのダイアログ表示は行わない。つまり、警告メッセージは無視される。データベースエラーを中心に警告メッセージが表示されるが、十分デバッグすれば無視もありうる。また、input[type=date]では、データのキー入力途中に更新しようとして警告メッセージが出る場合もあり、その場合の対処はこのプロパティをtrueにすることである。
ローカルコンテキスト
IMLibLocalContext.clearAll()
ローカルコンテキストのオブジェクトを初期化して、記録された内容をクリアする
IMLibLocalContext.setValue(key, value)
指定したキーで値を保存する
IMLibLocalContext.getValue(key)
指定したキーの値を取り出す
IMLibLocalContext.archive()
ローカルコンテキストの内容をセッションストレージ(またはクッキー)に記録する
IMLibLocalContext.unarchive()
セッションストレージ(またはクッキー)に記録したデータからローカルコンテキストを復元する
IMLibLocalContext.update(idValue)
引数に指定したid属性値のノードがローカルコンテキストにバインドされていれば、その要素の値をコンテキストに反映させる。通常はchangeイベントで自動的にコンテキストに値が設定されるが、changeイベント以外での動作時に利用する必要が出る
INTERMediator.useSessionStorage
ローカルコンテキストをセッションストレージに保持する。既定値はtrue。
コンテキストオブジェクト
IMLibContextクラスのオブジェクトに対するメソッドは以下の通りです。通常は、new IMLibContext(contextName)で生成された結果を使っています。《IMLibContext》は、IMLibContextクラスのインスタンスを示します。
コンテキストごとに生成されるオブジェクト
《IMLibContext》.contextName
コンテキスト名
《IMLibContext》.enclosureNode
エンクロージャーの要素への参照
《IMLibContext》.repeaterNodes
リピーターの初期状態で、ドキュメントツリー外に複製して取ってあるもの。値はノードの配列。
《IMLibContext》.store
コンテキストが保持するデータベースの値。このオブジェクトのプロパティは、keyフィールードが「id」とすれば、id=3、id=420のように、「主キーフィールド名=値」の文字列。その文字列のプロパティはさらにオブジェクトとなっていて、そのオブジェクトのプロパティはフィールド名。そのフィールド名のプロパティに対する値がデータベースに記録された値。FileMaker Serverで、relationキーのportalがtrueの場合、その値がさらにオブジェクトとなっており、プロパティはリレーションシップの関連キーの値である。なお、この値は更新しても、データベースへの更新は自動的には行われない。
《IMLibContext》.setValue(recKey, key, value, nodeId, target)
コンテキストに値valueを設定する。キーとしてはrecKey(id=34、つまり主キーとイコール、その値を合成した文字列)およびkey(フィールド名)を指定する。最初は要素のid属性値nodeIdを伴ってい指定され、id属性値とターゲット指定targetで決定されるページ内のノードと、データベースの値の対応関係を記録する。nodeIdを省略すると、値を保存すると同時に、他のコンテキストの同じテーブルの同じレコードの同じフィールドとバインドしている値も更新し、要素に表示する値も更新する。
INTERMediatorOnPage.updateProcessedNode
このプロパティは既定値がfalseで、その場合、すでにバインドされたノードに再度値を設定する事はしない。trueに設定すれば、Widgetでなければ値の設定をバインドが終わったノードに対しても行う。
《IMLibContext》.getValue(recKey, key)
2種類のキーを指定して値を取り出す。最初のキーは、「主キーフィールド名=値」の文字列、次のキーはフィールド名。つまり、storeプロパティへのアクセッサーメソッド。なお、keyに "_im_buttom_master_id" を指定すると、「詳細」ボタンの要素に設定されているid属性値を得られるので、プログラムでクリック操作をしたい時には利用できる。
《IMLibContext》.getContextInfo(nodeId, target)
要素のid属性値とターゲットから、コンテキスト情報({context: this, record: recKey, field: key}形式のオブジェクト)を得る。コンテキスト名とフィールド名だけのターゲットの場合は、"" を指定する
《IMLibContext》.getContextValue(nodeId, target)
要素のid属性値とターゲットから、コンテキストでの値を得る
《IMLibContext》.setDataAtLastRecord(key, value)
コンテキストの最後のレコードのkeyで指定したフィールドに、valueの値を設定し、データベースへの更新を行う。
《IMLibContext》.setDataWithKey(pkValue, key, value)
コンテキストにあるレコードをpkValueで指定して、そのレコードにあるkeyで指定したフィールドに、valueの値を設定し、データベースへの更新を行う。レコードの指定はフィールドの値のみで行う。
コンテキストを管理するIMLibContextPool
IMLibContextPool.poolingContexts
IMLibContextPoolは複数のコンテキストを管理するオブジェクト。このプロパティは配列で、管理しているそれぞれのIMLibContextクラスのオブジェクトが要素として記録されている
IMLibContextPool.getContextInfoFromId(idValue, target)
要素のid属性値とターゲットから、コンテキスト情報({context: this, record: recKey, field: key}形式のオブジェクト)を得る。コンテキストをまたいで検索する
IMLibContextPool.updateContext(idValue, target)
id属性値とターゲットで示す要素の現在の値を、対応するコンテキストに書き込む
IMLibContextPool.contextFromEnclosureId(idValue)
指定したid属性を持つ要素がエンクロージャーのコンテキストオブジェクトを返す
IMLibContextPool.contextFromName(cName)
コンテキスト名からコンテキストを返すが、最初のコンテキストオブジェクトのみが返される
IMLibContextPool.getContextFromName(cName)
コンテキスト名からコンテキストを返すが、引数のコンテキスト名を持つすべてのコンテキストオブジェクトを含む配列が返される
イベント対応
IMLibMouseEventDispatch.setExecute(idValue, exec)
指定したid属性値の要素に対してclickイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibMouseEventDispatch.setTargetExecute(targetValue, exec)
指定したターゲット指定の要素に対してclickイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibKeyDownEventDispatch.setExecute(idValue, charCode, exec)
指定したid属性値の要素に対して、charCodeのキーを押したことによるkeydonwイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibKeyUpEventDispatch.setExecute(idValue, charCode, exec)
指定したid属性値の要素に対して、charCodeのキーを離したことによるkeyupイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibChangeEventDispatch.setExecute(idValue, exec)
指定したid属性値の要素に対してchangeイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibChangeEventDispatch.setTargetExecute(targetValue, exec)
指定したターゲット指定の要素に対してchangeイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibBlurEventDispatch.setExecute(idValue, exec)
指定したid属性値の要素に対してblurイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibBlurEventDispatch.setTargetExecute(targetValue, exec)
指定したターゲット指定の要素に対してblurイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibInputEventDispatch.setExecute(idValue, exec)
指定したid属性値の要素に対してinputイベントが発生したときにexecに指定した関数が実行されるようにする
IMLibInputEventDispatch.setTargetExecute(targetValue, exec)
指定したターゲット指定の要素に対してinputイベントが発生したときにexecに指定した関数が実行されるようにする
クライアントからの直接的なデータベース処理
INTER-Mediatorは、INPUT、SELECT、TEXTAREAタグ要素を編集してフォーカスを離れる時(つまり、onchangeイベントを受けて)、自動的にデータを書き戻すようにしています。しかしながら、データベースの読み書きの処理はこれだけでは足りないと思われます。たとえば、DIVタグ要素をドラッグできるようにして、ドラッグ先の座標をデータベースに書き戻すようなことをしたいと思うかもしれません。その場合、イベント処理関数で、ノードの属性やスタイルの値を取り出して、データベース処理を自前でやりたくなります。そのために、以下のように、CRUDに対応した4つの関数およびレコードコピーのための関数を用意してあります。
以下のメソッドはいずれも、ネットワーク処理を非同期で行います。通信のためのパラメータは、argsに指定します。それぞれ、直前に示した、同期通信の対応するAPIと同じように、argsを指定します。successProcとfailProcはそれぞれ、通信が成功した時、エラーが発生した時に呼び出されるメソッドを指定します。何もしないなら、nullを指定します。通信処理は非同期で実行されるため、これらのメソッドの直後にステートメントは、通常は通信終了前に実施されるでしょう。原則として、このメソッド以降はプログラムを何も書かない、つまり、一連の処理がこのメソッドの呼出で終わるように記述する必要があります。これらのメソッドは認証が必要な場合でも、不要な場合でも利用されます。認証が必要な場合、認証が失敗すると、繰り返しログインパネルが表示する仕組みも組み込んであります。
INTERMediator_DBAdapter.db_query_async(args, successProc, failProc)
データベースからの取り出しを行います。関数の返り値は1レコードがオブジェクトとなった配列です。args引数には以下のキーを利用したオブジェクトを指定します。
属性 | 指定する値 |
---|---|
name | 定義ファイルのIM_Entry関数の第1引数に指定する配列のname属性の値 |
records | 取り出すレコードの数(レコード数の上限) |
fields | 取り出すフィールドの名前の配列(現在はすべて*でアクセスしており無視される) |
parentkeyvalue | 外部キーフィールドの値 |
conditions | {field:xx, operator:xx, value:xx} の形式のオブジェクトの配列。検索条件をANDで追加する |
useoffset | trueならオフセットの値を利用する。falseなら利用しない |
INTERMediator_DBAdapter.db_update_async(args, successProc, failProc)
データベースのレコードの更新を行います。args引数には以下のキーを利用したオブジェクトを指定します。
属性 | 指定する値 |
---|---|
name | 定義ファイルのIM_Entry関数の第1引数に指定する配列のname属性の値 |
conditions | {field:xx, operator:xx, value:xx} の形式のオブジェクトの配列。検索条件をANDで追加する |
dataset | {field:xx, value:xx}の形式のオブジェクトの配列。設定するフィールドとその値を指定する |
INTERMediator_DBAdapter.db_delete_async(args, successProc, failProc)
データベースのレコード削除を行います。args引数には以下のキーを利用したオブジェクトを指定します。
属性 | 指定する値 |
---|---|
name | 定義ファイルのIM_Entry関数の第1引数に指定する配列のname属性の値 |
conditions | {field:xx, operator:xx, value:xx} の形式のオブジェクトの配列。検索条件をANDで追加する |
INTERMediator_DBAdapter.db_createRecord_async(args, successProc, failProc)
データベースに新しいレコードを作成します。関数の返り値は、作成したレコードのキーフィールドの値です。args引数には以下のキーを利用したオブジェクトを指定します。
属性 | 指定する値 |
---|---|
name | 定義ファイルのIM_Entry関数の第1引数に指定する配列のname属性の値 |
dataset | {field:xx, value:xx} の形式のオブジェクトの配列。新しいレコードに対して指定フィールドに値を設定する |
INTERMediator_DBAdapter.db_copy_async(args, successProc, failProc)
指定したレコードを複製します。関数の返り値は、作成したレコードのキーフィールドの値です。args引数には以下のキーを利用したオブジェクトを指定します。
属性 | 指定する値 |
---|---|
name | 定義ファイルのIM_Entry関数の第1引数に指定する配列のname属性の値 |
conditions | {field:xx, operator:xx, value:xx} の形式のオブジェクトの配列。検索条件をANDで追加する |
conditions | {name: xxx, field:xx, value:xx} の形式のオブジェクトの配列。nameは関連テーブルのコンテキスト名、外部キーフィールド、そして、親レコードを特定する「キーフィールド名=キーの値」形式の文字列をそれぞれ指定します。 |
通信が失敗した時に呼び出されるfailProcの関数は引数がありません。成功した時に呼び出されるメソッドは、引数が1つあり、通信結果を含むオブジェクトを引数で得られます。そのオブジェクトは、以下のプロパティを持っています。このsuccessProcに、通信結果をもとにした処理を記述することが可能です。
プロパティ | 内容 |
---|---|
dbresult | 検索結果あるいは処理したレコードを示すオブジェクトの配列 |
resultCount | 検索あるいは処理したレコード数 |
totalCount | 現在の検索条件で得られる総レコード数 |
newRecordKeyValue | 新しいレコードを作ったり複製をした時、新しいレコードのキーフィールドの値 |
newPasswordResult | パスワードの変更が成功したかどうかを示す論理値 |
registeredId | クライアント間連携で利用する登録ID |
nullAcceptable | フィールドの値にnullが許可されているかどうか |
INTERMediator_DBAdapter.db_query(args)
INTERMediator_DBAdapter.db_queryWithAuth(args, completion)
INTERMediator_DBAdapter.db_update(args)
INTERMediator_DBAdapter.db_updateWithAuth(args, completion)
INTERMediator_DBAdapter.db_delete(args)
INTERMediator_DBAdapter.db_deleteWithAuth(args, completion)
INTERMediator_DBAdapter.db_createRecord(args)
INTERMediator_DBAdapter.db_createRecordWithAuth(args, completion)
上記の関数は、Ver.5までに搭載されていた同期通信でクライアントからサーバーに対してデータベース処理が可能なものです。Ver.6では利用できなくなっています。非同期の近い名前の関数から、引数を調べてください。
INTERMediator.ignoreOptimisticLocking
trueの場合データベース更新時に楽観的ロック(ページ構築時から値が変化していないかを検出)の処理を行わない。既定値はfalse。
INTERMediatorOnPage.newRecordId
直前に行ったデータベース処理がレコード作成の場合、作成したレコードのキーフィールドの値が設定されている。
キューへのタスク投入
IMLibQueue.setTask(function(completeTask){...}, execSoon, later)
INTER-Mediator内部での更新処理のためのサーバーへの通信は、全てキューに投入して処理されます。これにより、更新処理が複数同時に稼働してしまう問題を避けることができます。独自にJavaScriptでプログラムを組む時、非同期通信を上記のメソッドで実装する場合、通信処理自体をこのメソッドでキューへ登録するのが確実です。引数の関数の処理ブロック内で、非同期通信処理を呼び出します。なお、関数の引数はキューを終了することを示すためのクロージャーが設定されて呼び出されます。通信処理後などに「completeTask()」のように呼び出しを記述する必要があります。これが呼び出されないと、次のキューの処理に移行しません。execSoonはtrueにするとキューに投入せずすぐに実行します。laterをtrueにすると、優先度の低いキュートなり、実行前に100msの時間を確保します。最後の2つの引数は省略可能で、省略時はそれぞれfalseになります。
例えば、あるボタンを押して、データベース処理をした後、location.hrefにURLを代入して別のページに移動したいとします。そのとき、単に、コンテキストにあるsetDataAtLastRecordメソッドを使って直後にlocation.hrefへの代入を行うと、このメソッド内のデータベース更新の通信が非同期で行われ、通信処理が完了する前にページが遷移し、データベース処理がキャンセルされてしまう可能性があります。その場合、以下のように、データベース更新処理の後にタスクを定義します。なお、setDataAtLastRecordメソッドは内部でsetTaskメソッドを呼び出しており、キューを利用しています。最後のキューによりmove関数が登録されますが、その中でキューがなくなるまで待つという処理を行います。こうすれば、データベース処理が完了した後にlocation.hrefへの代入が行われます。move関数は自身を内部で呼び出しているので無限ループの可能性がありますが、ここでは短時間でデータベース処理は完了することを想定しています。
function clickAnyButton() {
const context = IMLibContextPool.contextName('test') // コンテキストを確保
context.setDataAtLastRecord('field1', 0) // コンテキストの最後のレコードを更新
context.setDataAtLastRecord('field2', -1) // コンテキストの最後のレコードを更新
IMLibQueue.setTask(moving) // キューが処理を終えるまで待つ処理を登録
}
function moving(complete) {
if (IMLibQueue.tasks.length <= 1) {
location.href = 'https://moving.to.this.url.site/all_right'
} else {
IMLibQueue.setTask(moving, false, true)
}
complete()
}
クライアント同期処理のカスタマイズ
INTERMediatorOnPage.syncBeforeUpdate = (d) => {}
INTERMediatorOnPage.syncAfterUpdate = (d) => {}
INTERMediatorOnPage.syncBeforeCreate = (d) => {}
INTERMediatorOnPage.syncAfterCreate = (d) => {}
INTERMediatorOnPage.syncBeforeDelete = (d) => {}
INTERMediatorOnPage.syncAfterDelete = (d) => {}
クライアント同期が設定されているページにおいて、変更処理が同期された側で、それぞれの変更処理が行われる前後に呼び出されるメソッドを定義できます。Beforeが名前に含まれているメソッドでは、返り値を設定でき、引き続き処理する場合はtrue、処理をキャンセルする場合はfalseを返します。引数dは、同期情報に関するオブジェクト(例:{entity: "item", field: ["product_unitprice"], 'justnotify: false, pkvalue: ["3"], value: ["30"]})が設定されて呼び出されます。