入力検査
項目が二つのログイン画面です。何も入力せずにログインを押すと両方の項目にメッセージが出ます。パスワードを九文字だけ入れると文字数の規則のメッセージが出ます。メッセージの文言も、十文字という数も、画面のコードには書かれていません。規則ファイルから読んでいます。
規則をサーバと共用する
検査規則を画面のコードに書くと、サーバはその規則を参照できません。画面を通らない経路(一括取込、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 の実装が画面側とサーバ側の二つあるのは意図的です。画面側は利用者に早く知らせるためのもので、最終的な判断はサーバが行います。画面側の検査が緩くても、サーバが弾いたエラーが同じ場所に表示されます。