このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日は 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」という単純な文字列のためだけに、
メッセージリソースを用意するのは少し無駄な気がしたので、
直接文字列を指定することにしたわけだ。