<?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; CakePHP</title>
	<atom:link href="http://blog.widget-info.net/tag/cakephp/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　事例1</title>
		<link>http://blog.widget-info.net/2010/01/cakephp_case1/</link>
		<comments>http://blog.widget-info.net/2010/01/cakephp_case1/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 14:10:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[事例]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=402</guid>
		<description><![CDATA[ということで少し事例を。。。だいぶCakePHPで開発しているサイトも多くなってきたかと思います。]]></description>
			<content:encoded><![CDATA[<p>ということで少し事例を。。。</p>
<p>だいぶCakePHPで開発しているサイトも多くなってきたかと思います。<br />
そこで自分が知ってるCakePHP製のサイトを紹介。</p>
<p><a title="ペット美容室・サロンのポータルサイト" href="http://www.petaru.info/" target="_blank">全国のペット美容室・サロンを検索できるポータルサイト</a><br />
ペット美容室またはサロンの情報を検索できるポータルです。</p>
<p>少しずつ紹介していきます（笑</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2010/01/cakephp_case1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP 　「1.3alpha」バージョンリリース</title>
		<link>http://blog.widget-info.net/2009/11/cakephp_1-3alpha/</link>
		<comments>http://blog.widget-info.net/2009/11/cakephp_1-3alpha/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 14:10:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Version]]></category>
		<category><![CDATA[バージョン]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=353</guid>
		<description><![CDATA[CakePHPがとうとう1.3alphaまでにきました。バージョンアップされる毎に新たな機能やニーズに合わせた拡張があってうれしい限りです。]]></description>
			<content:encoded><![CDATA[<p>CakePHPがとうとう1.3alphaまでにきました。<br />
バージョンアップされる毎に新たな機能やニーズに合わせた拡張があってうれしい限りです。</p>
<p>今回のバージョンアップで個人的に助かる拡張は<span id="more-353"></span></p>
<p>やはり「Router」の拡張。<br />
今回のバージョンアップで、今までは1つしか指定できなかった「Routing.admin」でしたが<br />
複数指定することが可能のなったのは大きいです。</p>
<p>例えば「admin_index」などは管理者、「index」はPC、「m_index」はモバイル端末として<br />
扱うことも可能となりました。<br />
今まではCakePHPの「Webサービス」または「app」自体を別で用意するといった作業が必要ですが<br />
1つのコントローラーで切り分けを管理することができるようになりました。</p>
<p>その他にも拡張されたこともありますので以下URLよりご確認ください。</p>
<p><a href="http://code.cakephp.org/wiki/1.3/new-features" target="_blank">http://code.cakephp.org/wiki/1.3/new-features</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/11/cakephp_1-3alpha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thgoogle　ヘルパーの公開</title>
		<link>http://blog.widget-info.net/2009/10/thgoogle_helper/</link>
		<comments>http://blog.widget-info.net/2009/10/thgoogle_helper/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 23:13:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Helpers]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=339</guid>
		<description><![CDATA[「Thgoogleヘルパー」を公開します。GoogleMAPを出力するためのJavaScriptコードを自動生成してくれるヘルパーです。]]></description>
			<content:encoded><![CDATA[<p>CakePHPのヘルパーで「Thgoogleヘルパー」を公開します。<br />
以下リンク先で詳細な説明はしますが、GoogleMAPを出力するためのJavaScriptコードを<br />
設定値を与えるだけで自動生成してくれるヘルパーです。</p>
<p>詳しくはこちらを参照ください　「<a title="Thgoogleヘルパー" href="http://blog.widget-info.net/thgoogle_helper/" target="_self">Thgoogleヘルパー</a>」</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/thgoogle_helper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP　Bakeの機能を変更してみる</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_bake/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_bake/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 22:29:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[bake]]></category>
		<category><![CDATA[Controller]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=330</guid>
		<description><![CDATA[CakePHPにはBakeがあります。データベースを元に登録画面や一覧画面などを自動で出力してくれる機能です。]]></description>
			<content:encoded><![CDATA[<p>CakePHPにはBakeがあります。皆様利用されている方も多いかと思います。<br />
データベースを元に登録画面や一覧画面などを自動で出力してくれる機能です。<br />
拡張すれば独自の機能も作れますが、その話はどこかで。。。</p>
<p>今回は基本的にはCakePHPの本体を変更するのはあまりしたくはないのですが<br />
Bake時に出力される「Controller」が個人的にはそのままでは使いづらく<br />
開発の効率が若干無駄になる気がしたので変更してみました。<br />
<span id="more-330"></span><br />
変更したのは「cake/console/libs/tasks」にある「controller.php」の中を変更。<br />
変更したコードは「bakeActions()」内を次のように変更し、どのような機能にしたかというと<br />
コントローラー名を基本的に記述させないことと、セッションメッセージの出力を変更したことが主になります。</p>
<pre class="brush:php">
	function bakeActions($controllerName, $admin = null, $wannaUseSession = true) {
		$currentModelName = $modelImport = $this->_modelName($controllerName);
		if ($this->plugin) {
			$modelImport = $this->plugin . '.' . $modelImport;
		}
		if (!App::import('Model', $modelImport)) {
			$this->err(__('You must have a model for this class to build scaffold methods. Please try again.', true));
			exit;
		}
		$actions = null;
		$modelObj =&#038; new $currentModelName();
		$controllerPath = $this->_controllerPath($controllerName);
		$pluralName = $this->_pluralName($currentModelName);
		$singularName = Inflector::variable($currentModelName);
		$singularHumanName = Inflector::humanize($currentModelName);
		$pluralHumanName = Inflector::humanize($controllerName);
		$actions .= "\n";
		$actions .= "\tfunction {$admin}index() {\n";
		$actions .= "\t\t\$this->{\$this->modelClass}->recursive = 0;\n";
		$actions .= "\t\t\$this->set('{$pluralName}', \$this->paginate(\$this->modelClass));\n";
		$actions .= "\t}\n";
		$actions .= "\n";
		$actions .= "\tfunction {$admin}view(\$id = null) {\n";
		$actions .= "\t\tif (!\$id) {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('Invalid %s.', true),__(\$this->modelClass,true)));\n";
			$actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n";
		} else {
			$actions .= "\t\t\t\$this->flash(sprintf(__('Invalid %s.', true)),__(\$this->modelClass,true)), array('action'=>'index'));\n";
		}
		$actions .= "\t\t}\n";
		$actions .= "\t\t\$this->set('" . $singularName . "', \$this->{\$this->modelClass}->read(null, \$id));\n";
		$actions .= "\t}\n";
		$actions .= "\n";

		/* ADD ACTION */
		$compact = array();
		$actions .= "\tfunction {$admin}add() {\n";
		$actions .= "\t\tif (!empty(\$this->data)) {\n";
		$actions .= "\t\t\t\$this->{\$this->modelClass}->create();\n";
		$actions .= "\t\t\tif (\$this->{\$this->modelClass}->save(\$this->data)) {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s has been saved', true),__(\$this->modelClass,true)));\n";
			$actions .= "\t\t\t\t\$this->redirect(array('action'=>'index'));\n";
		} else {
			$actions .= "\t\t\t\t\$this->flash(sprintf(__('The %s has been saved.', true),__(\$this->modelClass,true)), array('action'=>'index'));\n";
		}
		$actions .= "\t\t\t} else {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s could not be saved. Please, try again.', true),__(\$this->modelClass,true)));\n";
		}
		$actions .= "\t\t\t}\n";
		$actions .= "\t\t}\n";
		foreach ($modelObj->hasAndBelongsToMany as $associationName => $relation) {
			if (!empty($associationName)) {
				$habtmModelName = $this->_modelName($associationName);
				$habtmSingularName = $this->_singularName($associationName);
				$habtmPluralName = $this->_pluralName($associationName);
				$actions .= "\t\t\${$habtmPluralName} = \$this->{\$this->modelClass}->{$habtmModelName}->find('list');\n";
				$compact[] = "'{$habtmPluralName}'";
			}
		}
		foreach ($modelObj->belongsTo as $associationName => $relation) {
			if (!empty($associationName)) {
				$belongsToModelName = $this->_modelName($associationName);
				$belongsToPluralName = $this->_pluralName($associationName);
				$actions .= "\t\t\${$belongsToPluralName} = \$this->{\$this->modelClass}->{$belongsToModelName}->find('list');\n";
				$compact[] = "'{$belongsToPluralName}'";
			}
		}
		if (!empty($compact)) {
			$actions .= "\t\t\$this->set(compact(" . join(', ', $compact) . "));\n";
		}
		$actions .= "\t}\n";
		$actions .= "\n";

		/* EDIT ACTION */
		$compact = array();
		$actions .= "\tfunction {$admin}edit(\$id = null) {\n";
		$actions .= "\t\tif (!\$id &#038;&#038; empty(\$this->data)) {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('Invalid %s', true),__(\$this->modelClass,true)));\n";
			$actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n";
		} else {
			$actions .= "\t\t\t\$this->flash(sprintf(__('Invalid %s', true),__(\$this->modelClass,true)), array('action'=>'index'));\n";
		}
		$actions .= "\t\t}\n";
		$actions .= "\t\tif (!empty(\$this->data)) {\n";
		$actions .= "\t\t\tif (\$this->{\$this->modelClass}->save(\$this->data)) {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s has been saved', true),__(\$this->modelClass,true)));\n";
			$actions .= "\t\t\t\t\$this->redirect(array('action'=>'index'));\n";
		} else {
			$actions .= "\t\t\t\t\$this->flash(sprintf(__('The %s has been saved.', true),__(\$this->modelClass,true)), array('action'=>'index'));\n";
		}
		$actions .= "\t\t\t} else {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s could not be saved. Please, try again.', true),__(\$this->modelClass,true)));\n";
		}
		$actions .= "\t\t\t}\n";
		$actions .= "\t\t}\n";
		$actions .= "\t\tif (empty(\$this->data)) {\n";
		$actions .= "\t\t\t\$this->data = \$this->{\$this->modelClass}->read(null, \$id);\n";
		$actions .= "\t\t}\n";

		foreach ($modelObj->hasAndBelongsToMany as $associationName => $relation) {
			if (!empty($associationName)) {
				$habtmModelName = $this->_modelName($associationName);
				$habtmSingularName = $this->_singularName($associationName);
				$habtmPluralName = $this->_pluralName($associationName);
				$actions .= "\t\t\${$habtmPluralName} = \$this->{\$this->modelClass}->{$habtmModelName}->find('list');\n";
				$compact[] = "'{$habtmPluralName}'";
			}
		}
		foreach ($modelObj->belongsTo as $associationName => $relation) {
			if (!empty($associationName)) {
				$belongsToModelName = $this->_modelName($associationName);
				$belongsToPluralName = $this->_pluralName($associationName);
				$actions .= "\t\t\${$belongsToPluralName} = \$this->{\$this->modelClass}->{$belongsToModelName}->find('list');\n";
				$compact[] = "'{$belongsToPluralName}'";
			}
		}
		if (!empty($compact)) {
			$actions .= "\t\t\$this->set(compact(" . join(',', $compact) . "));\n";
		}
		$actions .= "\t}\n";
		$actions .= "\n";
		$actions .= "\tfunction {$admin}delete(\$id = null) {\n";
		$actions .= "\t\tif (!\$id) {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('Invalid id for %s', true),__(\$this->modelClass,true)));\n";
			$actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n";
		} else {
			$actions .= "\t\t\t\$this->flash(sprintf(__('Invalid %s', true),__(\$this->modelClass,true)), array('action'=>'index'));\n";
		}
		$actions .= "\t\t}\n";
		$actions .= "\t\tif (\$this->{\$this->modelClass}->del(\$id)) {\n";
		if ($wannaUseSession) {
			$actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('%s deleted', true),__(\$this->modelClass,true)));\n";
			$actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n";
		} else {
			$actions .= "\t\t\t\$this->flash(sprintf(__('%s deleted', true),__(\$this->modelClass,true)), array('action'=>'index'));\n";
		}
		$actions .= "\t\t}\n";
		$actions .= "\t}\n";
		$actions .= "\n";
		return $actions;
	}
