<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WIDGET-INFO &#187; バリデーション</title>
	<atom:link href="http://blog.widget-info.net/tag/validation/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.widget-info.net</link>
	<description>WIDGET-INFOではCakePHPやIPhone情報、その他開発に関する情報を発信</description>
	<lastBuildDate>Tue, 09 Feb 2010 13:44:47 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CakePHP　バリデーションの日本語問題</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_validation_jpn/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_validation_jpn/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 22:57:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[バリデーション]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=304</guid>
		<description><![CDATA[CakePHPにはバリデーションの機能があります。入力データを任意の方法で正しい入力かどうかをチェックしてくれる機能。。。]]></description>
			<content:encoded><![CDATA[<p>CakePHPにはバリデーションの機能があります。<br />
入力データを任意の方法で正しい入力かどうかをチェックしてくれる機能。。。<br />
大変便利機能で当たり前のように使っていると思いますが、やはり日本語周りがorz</p>
<p>まぁしかたの無いことなのですが、内部のライブラリの状態を見る限りでは<br />
悲しいこと2バイト文字に関しては基本処理されていません。<br />
<span id="more-304"></span></p>
<p>例えば「minLength」というバリデーション方法。<br />
入力文字数の最小数をチェックしてくれるバリデーションですが、<br />
CakePHPの本体のままで利用して例として、最小文字数を2文字以上で<br />
入力させたい場合で入力文字が「あ」と入力されたとします。</p>
<p>普通に考えればバリデーションに引っかかり、入力エラー処理をされますが、<br />
もちろんあっさり通り抜けてしまいます（笑<br />
まぁ内部を見ると簡単。。。2バイト文字は無視です（笑<br />
※厳密には無視では無く、文字数の数え方が違います。</p>
<p>そこでCakePHPの本体を変更せずに、2バイト文字に対応させた<br />
バリデーション方法はないか。。。もちろんバリデーション名も変更せずに。。。</p>
<p>その結果、「app_model.php」に以下の方法で対応できます。</p>
<pre class="brush:php">function minLength($check, $min) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length &gt;= $min);
}</pre>
<p>既存のバリデーションにオーバロードをさせてしまう方法です。<br />
こうすることで2バイト文字でも正しく文字数を判別することができるようになります。<br />
その他のバリデーションも同じように変更することで2バイト文字のバリデーション対応にすることができます。<br />
といってもあと2つなのでコピペができるようにまとめておきます。</p>
<pre class="brush:php">function minLength($check, $min) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length &gt;= $min);
}
function maxLength($check, $max) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length &lt;= $max);
}
function between($check, $min, $max) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length &gt;= $min &amp;&amp; $length &lt;= $max);
}</pre>
<p>2バイト文字の処理がある場合は注意しておくと無難です（笑</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_validation_jpn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
