11 Webフォーム・ルールの使用
Oracle Business Process Composerを使用してWebフォーム内でフォーム・ルールを作成および編集できます。フォーム・ルールは、ユーザーとWebフォームとの相互作用を定義するJava-scriptコードです。Webフォーム・ルールを使用するには、JavaScriptの基本を理解している必要があります。
11.1 フォーム・ルールの概要
フォーム・ルールは、Webフォーム・コントロールの表示方法やユーザーが入力できるデータのタイプを定義することで、ユーザーとWebフォームとの相互作用を定義するサーバー・サイドJavaScriptコードです。
フォーム・ルールを作成して、Webフォームの動作を定義できます。一般に、フォーム・ルールは次の場合に使用します。
-
要素の表示/非表示、有効/無効の切替えなど、Webフォームへの動的動作の追加。
たとえば、他のフォーム・コントロールの状態に基づいて、特定のフォーム・コントロールまたはセクション全体の表示/非表示を切り替えるフォーム・ルールを追加できます。コンテキストに応じた方法でフォーム・フィールドを表示すると、混乱が少なくなり、ユーザーがフォームに移動しやすくなります。
-
複雑な計算の実行。
たとえば、アイテム数量と価格など、他のフォーム・フィールドの値から発注フォームの請求書価格合計を計算できます。
-
複雑な検証の実行。
-
動的なドロップダウン・リストの移入。
次の項では、フォーム・ルールに含まれるJavascriptの基本機能について説明します。フォーム・ルールの特定のユース・ケースについては、「Webフォーム・ルールの例」を参照してください。
11.1.1 フォーム・ルールのJavascript構文
Oracle Business Process Management (Oracle BPM)では、フォーム・ルールはJavaScriptコードで表されます。BPMプロジェクトを保存すると、フォーム・ルールが保存され、実行できるようになります。
通常、フォーム・ルールには次のフォームがあります。
if (condition) { true actions; } else { false actions; }
主に繰返しアイテムをループ処理する目的で高度なフォーム・ルールを作成できます。フォーム・ルールを作成するときに認識する必要があるJavaScriptの基本的な特徴を次に示します。
-
大/小文字の区別: JavaScriptコマンドでは大文字と小文字が区別されます。
たとえば、var color1とvar Color1は2つの異なる変数です。
-
緩いタイプ指定の変数: JavaScript変数のタイプは緩く指定されます。
変数のタイプは明示的に宣言する必要はありません。たとえば、var color = 'red';およびvar num = 33と指定すると、変数colorは文字列タイプ、numは数値タイプになります。
-
行末のセミコロン: 行末のセミコロンは省略可能です。
ただし、コーディングの際にはセミコロンを使用して行を終了することをお薦めします。多くの場合、これにより間違いを防ぐことができます。
-
コメント: コードにコメントを追加するには、//または/* */構文を使用します。
Oracle BPMでは次のJavascript構文はサポートされていません。
-
switch statement
さらに、Oracle BPMではいくつかの制限付きで次の構文がサポートされています。
-
try-catch
たとえば、次の例では、xという名前のJavaScript変数がこのフォーム・ルールでは定義されていないため、FNという名前のコントロールの値は'got exception'に設定されます。
if (form.load) { try { x.randomproperty = 'blah'; } catch (e) { FN.value = 'got exception'; } }
ただし、フォーム・コントロールが未定義の場合の例外の捕捉はサポートされていないため、予期しない動作が発生する可能性があります。これは、JavaScriptインタープリタでエラーが捕捉される前に、フォーム・ルールの解析中にOracle BPMで問題が捕捉されるためです。
次の例では、Colorという名前のコントロールはフォームに存在しません。
if (form.load) { try { Color.value = "red"; } catch(e) { msg1.value = "error caught: " + e; } }
11.1.1.1 コントロール名
多くの場合、フォーム・ルールはフォーム・コントロールを参照する必要があります。コントロールのnameプロパティを使用して、コントロールに名前を割り当てる必要があります。
名前は大文字と小文字が区別されます。コントロールがFirstNameという名前の場合、フォーム・ルールをFirstName.value
として作成する必要があります。firstname.value
は機能しません。
フォーム・ルールでコントロールを使用する場合、コントロールが一意の名前になっていることを確認する必要があります。複数のコントロールの名前が同じ場合、ランタイム環境では、フォーム・ルールが参照するコントロールを特定できません。通常、パレットからフォームに追加されたフォーム・コントロールには必ず一意の名前が付けられます。フォームにすでに存在するコントロールの名前に変更することは、Webフォーム・エディタでは許可されません。
ただし、次のような状況では、同じ名前の複数のコントロールを使用できます。
-
XSDデータ・ソースから追加されたコントロール
-
カスタム・パレットから追加されたコントロール
-
セクションにネストされたコントロール
同じラベルの2つのコントロールが同じレベルにある場合、コントロール名は自動的に一意になります。一意にならないように名前を編集しようとしても、Webフォーム・デザイナでは変更できません。
コントロールがセクション・コントロール内にドロップされた場合、セクションの外側にドロップされたコントロールとは別のネスト・レベルとなります。また、セクション内とセクション外の2つのコントロールのネスト・レベルも異なります。Webフォーム・デザイナでは、このようなコントロールには同じ名前を指定できます。
一意でない名前のコントロールがフォーム・ルールで使用された場合、予期しない結果が生じることがあります。フォームでエラーが発生した場合、一意になるようにコントロール名を編集できます。
ノート:
フォームの名前を編集しても、xsdスキーマ・コントロールは、フォームの発行時またはxml検証時に作成されたxmlインスタンス・ドキュメントには影響しません。
11.1.1.2 フォーム・ルール識別子
フォーム・ルールは名前プロパティを使用してフォーム・コントロールを参照します。コントロールの名前プロパティがMyControl
と定義されている場合、この名前を識別子として使用して、フォーム・ルール内でこのコントロールのプロパティを参照できます。
フォーム・ルール識別子は、必ず次の形式である必要があります。
Name.<property>
次のフォーム・ルール識別子がサポートされています。
-
visible: コントロールを非表示にする場合はfalse、コントロールを表示する場合はtrueに設定します。
-
value: コントロールの値を読み取るか設定します。
このプロパティは、セクション、タブ、またはユーザーに対して表示される値がないその他のコントロールに対しては無効です。
-
enabled: ユーザーが値を変更できないようにコントロールを無効にする場合はfalse、コントロールを有効にする場合はtrueに設定します。
これは、セクションとタブに対しては無効です。
-
expanded: グループ・コントロール(セクション・コントロールのみ)を閉じる場合はfalse、グループ・コントロールを開く場合はtrueに設定します。
-
selected: タブを選択されたタブとして指定する場合はtrueに設定します。(タブ・コントロールのみ)。
-
valid: コントロールに有効な値が含まれる場合、このプロパティの値はtrueです。それ以外の場合、値はfalseです。
妥当性はコントロールのタイプに基づきます。たとえば、数値に変換できない文字列値をユーザーが入力した場合、数値コントロールは無効です。このプロパティは設定および読み取ることができます。
-
required: コントロールを必須にし、赤いアスタリスクを表示する場合はtrueに設定します。
このプロパティは、パレット・コントロールにのみ影響し、XSDスキーマ・データ・ソースから生成されたコントロールには影響しません。
このプロパティは、セクション・コントロールに対しても有効です。セクションrequiredをfalseに設定すると、すべての内部コントロールがnot requiredに自動的に設定されます。
-
options: 選択コントロール・オプションを動的に設定できます(ラジオ、ドロップダウンおよびチェック・ボックス・コントロールのみ)。
-
label: セクションなどのコントロールに表示されるラベルを設定します。
-
help: ヘルプ・テキストを設定します。
-
hint: カーソルを置くと表示されるヒントを設定します。
-
status: コントロールの値が無効な場合に表示されるエラー・メッセージを設定します。
-
clicked: トリガー・コントロールで使用されます。初期状態はfalseです。
ユーザーがトリガーをクリックすると、状態がtrueになります。
-
printable: 印刷可能なビューとPDF提出文書の両方からコントロールを削除する場合は、falseに設定します。
-
itemAdded: 繰返しコントロールで使用されます。初期状態はfalseです。
ユーザーが「+」をクリックして繰返しアイテムを追加し、フォームのロード時にドキュメントURIを介して繰返しアイテムが追加されると、状態がtrueになります。
-
itemRemoved: 繰返しコントロールで使用されます。初期状態はfalseです。
ユーザーが「-」をクリックして繰返しアイテムを削除すると、状態がtrueになります。
-
itemIndex: 繰返しコントロールで使用されます。
itemAddedまたはitemRemovedイベントが起動されると、itemIndexの値が設定されます。itemRemovedイベントの場合、itemIndexは-1を返します。itemAddedイベントの場合、itemIndexは、追加されたアイテムの索引を返します。
-
form.load: フォームが初めてロードされる場合、このプロパティはtrueです。
ユーザーがフォームとの相互作用を開始する前に設定する必要があるデフォルト値をフォーム・ルールによって設定する場合に便利です。
-
form.unload: ユーザーがフォームの送信ボタンをクリックすると、このプロパティはtrueになります。
フォームのドキュメント・アクションおよびフォーム・アクションを実行する直前にコントロール値を設定する場合に便利です。
フォーム・ルールで使用される識別子の例を次に示します。
-
FirstName.value
-
BillingAddress.visible
-
Email[1].value
-
Email[i].visible
後の2つは繰返しコントロールの例です。繰返しコントロールについては、後で詳しく説明します。プロパティの大/小文字は重要です。FirstName.value
は有効なフォーム・ルール識別子ですが、FirstName.Value
とFirstName.vAlUe
は無効です。
11.1.1.3 文字列と数値
JavaScriptはタイプが緩く指定された言語であるため、フィールド値を加算する必要があるときに、フォーム・ルールによって文字列の連結が実行されることがあります。文字列操作ではなく、算術計算を実行するようフォーム・ルールに指示するには、様々な方法があります。簡単な方法としては、変数に*1を追加します。id = id*1 + 1;
と指定すれば、idは現在の値に1を付加した値ではなく、現在の値に1を加算した値になります。たとえば、現在の値が4であり、id*1と記述しなかった場合、結果は5ではなく41になります。
フォーム・ルールでは、通貨コントロールによって加算ではなく文字列連結が実行される場合があります。この問題を修正するには、次のようにします。
-
フォーム・ルールを含むフォームをデザイナで開き、通貨コントロールをテキスト・コントロールに変更して、フォームを保存します。
-
フォームを開き、テキスト・コントロールを通貨コントロールに戻してから、フォームを再び保存します。
11.1.1.4 日付と時間
日付コントロールを初期化するには、データが正しい書式である必要があります。
正しい日付書式の例は次のとおりです。
-
d1.value = "2012-01-13"; //yyyy-mm-dd
-
d2.value = "01-13-2014"; //mm-dd-yyyy
-
d3.value = "jan 13 2014"; //using string for month
通常、日付、時間(時刻)および日付/時間のリテラルをルールに記述する際に、ブラウザのロケールまたはサーバーのロケールに依存することはお薦めしません。
日付および時間のルールの例は次のとおりです。
if (form.load) { date.value = "2014-02-29"; timeofday.value = "13:10:02"; datetime.value = "2014-02-29T18:10:02Z";
このルールでは、フォーム内の日付コントロールは02-29-2014、時間コントロールは1:10 PM、日付/時間コントロールの日付部分は02-29-2014、時間部分は1:10 PMで初期化されます。
日付/時間値の末尾にある特殊文字"Z"に注目してください。これはUTC-00:00のオフセットに相当し、18:10:02という時間がUTCで返されることを示します。18:10:02 UTCは、東部標準時の1:10 PMと同じです。
時間および日付/時間コントロールを使用するには、正しい書式設定とともに、Webフォームでのタイムゾーンの管理についての理解も必要です。Webフォームでは、時間がブラウザのローカル・タイムゾーンに変換されてからフォームに表示されます。ただし、時間データの書式が正しく設定されていない場合、時間の解析が複数回試行されますが、常にタイムゾーンの変換なしで時間が表示されます。正しい時間書式の例は次のとおりです。
-
t1.value = "20:30:00";
-
d2t2.value = "20:30:00Z";
-
t3.value = "20:30:00-04:00";
-
dt1.value = "2012-08-23T20:30:00";
11.1.1.5 条件の作成
最も一般的な条件の1つは、ユーザーがコントロールに値を入力するとすぐに実行されるフォーム・ルールです。この条件のテストは、フィールドが文字列タイプか数値タイプかによって異なります。
文字列タイプ: テキスト、テキスト領域、日付、電話番号
if (name.value.length > 0)
数値タイプ: 通貨、数量、数値
if (name.value != null) or if (name.value > 0)
はどちらも一般的なテスト条件です。
多くの場合、条件name.value.length > 0は完全にドロップ可能であり、フォーム・ルールが簡素化されます。このフォーム・ルールは、ユーザーがfirstnameまたはlastnameという名前のコントロールに値を入力するたびに実行されます。
fullname.value = firstname.value + ' ' + lastname.value;
11.1.1.6 選択コントロール
ラジオ・コントロール、ドロップダウンおよびチェック・ボックスはすべて、選択コントロールの例です。ラジオ・コントロールおよびドロップダウン・コントロールは単一選択です。つまり、ドロップダウン内の1つのアイテムを選択すると、ドロップダウン内の他のアイテムはすべて選択解除されます。同じことがラジオにも当てはまります。いつでも押せるのは1つのラジオ・ボタンのみです。したがって、ラジオおよびドロップダウンのID.valueは、他の入力および出力コントロールに似ています。値は単一のアイテムです。
チェック・ボックス・コントロールは複数選択が可能です。いつでも複数のアイテムを選択できます。そのため、チェック・ボックスのID.valueは配列です。したがって、チェック・ボックスの有効な式は、値配列内のアイテムの数を返すID.value.lengthです。ID[0].valueはリスト内の最初のアイテムを取得し、ID[1].valueは2番目のアイテムを取得します(以下同様)。チェック・ボックスが1つのみのチェック・ボックス・コントロールでチェック・ボックスが選択されていない場合、配列には要素が含まれません。チェック・ボックス・コントロールの場合、有用な式としてID.value.length == 0があります。ID.lengthは有効な式ではないことに注意してください。また、チェック・ボックス・コントロールは配列であるため、ID[0].value ==と記述するのも有効な式ではありません。チェック・ボックス・コントロール内のオプションが選択されていない場合、その値は空の文字列ではありません。配列に存在しないだけです。
11.1.1.7 コントロールの初期状態
フォーム内のすべてのコントロールに、visible、expanded、value、validおよびenabledプロパティのデフォルトの初期状態があります。ただし、フォーム・デザイナの「編集」タブでコントロールの初期状態を変更できます。コントロールの初期状態を変更するには様々な方法があります。1つの方法としては、値を入力コントロールに関連付けます。これにより、フォームを使用モードで初めて開いたときにコントロールのデフォルト値が設定されます。グループ・コントロールを拡張または縮小するという方法もあります。これにより、初期拡張状態が設定されます。visibleおよびenabledプロパティのデフォルト状態は、コントロールの「プロパティの編集」パネルを使用して設定されます。「プロパティの編集」には、visibleおよびenabledプロパティが入力コントロールのように意味を持つコントロールのプロパティのチェック・ボックスがあります。
11.1.2 フォーム・ルールでの動的コンテンツの使用
多くの場合、実際のフォームではドロップダウン・リストに動的コンテンツが含まれている必要があります。通常、1つのフォーム・フィールドに入力された値に基づいて、他のフィールドの値や選択コントロールで使用可能なオプションが動的に設定される必要があります。
11.1.2.1 動的コンテンツ
フォーム・ルールを使用すると、JSONオブジェクトを含むX-JSONヘッダーを返すhttp getsを呼び出すことができます。これにより、テキスト・コントロールや選択(ラジオ、ドロップダウン、チェック・ボックス)コントロールなど、フォーム・フィールドに移入されるデフォルト値の割当てを完全に柔軟に行うことができます。フォーム・ルールではhttp.post()、http.delete()およびhttp.put()を使用することもできますが、すべてのペイロードがサポートされているわけではないため、URLパラメータと組み合せて使用する必要があります。
http.getの構文を表示する例は次のとおりです。このフォーム・ルールでは、JSONオブジェクトを返す必要があるhttp getが呼び出されます。サーブレット上のメソッドは、itemPriceを取得するためにitemNameを指定してデータベースを問い合せるなど、必要な処理をすべて実行できます。この例では、返されるJSONオブジェクトにはpriceという名前のフィールドが含まれています。評価では、JSONオブジェクトがjavascript変数xに変換され、割り当てられます。その後、必要に応じてフォームでxを使用できます。この場合、値をPriceという名前のフォーム・フィールドに設定するために使用されます。
eval('x=' + http.get('http://<webhost>/test/json/getPrice?itemName=' + itemName.value)); Price.value = x.price;
別の例では、http.getレスポンスで返されるJSONオブジェクトにclientsという配列が含まれています。この配列を使用して、ドロップダウン・リストのオプションを設定できます。
eval('x=' + http.get('http://<webhost>/test/json/getClients')); Clients.options = x.clients;
ユーザーおよびパスワードの認証後にJSONオブジェクトを返すサーブレットの例は次のとおりです。
@Override public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String u = request.getParameter("username"); String p = request.getParameter("password"); if (authenticate(u, p) == null) response.addHeader("X-JSON", "{auth:false}"); else response.addHeader("X-JSON", "{auth:true}"); } catch (Exception e) { throw new ServletException(e); } }
このサーブレットは、次のようにフォーム・ルールで使用できます。
if (signForm.clicked) { eval('x=' + http.get('http://<webhost>/MYservices/signForm?username=' + u.value + '&password=' + p.value)); if (x.auth) { m.value = "<center>Authenticationn Succeeded</center>"; } else { m.value = "<center>Invalid username or password</center>"; } }
重要なのは、http.getがURLを介してhttpサービスにアクセスしている点です。HTTP URLを介して特定の文字を正しく渡すには、エンコードする必要があります。ユーザーがフォーム・フィールドに入力する値を常に制御できるわけではありません。値にこのような文字の1つが含まれる場合、その値をエンコードする必要があります。
たとえば、このhttp.getにはパスワード・パラメータが含まれています。ユーザー・パスワードには「#」などの文字が含まれる可能性があるため、値をエンコードする必要があります。組込みのjavascriptメソッドencodeURIComponent()により、これを簡単に実行できます。
eval('x=' + http.get('http://<webhost>/MYservices/signForm?username=' + u.value + '&password=' + encodeURIComponent(p.value)));
HTTPサービスでURLパラメータをデコードする必要がある場合もあります。たとえば:
import java.net.URLDecoder; String p = request.getParameter("password"); p = URLDecoder.decode(password, "UTF-8");
11.1.2.2 動的コンテンツの再利用
バック・エンド・システムから動的コンテンツを取得すると、フォームのパフォーマンスが低下する原因になることがあります。フォームで動的コンテンツを複数回使用する必要がある場合、http.get()からコンテンツを1回取得し、返されたJSON文字列を非表示のテキスト・フォーム・コントロールに保存することで、パフォーマンスを向上させることができます。その後、バック・エンド・システムを複数回呼び出さなくても、テキスト・コントロール値を読み取って再評価できます。
たとえば、jsonUserDataという名前の非表示のテキスト・コントロールをフォームに追加します。http.get():を介してバック・エンド・システムからユーザー・データを取得する1行をフォーム・ルールに追加します。
jsonUserDate.value = x;
ユーザー・データを同様に必要とする他のフォーム・ルールで、http.get()をバック・エンド・システムに再度呼び出すのではなく、次の行をフォーム・ルールに追加します。
var val = jsonUserDate.value; eval('x' = val);
これは、バック・エンド・システムからコンテンツを再び取得したように、xを同じ文字列に設定する効果があります。
11.1.3 フォーム・ルールでのデータ・メソッドとビルトイン・メソッドの使用
Webフォーム・ルール内のビルトイン・データとビルドイン・メソッドにアクセスできます。
11.1.3.1 ビルトイン・データ
Oracle BPMではフォーム・ルールに特定のデータが提供されます。これには、フォーム、テナントおよびフォーム情報を現在使用しているユーザーに関する情報が含まれます。_data.getParameter('<data name>')構文を使用してフォーム・ルール内のこのデータを取得します。
使用可能なデータのリストを次に示します。
-
subject.id - ログインしたユーザーのユーザー名
-
subject.first.name - ログインしたユーザーの名
-
subject.last.name - ログインしたユーザーの姓
-
subject.roles - ログインしたユーザーのすべてのロールのリスト(v4.1.5で使用可能)
form.loadフォーム・ルールを使用すると、現在ログインしているユーザーに関する情報を使用してフォーム内のフィールドを事前に設定できます。たとえば、ID、FirstName、LastName、EmailおよびRolesというコントロールがフォームにあるような場合です。
ノート:
コントロールの値を配列またはランダムなJavaScriptオブジェクトに設定することはできません。
11.1.3.2 ビルトイン・メソッド
Oracle BPMには、フォーム・ルールで必要な共通の機能に使用されるビルトイン・ヘルパー・メソッドが用意されています。日付および時間の操作に使用できるメソッドのリストを次に示します。
-
Time frevvo.currentTime(form) - 現在の時間をユーザーのローカル・タイムゾーンで返します。
このメソッドは、Timeコントロールの値を設定する場合にのみ使用してください。
-
Date frevvo.currentDate(form) - 現在の日付をユーザーのローカル・タイムゾーンで返します。
このメソッドは、Dateコントロールの値を設定する場合にのみ使用してください。
-
DateTime frevvo.currentDateTime(form) - 現在の日時をユーザーのローカル・タイムゾーンで返します。
このメソッドは、日付/時間コントロールの値を設定する場合にのみ使用してください。
Tmという名前の時間コントロール、Dtという名前の日付コントロール、DtTmという名前の日付/時間コントロールを設定する例を次に示します。
Tm.value = frevvo.currentTime(form); Dt.value = frevvo.currentDate(form); DtTm.value = frevvo.currentDateTime(form);
_formTz Urlパラメータを使用してフォームのUrlでタイムゾーンを指定しないかぎり、currentTime()、currentDate()およびcurrentDateTime()はform.loadフォーム・ルールで機能しません。これは、日付および時間を返す際のタイムゾーンをフォーム・サーバーが認識している必要があるためです。_formTzを指定しない場合、メソッドはnullを返し、コントロール値は空白のままになります。たとえば、東部標準時を指定するには、&_formTz=America/NewYorkとします。
ユーザーとロールを操作する場合は、次のメソッドを使用します。
-
boolean isUniqueUserId (String userId, String tenantId) - このユーザーがテナントに存在しない場合はtrue、存在する場合はfalseを返します
-
boolean isUniqueRoleId (String roleId, String tenantId) - このロールがテナントに存在しない場合はtrue、存在する場合はfalseを返します
11.1.4 実行時のフォーム・ルールの動作の理解
Webフォームでフォーム・ルールを使用する場合、フォーム・ルールの実行時の動作を理解することが重要です。
11.1.4.1 フォーム・ルールが実行されるタイミング
フォーム・ルールを作成または編集すると、Oracle BPMでは、コントロール、およびフォーム・ルールが依存するそのコントロールのプロパティのリストを確認します。フォーム・ルールに関連する状態の変化があると、フォーム・ルールが自動的に実行されます。フォーム・ルールは、フォーム・ルール・パネルに表示されるときに上から下の順序でも実行されます。
フォーム・ルールは他のフォーム・ルールの実行をトリガーできることに注意してください。つまり、フォーム・ルールR1がAという名前のコントロールの値を設定し、A.valueに依存するフォーム・ルールR2がある場合、フォーム・ルールR2がトリガーされて実行されます。
フォーム・ルールは通常、1つ以上のフォーム・コントロールとそのプロパティを参照し、プロパティのいずれかの値が変更されると、フォーム・ルールが実行されます。フォーム・ルールは、ページがロードされるときには起動されないことに注意してください。たとえば、次のフォーム・ルールは、N1.valueの値が変更された場合にのみ実行されます。
if (N1.value > 0 || N2.value > 0) { T.value = N1.value + N2.value; }
次に、ユーザーが無効な電子メールを入力した場合にメッセージを表示するユース・ケースを考えてみましょう。フォームには必須の電子メール入力コントロール(Name=E)があり、電子メール・コントロールのvalidプロパティがfalseの場合、アクションを実行する必要があります。次のようなフォーム・ルールを作成できます。
if (!E.valid) { // code to show message here. }
前述のコードは予期したとおりに機能しません。Eは必須フィールドですが、このフィールドは最初は空のため、E.validの初期値はfalseです。ユーザーが無効な電子メール・アドレスを入力した場合も、E.validの値はfalseのままになり、状態が変化しないため、フォーム・ルールは実行されません。次のコードは正しく機能します。
if ((E.value.length > 0) && (!E.valid)) { // code to show message here. }
フォーム・ルールはE.validとE.value.lengthの両方の値に依存するため、ゼロ文字より長い文字列が入力されると、フォーム・ルールが実行され、メッセージが表示されます。
11.1.4.2 無限ループ
ループ状態になるフォーム・ルールは簡単に作成できます。たとえば、B.valueに基づいてA.valueを更新するフォーム・ルールや、A.valueに基づいてB.valueを更新するフォーム・ルールなどです。このようなフォーム・ルールは相互に連続してトリガーされます。
Oracle BPMサーバーでは、フォーム・ルールごとに実行時間の制限を設定することで、この状態が発生しないようにします。実行に5秒以上かかるフォーム・ルールは強制的に停止されます。これは、ほとんどの計算タスクで非常に長い時間であり、フォーム・ルールの大部分はこの制約の影響を受けることはありません。ただし、Oracle BPMは多数のユーザーが同時に使用するホスト・サイトであるため、このような計算によって課される時間制限があります。
11.1.5 フォーム・ルールのデバッグ
この項では、フォームのデバッグ方法について説明します。
11.1.5.1 重複するコントロール名のデバッグ
フォームを設計する場合、フォーム設計者は通常、コントロールに重複する名前が指定されないようにしますが、コントロールが別のセクション・コントロールに含まれる場合、コントロールに同じ名前を付けることができます。たとえば、HomeとOfficeという名前の2つのセクションをフォームに配置し、各セクションでAddressという名前のテキスト・コントロールを使用できます。ただし、フォーム・ルールでいずれかのAddressコントロールを使用する場合、一意の名前を指定する必要があります。
名前が重複しているためにフォーム・ルールに違反しているかどうかを識別するには、Tomcatコンソールのログを参照するという方法があります。次のようなメッセージが表示された場合、コントロール名が重複している可能性があります。
16:50:35,390 WARN RuleObserver:455 - Error evaluating rule [Translate.Translate Form Rule]: Java arrays have no public instance fields or methods named "value." ([Translate.Translate Form Rule]#2) if (form.load) {Name.value = 'Nancy';}
Java arrays have no public instance fields or methods...は、Javaでは同じ名前のコントロールが、単一のコントロールではなく1つの配列として解釈されていることを意味します。
11.1.5.2 フォーム・ルールのプロファイリング
フォーム・ルールの実行をプロファイリングすると、各フォーム・ルールの実行にかかる時間を判断できます。これは、多数のフォーム・ルールを使用するフォームのパフォーマンスを調整および向上する際に役立ちます。プロファイリングをオンにするには、urlでrule-debug=profileを設定します。
動的な選択コントロール(ドロップダウン、ラジオ、チェック・ボックス)を設定するためにフォーム・ルールがデータベース問合せを実行する場合、フォーム・ルールのプロファイリングによって、データベース問合せに時間がかかりすぎているかどうかを確認できます。実行時間が長いHTTPコールが表示されます。