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文字以下)で入力して下さい