
CakePHP2.x系のバリデーション、alphaNumericがダメダメなので、独自バリデーションで回避。
2013/08/03
CakePHP2.3.6のバリデーションの「alphaNumeric」、本などには「半角英数字のみ許可」となっていますが、なぜか日本語が通ってしまいました。
有名な話しらしいので、原因はすぐに判明。
元のルーチンがちょと特殊な書き方をしているために起きるようです。
修正はコアな部分を書き換えてしている方もいましたが、そんなところを書き換えるのはリスクが大きいため、
普通に独自のバリデーションを作ったほうが早いので、さくっと作りました。
AppModel に以下を作成。
[php]
/**
* アルファベット|数字|のみかどうかチェック
*
*/
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;
}
}
}
[/php]
バリデーション対象のモデルからは以下のようにすれば、bool値が返ります。
[php]
var $validate = array(
'product_code' => array(
array(
'rule' => 'notEmpty',
'message' => '『商品コード』を入力して下さい。',
'required' => true,
'allowEmpty' => false,
),
array(
'rule' => array('is_alphabet_number_only'),
'message' => '『商品コード』は半角英数字で入力して下さい。',
),
)
);
[/php]
割りとお手軽。
[tgAmazonItemLookup asin="B005VIKQPA" related="1"]