</pre>
<p>ほぼ変えてしまったので、まるまる記載しました。<br />
かなり長くはなります（笑</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_bake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP　テーブル情報の削除</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_cache_detabase_del/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_cache_detabase_del/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 23:21:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cache]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[その他クラス]]></category>
		<category><![CDATA[File]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=318</guid>
		<description><![CDATA[CakePHPではデータベースのテーブル情報をキャッシュしてくれる機能があります。]]></description>
			<content:encoded><![CDATA[<p>CakePHPではデータベースのテーブル情報をキャッシュしてくれる機能があります。<br />
「app/config/core.php」内の設定で「Configure::write(&#8216;Cache.check&#8217;, true);」を<br />
適用していると生成されませんが、「app/tmp/cache/models」に<br />
データベースのテーブル情報がキャッシュとして保存されていきます。<br />
<span id="more-318"></span></p>
<p>これはテーブル情報をキャッシュすることで、フォームヘルパーなどでも利用される情報でもあり<br />
大変便利な機能ではあります。<br />
しかし気をつける点があり、「app/config/core.php」内の設定で「Configure::write(&#8216;debug&#8217;, 0);」の設定を<br />
1以上であれば、テーブルの情報を変更しても問題は無いのですが<br />
0を指定(デバック無し)にしてテーブル情報を変更すると、変更したテーブルのフィールド情報が取得されない現象が起こります。<br />
詳しい内容は割愛させていただきますが、まぁあたりまえな話でもあります。</p>
<p>しかし、ここで問題となるのが作成するアプリケーションの機能で、任意のタイミングにテーブル情報を変更するような<br />
動的テーブルが存在するアプリケーション設計に問題が発生するかと思います。<br />
その場合、キャッシュとして保存されたテーブル情報を一度削除をしなければ、変更された状態のテーブル情報を<br />
取得することができなくなり、「find()」などでも問題となってしまいます。</p>
<p>そこで削除する方法を探してみました。<br />
単純にCakePHPには定数の「CACHE」であるキャッシュディレクトリへのパスがあるので<br />
その定数を使って削除する方法がありますが、無駄なコーディングが増えるので<br />
CakePHPの内部を調べてテストしてみたところ発見！1行のコーディングで削除できます。</p>
<p>削除するためのコーディングはこちら</p>
<pre class="brush:php">Cache::delete('ファイル名','_cake_model_')</pre>
<p>ここで注意することは指定する「ファイル名」です。<br />
この名称の指定はキャッシュ機能が「File」エンジンを利用して、設定を変更していない場合は<br />
ファイル名のプレフィックスとして「cake_model_」が自動でつきます。<br />
「ファイル名」の指定は、例えばデータベースへの接続が「default」でテーブル名が「users」の場合は<br />
「ファイル名」を「default_users」となります。</p>
<p>これでテーブルが動的な設定でもCakePHPを問題なく利用できかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_cache_detabase_del/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP　Helpersのテンプレート</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_helpers_template/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_helpers_template/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 22:41:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Helpers]]></category>
		<category><![CDATA[テンプレート]]></category>
		<category><![CDATA[ヘルパー]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=315</guid>
		<description><![CDATA[CakePHPの自作ヘルパー用のテンプレートを用意してみました。]]></description>
			<content:encoded><![CDATA[<p>CakePHPの自作ヘルパー用のテンプレートを用意してみました。<br />
毎回コーディングをするのが無駄に思えたので、自分用でもありますが。。。</p>
<p>ちなみに利用の際には「Template」の部分を変更してください。<br />
ソースコードは次になります。<br />
<span id="more-315"></span></p>
<pre class="brush:php">class TemplateHelper extends AppHelper{

	//beforeRender()
	function beforeRender() {

	}
	//afterRender()
	function afterRender() {

	}
	//beforeLayout()
	function beforeLayout() {

	}
	//afterLayout()
	function afterLayout() {

	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_helpers_template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP　Componentのテンプレート</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_component_template/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_component_template/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 23:09:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Component]]></category>
		<category><![CDATA[テンプレート]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=314</guid>
		<description><![CDATA[CakePHPの自作コンポーネント用のテンプレートを用意してみました。]]></description>
			<content:encoded><![CDATA[<p>CakePHPの自作コンポーネント用のテンプレートを用意してみました。<br />
毎回コーディングをするのが無駄に思えたので、自分用でもありますが。。。</p>
<p>ちなみに利用の際には「Template」の部分を変更してください。<br />
ソースコードは次になります。<br />
<span id="more-314"></span></p>
<pre class="brush:php">class TemplateComponent extends Object{

	//Controller
	var $controller = true;

	//startup()
	function startup(&amp;$controller){
		$this-&gt;controller = $controller;
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_component_template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP　Behaviorのテンプレート</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_behavior_template/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_behavior_template/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 23:04:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Behavior]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[テンプレート]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=311</guid>
		<description><![CDATA[CakePHPの自作ビヘイビア用のテンプレートを用意してみました。
毎回コーディングをするのが無駄に思えたので、自分用でもありますが。。。
ちなみに利用の際には「Template」の部分を変更してください。
ソースコード [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPの自作ビヘイビア用のテンプレートを用意してみました。<br />
毎回コーディングをするのが無駄に思えたので、自分用でもありますが。。。</p>
<p>ちなみに利用の際には「Template」の部分を変更してください。<br />
ソースコードは次になります。<br />
<span id="more-311"></span></p>
<pre class="brush:php">class TemplateBehavior extends ModelBehavior {

	var $settings = array();

	//setup()
	function setup(&amp;$model, $config = array()){
		$this-&gt;settings[$model-&gt;alias] = $config;
	}
	//cleanup()
	function cleanup(&amp;$model) {
		parent::cleanup($model);
	}
	//beforeFind()
	function beforeFind(&amp;$model, $query){

	}
	//afterFind()
	function afterFind(&amp;$model, $results, $primary){

	}
	//beforeValidate()
	function beforeValidate(&amp;$model){

	}
	//beforeSave()
	function beforeSave(&amp;$model){

	}
	//afterSave()
	function afterSave(&amp;$model, $created){

	}
	//beforeDelete()
	function beforeDelete(&amp;$model, $cascade = true){

	}
	//afterDelete()
	function afterDelete(&amp;$model){

	}
	//onError()
	function onError(&amp;$model, $error){

	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_behavior_template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>CakePHP　Behaviorのsetup()注意点</title>
		<link>http://blog.widget-info.net/2009/10/cakephp_behavior_setup/</link>
		<comments>http://blog.widget-info.net/2009/10/cakephp_behavior_setup/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 03:59:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Behavior]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Model]]></category>

		<guid isPermaLink="false">http://blog.widget-info.net/?p=299</guid>
		<description><![CDATA[CakePHPのビヘイビアでの注意点がひとつありましたのでメモとして。。。]]></description>
			<content:encoded><![CDATA[<p>CakePHPのビヘイビアでの注意点がひとつありましたのでメモとして。。。</p>
<p>ビヘイビアの「setup()」を利用する際に注意点がありました。<br />
特に気づかずに第2引数を変数などにセットすると、コントローラー内に<br />
2つ以上モデルが存在し、両方に同じビヘイビアを設定した場合、<br />
その設定が上書きされてしまう恐れがあります。</p>
<p>といってもイマイチな説明ですが（汗<br />
<span id="more-299"></span><br />
CakePHPの1.1から利用して同じ使い方（同じコード）で利用していたということと<br />
その現象になる設計が無かったのが幸いして、発見に至りました（笑</p>
<p>通常は1つのコントローラーに1つのモデルとしてコーディングしていきますが、<br />
設計によっては1つのコントローラーが2つのモデルを利用する場合もあるかと思います。<br />
モデル1対コントローラー1の関係で利用するビヘイビアの設計であればいいのですが<br />
ビヘイビアはモデル多対コントローラー1の考えが基本かと思います。<br />
その例としてコントローラーでは以下の使い方があると思います。</p>
<pre class="brush:php">//コントローラー内のモデル設定で
$uses=array('モデル1','モデル2');</pre>
<p>この場合、それぞれのモデルに1つのビヘイビアをセットしたとし、<br />
「setup()」の第2引数にも何かしらの設定をセットしたとします。<br />
ビヘイビアでは以下のような処理とすると</p>
<pre class="brush:php">function setup(&amp;$model, $config = array()) {
	$this-&gt;config = $config;
}</pre>
<p>ここで問題発生。。。<br />
この場合「モデル1」のビヘイビアの処理を実行しているのに、通常はモデル1に設定されている<br />
ビヘイビアの第2引数が利用されるのに、実際はモデル2の第2引数を利用しようとします。</p>
<p>どうやらCakePHP1.2の途中からビヘイビアの読み込み方が、若干変更されていたみたいですorz</p>
<p>そこで内部を調べた結果の対応策として以下の方法で対処が可能ということが判明しました。</p>
<pre class="brush:php">function setup(&amp;$model, $config = array()) {
	$this-&gt;config[$model-&gt;alias] = $config;
}</pre>
<p>こうするこで、問題なく実行しているモデルの第2引数を参照するようにすることが可能です。<br />
まぁ単純にモデル名で配列化しているというだけにはなります（笑</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.widget-info.net/2009/10/cakephp_behavior_setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
