VAR_TYPE_STRING の max, min 属性に関する詳細
- Ethna 2.5.0 以降での max, min の検証
- 文字数単位(全角半角区別なし)の検証
- mbstrmax, mbstrmin 属性を使う
- バイト数単位(全角半角区別あり)の検証
- クライアントエンコーディングを utf-8(eucJP-Win) に変更する
- strmaxcompat, strmincompat 属性を使う
- シングルバイト文字列の検証
- Ethna 2.3.5 より前でのmax, min属性の検証
VAR_TYPE_STRING の max, min 属性に関する詳細
form 定義の type を 以下のように VAR_TYPE_STRING と設定した場合、Ethna のバージョンによって、max と min 属性の解釈に違いがあります。2.5.0 以降と、2.3.x以前のバージョンでこの違いが表れます。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
// ....
),
);
以下、その違いについて詳細を説明します。
Ethna 2.5.0 以降での max, min の検証
文字数単位(全角半角区別なし)の検証
Ethna 2.5.0 以降では、maxとmin 属性のチェックがデフォルトで「文字数」を基本として行われ、全角と半角を区別しなくなりました。required, (mb)regexp 属性についての扱いは従来と同様です。
これは Ethna 2.5.0 以降、Ethna で扱う内部のエンコーディングが utf-8 から UTF-8に変更となったことによるものです。
フォーム定義を以下のように設定した場合は、
- sampleは入力必須
- 文字数が最大で6文字
- 文字数が最小で2文字
という意味として解釈されます。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'required' => true,
'max' => 6,
'min' => 2,
),
);
この場合に検証結果がエラーになった場合、エラーメッセージは全角半角を区別しない形で以下のように表示されます。
{form}は6文字以下で入力して下さい
{form}は2文字以上で入力して下さい
mbstrmax, mbstrmin 属性を使う
上記の「全角半角を区別しない、文字数ベースの検証」は、以下のように mbstrmax, mbstrmin 属性を設定したときの動きと同じです。これらの属性を使うと、後で述べるクライアントエンコーディングに関わらず、全角半角の区別がない文字数ベースの検証が行われます。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'required' => true,
'mbstrmax' => 6,
'mbstrmin' => 2,
),
);
バイト数単位(全角半角区別あり)の検証
クライアントエンコーディングを utf-8(eucJP-Win) に変更する
※ クライアントエンコーディングとは、プロジェクトの内部エンコーディングと、テンプレートのエンコーディングのふたつを指します。詳しくは 言語とエンコーディングの設定 のページを参照して下さい。
Ethna 2.5.0 preview1 以降で、古いプロジェクトを維持するために utf-8 のような全角半角のバイト数が決まっている文字コードをクライアントエンコーディングとして用いるときは、バイト数単位の検証を行いたいかもしれません。
その場合は、[appid]_Controller.php の _getDefaultLanguage メソッドを以下のようにオーバーライドし、クライアントエンコーディングを utf-8に変更することで、デフォルトでバイト数単位で、全角半角を区別した検証が行われるようになります。
警告!:以下のようにオーバーライドすると、テンプレートのエンコーディング及
び、プロジェクトの内部エンコーディングが utf-8 であると Ethna は看做します!
これは utf-8 がデフォルトであった 2.3.x との互換性を維持するための設定です!
/**
* デフォルト状態での使用言語を取得する
* 外部に出力されるEthnaのエラーメッセージ等のエンコーディングを
* 切り替えたい場合は、このメソッドをオーバーライドする。
*
* @access protected
*/
function _getDefaultLanguage()
{
// ロケール名(e.x ja_JP, en_US 等),
// システムエンコーディング名,
// クライアントエンコーディング(= テンプレートのエンコーディング) の配列
return array('ja_JP', 'utf-8', 'utf-8');
}
つまり、上記のように設定し、フォーム定義を以下のように設定した場合は、
- sampleは入力必須
- 文字数が最大で全角3文字、半角6文字
- 文字数が最小で全角1文字、半角2文字
という意味として解釈されます。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'required' => true,
'max' => 6,
'min' => 2,
),
);
上記の設定で検証結果がエラーになった場合、エラーメッセージは以下のように全角半角を区別した形で表示されます。
{form}には全角1文字以上(半角2文字以上)で入力して下さい
{form}には全角3文字以下(半角6文字以下)で入力して下さい
strmaxcompat, strmincompat 属性を使う
新しいプロジェクトで、クライアントエンコーディングを utf-8 に設定しない場合でも、バイト数単位で、全角半角区別ありの検証を行いたいかもしれません。その場合は、strmaxcompat, strmincompat 属性を以下のようにして使用します。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'required' => true,
'strmaxcompat' => 6,
'strmincompat' => 2,
),
);
シングルバイト文字列の検証
ASCII しか入ってこないことがわかっている場合で、全角半角を区別「しない」検証を行いたい場合に備えて、strmax, strmin 属性が追加されました。以下のようにして使用します。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'required' => true,
'strmax' => 6,
'strmin' => 2,
),
);
この場合のエラーメッセージは、デフォルトの場合と同様、以下のように全角半角を区別しない形になります。
{form}は6文字以下で入力して下さい
{form}は2文字以上で入力して下さい
この属性は、mbstring が入っていない場合の、min, max のデフォルトの
動きになります。
Ethna 2.3.5 より前でのmax, min属性の検証
Ethna 2.3.5 以前では、一貫して「バイト数単位で、全角半角を区別する」検証がmax, min 属性では行われます。
つまり、フォーム定義を以下のように設定した場合は、
- sampleは入力必須
- 文字数が最大で全角3文字、半角6文字
- 文字数が最小で全角1文字、半角2文字
という意味として解釈されます。
$form = array(
'sample' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'required' => true,
'max' => 6,
'min' => 2,
),
);
上記の設定で検証結果がエラーになった場合、エラーメッセージは以下のように全角半角を区別した形で表示されます。
{form}には全角1文字以上(半角2文字以上)で入力して下さい
{form}には全角3文字以下(半角6文字以下)で入力して下さい