今日は maxlength ルールだ。

このルールは名前の通り、入力文字数を制限することができる。

maxlength ルールの持つパラメータ変数は 2 つある。

1 つは、ルールと同じ名前の maxlength 変数で、
制限する文字数を数値で指定する。
これは必須のパラメータである。

もう 1 つは省略可能な lineEndLength 変数だ。
これは、改行文字を何文字と計算するかを示す。

<textarea> 等、複数行の入力が可能なフィールドの場合、
送信される際の改行文字は、ブラウザの OS によって異なる。
lineEndLength を指定しておけば、
実際に含まれる改行のコードに関係なく、
改行の文字数を統一して勘定することができるようになる。

このルールは、備考にでも適用するとしようか。

まず、maxlength ルールが使う書式メッセージを用意する。
既定で「errors.maxlength」というキーを参照するので、
これを用意しておく。

========== Messages_ja.properties ==========

# Validator 関係

errors.required = {0}を入力してください。
errors.required.selection = {0}を選択してください。
errors.invalid = {0}が正しくありません。
errors.maxlength = {0}は{1}文字以内で入力してください。

(…省略…)
========== end of Messages_ja.properties =========

今回は、置換パラメータを 2 つにしてみた。
{0} はフィールド名、{1} は制限長が入るというわけだ。

では、Validator の設定を書く。

========== /WEB-INF/validation.xml ==========
(…省略…)
            <!-- 備考は必須ではないが、最大 50 文字 -->
            <field property="rule.note"
                    depends="maxlength">

                <var>
                    <var-name>maxlength</var-name>
                    <var-value>50</var-value>
                </var>

                <arg name="maxlength" position="0"
                        key="property.FilterRule.note" />

                <arg name="maxlength" position="1"
                        key="50" resource="false" />

            </field>
(…省略…)
========== end of /WEB-INF/validation.xml ==========

備考は必須ではないので、required ルールは使わない。

maxlength 変数を用意し、その値として 50 としてみた。
これで、50 文字以上入力した際にエラーとなる。

メッセージの引数は 2 つあるので、<arg> 要素も 2 つ。
position 属性でその位置を指定する。

さて、ポイントは position="1" である後ろの要素だ。
key 属性の値が 50 という数値になっている。

resource 属性に false を指定することで、
key 属性の値がメッセージリソースのキーではなく、
文字列としてそのまま使うことを指定することができる。

resource が true の場合、key 属性の文字列をキーとして、
メッセージリソースを参照する動作になるのだが、
今回のように「50」という単純な文字列のためだけに、
メッセージリソースを用意するのは少し無駄な気がしたので、
直接文字列を指定することにしたわけだ。