入力フィルタ

最終更新日: 2021年12月15日
R8 | R9

定義方法

入力フィルタ処理をスクリプトコードとして記述することができます。

図1 スクリプト記述欄

ここに書いた処理は、入力値からWagby内部のプレゼンテーションモデルを作成するに実行されます。

Designerでスクリプトを修正すると、開発機上のアプリケーションへ即座に反映されます。ビルド処理なしで修正を確認することができます。

[例] 入力値を補完する

WagbyではWebフォームから入力された値は「プレゼンテーションモデル」が管理しています。

スクリプト内では${モデル名_p}という表記で扱います。すべての値は文字列型になっています。

プレゼンテーションモデルの操作では、項目名の末尾に ".content" を付与することで、入力文字列を取得することができます。

次の例は、モデルID customer の電子メール項目 email の入力値に "@" が含まれていない場合、@以下を補完するというスクリプトです。操作はすべてプレゼンテーションモデルである customer_p に対して行います。

var email = (customer_p.email != null) ? customer_p.email.content : null;
if (email != null && email != "" && email.indexOf("@") < 0) {
    email = email + "@jasminesoft.co.jp";
    customer_p.email.content = email;
}

[例] 文字列拡張検索の標準を OR 検索とする

Wagbyの文字列拡張検索は標準では AND 検索です。これを「空白区切りで検索条件が入力されたら、OR 検索を標準とする」ように変更するスクリプトを紹介します。モデルIDはcustomerとし、対象項目をnameとしています。

このスクリプトは「入力フィルタ(検索)」に記述します。

var cname = (customer_cp.name != null) ? customer_cp.name.content : null;
if (cname != null && cname != "" && cname.indexOf(" ") >= 0 && cname.indexOf("OR ") != 0) {
    cname = "OR " + cname;
    customer_cp.name.content = cname;
}

検索条件項目 name に空白を含む値が入力されていて、かつ、先頭が"OR "で開始されていない場合、これを付与するようにしています。

Webフォームから入力された検索値は「コンディションのプレゼンテーションモデル」が管理しています。 スクリプト内ではモデル名_cpという表記で扱います。すべての値は文字列型になっています。

独自のフィルタを定義する8.5.5

設定方法

「環境 > スクリプト > 実行タイミング」に用意された「ユーザ定義入力フィルタ1」から「ユーザ定義入力フィルタ10」にスクリプトを用意することができます。

図2 ユーザ定義入力フィルタ スクリプト記述欄

上記スクリプトを利用する場合、モデル項目詳細定義ダイアログの「入力制御>入力フィルタの選択」に用意された「ユーザ定義入力フィルタ1」から「ユーザ定義入力フィルタ10」を選択してください。

図3 ユーザ定義入力フィルタを利用する

スクリプトの書き方

このフィルタのスクリプトでは暗黙変数 s が使えます。s は入力文字列です。この s を何らかのルールで変更します。return で必ず文字列を返すようにしてください。

なお、このスクリプトでは s 以外の値を操作することは許容していません。(例えばこのスクリプトでモデルの値を書き換えたり、データベースを操作することはできません。)

例1 入力文字列を小文字にする

return s.toLowerCase();

例2 Wagbyの既存のフィルタを使う

暗黙変数 filterlistMap が利用できます。取得したフィルタは、".filter(s)" で変換します。

var commonfilter = filterlistMap.get("commonfilter");
return commonfilter.filter(s);

引数は次の通りです。

フィルタ名 filterlistMapで指定する名前
文字列(一般) commonfilter
文字列(最小限) minimalfilter
日付型 datefilter
数字型 intfilter
半角->全角 h2zfilter
半角->全角(カナのみ) kanafilter
半角->全角(空白を含む) h2zspacefilter
全角->半角 z2hfilter
全角->半角(空白を含む) z2hspacefilter

例3 Wagbyの既存のフィルタを使う (2)

ここでは「文字列(最小限)」と同じ内容を filterlistMap から取得するのではなく、開発者自身で作成した例を示します。

var CRLFFilter = Java.type("jp.jasminesoft.util.StringCRLFFilter");
var DecodeXMLCharFilter = Java.type("jp.jasminesoft.util.StringDecodeXMLCharFilter");
var minimalfilter = new CRLFFilter(new DecodeXMLCharFilter());
return minimalfilter.filter(s);

どのような既存フィルタクラスがあるかは、自動生成されたファイル
wagbydesigner/webapps/wagbydesigner/WEB-INF/env/work/srcgen/jp/jasminesoft/wagby/app/JFCFilterManager.java
を参考にしてください。

ユーザ定義フィルタの合成

ユーザ定義入力フィルタ1は filter1 という関数と対応します。同様に、ユーザ定義入力フィルタ2は filter2 という関数と対応します。

例えば filter1 は次の通りとします。

var CRLFFilter = Java.type("jp.jasminesoft.util.StringCRLFFilter");
var DecodeXMLCharFilter = Java.type("jp.jasminesoft.util.StringDecodeXMLCharFilter");
var minimalfilter = new CRLFFilter(new DecodeXMLCharFilter());
return minimalfilter.filter(s);

次に filter2 を次のようにした、とします。

return s.toLowerCase();

このとき、filter3 を次のように記述することができます。

return filter2(filter1(s));

生成されるスクリプト

Designerの「環境 > スクリプト > 実行タイミング」を変更すると
wagbyapp/webapps/wagby/WEB-INF/script/__filter.js
が作成されます。

パフォーマンス

ビルドした wagbyapp アプリケーションは、画面操作のつど __filter.js をチェックします。ファイルの日付チェックでファイルが新しくなった場合はこれを再読み込みします。よって常に日付チェック処理が行われます。

本番環境で、このチェック処理を抑制することができます。[詳細...]