CakePHP2.x系のバリデーション、alphaNumericがダメダメなので、独自バリデーションで回避。
2013/08/03
CakePHP2.3.6のバリデーションの「alphaNumeric」、本などには「半角英数字のみ許可」となっていますが、なぜか日本語が通ってしまいました。
有名な話しらしいので、原因はすぐに判明。
元のルーチンがちょと特殊な書き方をしているために起きるようです。
修正はコアな部分を書き換えてしている方もいましたが、そんなところを書き換えるのはリスクが大きいため、
普通に独自のバリデーションを作ったほうが早いので、さくっと作りました。
AppModel に以下を作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * アルファベット|数字|のみかどうかチェック * */ function is_alphabet_number_only( $field=array() ) { if ( is_array($field) ) { foreach ( $field as $name => $value ) { if ( preg_match("/^([a-zA-Z0-9])*$/u", $value) ) { return true; } else { return false; } } } else { if ( preg_match("/^([a-zA-Z0-9])*$/u", $field) ) { return true; } else { return false; } } } |
バリデーション対象のモデルからは以下のようにすれば、bool値が返ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var $validate = array( 'product_code' => array( array( 'rule' => 'notEmpty', 'message' => '『商品コード』を入力して下さい。', 'required' => true, 'allowEmpty' => false, ), array( 'rule' => array('is_alphabet_number_only'), 'message' => '『商品コード』は半角英数字で入力して下さい。', ), ) ); |
割りとお手軽。
[tgAmazonItemLookup asin="B005VIKQPA" related="1"]