Domainを使ったバリデーション機能の拡張

複雑な入力チェックを実装したい場合、ドメインをカスタマイズすることにより簡単に入力チェックを実装することが出来ます。

まずは下記のサンプルソースをご覧ください。このサンプルでは、StandardIntDomainを拡張して最小値、最大値、許容値チェックを実装しています。

{curl 6.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

|| ///////////////////////////////////////////////////////////////
|| カスタマイズしてvalidateのメッセージを変更したint型のドメイン
|| ///////////////////////////////////////////////////////////////

{define-class public CustomIntDomain {inherits StandardIntDomain}

  {constructor public {default
                          default-value:any = 0,
                          min-allowable:any = null,
                          max-allowable:any = null,
                          allowable-values:#{Array-of int} = null
                      }

    {construct-super
        default-value = default-value,
        min-allowable = min-allowable,
        max-allowable = max-allowable,
        allowable-values = allowable-values
    }
   
  }

  || /////////////////////////////////////////////////
  || メッセージ変更のためメソッドを拡張します。
  || /////////////////////////////////////////////////
  {method public {validate x:any}:#ValidationException

    ||最小値チェック(min-allowableが指定されていない場合は無視)
    {if-non-null min-val:any = self.min-allowable
     then
        let min:int = min-val asa int

        {if min > x asa int
         then
            ||最小値エラーの場合はValidationExceptionを返却
            {return
                {ValidationException
                    {format “%d未満の値を指定することは出来ません。”,min}
                }
            }
        }
    }

    ||最大値チェック(max-allowableが指定されていない場合は無視)
    {if-non-null max-val:any = self.max-allowable
     then
        let max:int = max-val asa int

        {if max < x asa int
         then
            ||最大値エラーの場合はValidationExceptionを返却
            {return
                {ValidationException
                    {format “%dよりも上の値を指定することは出来ません。”,max}
                }
            }
        }
    }

    ||範囲チェック(allowable-valuesが指定されていない場合は無視)
    {if-non-null data-sets:{Set-of any} = self.unsorted-allowable-values
     then
        {if not {data-sets.member? x}
         then
            ||範囲エラーの場合はValidationExceptionを返却
            {return
                {ValidationException
                    {format “%sは指定不可能な値です。”,x}
                }
            }
        }
    }

    {return {super.validate x}}    ||値が許容される場合はスーパークラスに処理を任せる

  }
}

||ドメインの定義
{let domain-for-validate:Domain =
    {CustomIntDomain
        min-allowable = 0,||最小値
        max-allowable = 100,||最大値
        allowable-values = {{Array-of int} 0,1,5,10,50}||指定可能な範囲値
    }
}

{let md1:MessageDisplay = {MessageDisplay}}

{TextField
    message-display = md1,
    {validate-with
        ||DomainValidatorにて使用するドメインを指定
        {DomainValidator domain-for-validate}
    }
}

{value md1}

このサンプルを実行すると、-1以下の値を入力した場合、100以上の値を入力した場合、allowable-valuesに含まれない値を入力した場合でそれぞれ異なるエラーメッセージが表示されます。

 int-validation.jpg