入力検査

項目が二つのログイン画面です。何も入力せずにログインを押すと両方の項目にメッセージが出ます。パスワードを九文字だけ入れると文字数の規則のメッセージが出ます。メッセージの文言も、十文字という数も、画面のコードには書かれていません。規則ファイルから読んでいます。

規則をサーバと共用する

検査規則を画面のコードに書くと、サーバはその規則を参照できません。画面を通らない経路(一括取込、API、別の画面)では検査されなくなります。そのため、規則は一つのファイルに置き、画面とサーバの両方が読みます。

SA001Login
  account   required   アカウントは必須です。      errorOutput: field
  password  required   パスワードは必須です。      errorOutput: field
  password  minLength  10文字以上で入力を。      errorOutput: field, options: [10]

画面のコードに書くのは一行です。

Validate rules: rules for: 'SA001Login' state: self payload

戻り値は引っかかった規則の一覧で、キーはサーバへ送るときの項目名です。CSS のセレクタではありません。メッセージをどこに表示するかは画面が決めます。

規則の取得を待つ

規則はコードに埋め込まず、サーバから取得します。規則が届く前にログインボタンを押せると、検査が無いまま通過してしまうため、規則が届くまでボタンは無効です。

サーバのエラーも同じ場所に表示する

「サーバが弾いたことにする」を押すと、サーバが返したエラーの一覧が、画面の検査結果と同じ場所に表示されます。

規則ファイルには、メッセージの表示位置(項目の隣か、ページ上部にまとめてか)も書いてあります。部品が返すのはどの項目が引っかかったかだけで、配置は画面が行います。

検査の追加

検査を追加するには、Validator プロトコルを実装するクラスを一つ書きます。

Object subclass: #Alphanumeric protocols: (Validator).
Alphanumeric >> failsFor: v options: os in: all = ...

登録は不要です。Validator implementors が、そのプロトコルを実装しているクラスの一覧を返します。キーはクラス名の先頭を小文字にしたもので、Alphanumeric なら alphanumeric です。規則ファイルに書く名前と同じです。Java のサービスではアノテーションの付いたクラスをパッケージから探して同じ表を作りますが、LPScript ではコンパイラがその一覧を持っています。

検査クラスに渡されるのは、項目の値(文字列)、規則ファイルの options、検査対象の JSON 全体です。三つ目があるので、項目を跨いだ検査が書けます。

最終判断はサーバ

required の実装が画面側とサーバ側の二つあるのは意図的です。画面側は利用者に早く知らせるためのもので、最終的な判断はサーバが行います。画面側の検査が緩くても、サーバが弾いたエラーが同じ場所に表示されます。