入力チェックテンプレートを利用する

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

製品区分モデルを用意した例です。区分ごとに、入力チェックルールが異なります。このチェックスクリプトをデータとして用意します。

図1 製品区分モデルごとに異なる入力チェックルールを用意する

製品モデルの更新画面です。ここで "妥当性チェックスクリプト隠し" 項目は、本番運用では隠し項目とし、画面には表示されないものとします。ここではわかりやすくするため画面に表示しています。

図2 区分Aのときに適用されるスクリプト

区分 "A" の場合のスクリプトでエラーチェックされた例です。

図3 エラーの例

区分 "B" の場合のスクリプトでエラーチェックされた例です。

図4 区分Bのときに適用されるスクリプト

区分 "B" の場合のスクリプトでエラーチェックされた例です。

図5 区分Cのときに適用されるスクリプト

定義方法

この方法は、モデル項目に直接、スクリプトコードを格納します。ビルドなしで(運用中に)区分と判定コードの追加を行うことができます。

例えば、model1モデルのitem1項目にスクリプトコードが格納されている場合、入力チェックスクリプトを次のようにします。

var ret = JFCUtils.eval(model1.item1, __jfc_script_engine_filename, p);
if (ret !== null) {
  var error = new Jfcerror();
  error.content = ret;
  p.errors.addJfcerror(error);
}

特別な参照指定 This()

スクリプトではThis()という表記を利用できます。例えば次のようになります。

if (This().item2 === 'A') "エラーメッセージ"

実行時に JFCUtils.eval メソッド内で This() は自分自身(ストアモデル)に置換されます。

戻り値

このスクリプトの戻り値として、文字列を記述します。上の例では "エラーメッセージ" が戻り値になります。

[重要] セキュリティリスクについて

開発者は「この方法はセキュリティ上、重大な問題がある」ということを了解した上で、ご利用ください。もし(この方法が抱えている)セキュリティの問題がなにかわからない、という場合、使わないようにしてください。

本質的にセキュリティの問題を回避することは難しいため、運用時は次の点に留意してください。

  • このスクリプトを登録できる利用者を限定する。(誰でも登録や修正を行えるようにしない。)
  • このスクリプトを誰が、いつ、どのように変更したかをログで確認できるようにする。
  • この方法は入力チェックのみに限定し、データを書き換えるといった目的で使わないようにする。

仕様・制約

  • スクリプトコードは、お使いの外部データベースのカラムに格納されます。そのため長いスクリプトの格納には不向きです。目安として、2Kバイト程度とするのがよいでしょう。