<?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>アストロデオブログ</title>
	<atom:link href="http://astrodeo.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://astrodeo.com/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Thu, 02 Sep 2010 11:49:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>画像の切り抜き方</title>
		<link>http://astrodeo.com/blog/archives/783</link>
		<comments>http://astrodeo.com/blog/archives/783#comments</comments>
		<pubDate>Thu, 02 Sep 2010 11:44:43 +0000</pubDate>
		<dc:creator>hayachi</dc:creator>
				<category><![CDATA[デザイン]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=783</guid>
		<description><![CDATA[こんにちは、はやちです。
今日から私もブログ書くことになりました。
文章書くのはあまり得意じゃないですが毎日書いていこうと思います。
この前ゴウさんの写真をPhotoshopでひたすら切り抜いていたのですが少しやり方を忘れている部分があったので復習も兼ねて紹介します。
切り取る画像はこちら



…どっかでみたことあるような感じがしますが
だるまだけ切り抜いてみましょう。
まずペンツールでだるまさんを囲います



レイヤーのベクトルマスクサムネールでCtrl押しながらクリックすると

このように選択されます。
少しわかりにくいですが…


選択範囲を反転させて消せば

あらきれいですねー(*´・ω・)(・ω・｀*)ﾈｰ


このマスクを選択範囲に変える方法を火の見櫓を切り抜いている最後の方で
見つけて絶望しました。
それまで普通のレイヤーとパスレイヤー行ったりきたり…
ただそれだけのことです。
たぶん他にも見逃している点があると思います…がんばります。
]]></description>
			<content:encoded><![CDATA[<p>こんにちは、はやちです。</p>
<p>今日から私もブログ書くことになりました。<br />
文章書くのはあまり得意じゃないですが毎日書いていこうと思います。</p>
<p>この前ゴウさんの写真をPhotoshopでひたすら切り抜いていたのですが少しやり方を忘れている部分があったので復習も兼ねて紹介します。</p>
<p>切り取る画像はこちら<br />
<a href="http://astrodeo.com/blog/archives/783/attachment/100902" rel="attachment wp-att-786"><img src="http://astrodeo.com/blog/wp-content/uploads/2010/09/100902.jpg" alt="" title="100902" width="500" height="333" class="alignnone size-full wp-image-786" /></a></p>
<p><br/><br />
<br/></p>
<p>…どっかでみたことあるような感じがしますが<br />
だるまだけ切り抜いてみましょう。<br />
まずペンツールでだるまさんを囲います<br />
<a href="http://astrodeo.com/blog/archives/783/100902-2" rel="attachment wp-att-794"><img src="http://astrodeo.com/blog/wp-content/uploads/2010/09/100902-2.jpg" alt="" title="100902-2" width="500" height="332" class="alignleft size-full wp-image-794" /></a></p>
<p><br/><br />
<br/></p>
<p>レイヤーのベクトルマスクサムネールでCtrl押しながらクリックすると<br />
<a href="http://astrodeo.com/blog/archives/783/100902-3" rel="attachment wp-att-800"><img src="http://astrodeo.com/blog/wp-content/uploads/2010/09/100902-3.jpg" alt="" title="100902-3" width="500" height="353" class="alignright size-full wp-image-800" /></a><br />
このように選択されます。<br />
少しわかりにくいですが…</p>
<p><br/><br />
<br/></p>
<p>選択範囲を反転させて消せば<br />
<a href="http://astrodeo.com/blog/archives/783/100902-4" rel="attachment wp-att-803"><img src="http://astrodeo.com/blog/wp-content/uploads/2010/09/100902-4.jpg" alt="" title="100902-4" width="500" height="333" class="alignleft size-full wp-image-803" /></a><br />
あらきれいですねー(*´・ω・)(・ω・｀*)ﾈｰ
</p>
<p>
このマスクを選択範囲に変える方法を火の見櫓を切り抜いている最後の方で<br />
見つけて絶望しました。<br />
それまで普通のレイヤーとパスレイヤー行ったりきたり…<br />
ただそれだけのことです。<br />
たぶん他にも見逃している点があると思います…がんばります。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/783/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP始めました。</title>
		<link>http://astrodeo.com/blog/archives/780</link>
		<comments>http://astrodeo.com/blog/archives/780#comments</comments>
		<pubDate>Thu, 02 Sep 2010 11:05:07 +0000</pubDate>
		<dc:creator>oc</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=780</guid>
		<description><![CDATA[フレームワークを使用した事が無かったので昨日から始めてみました。
の、前にDB定義書を初作成。
一から作るのが楽しくて仕方ありませんが後の事を考えたら名前を付けるのに悩みます。
自分の付けた名前で悩みたくない!!という思いで作りました。でも破綻してそう。
少し悩んだのがcakephpの規約。
テーブル名は複数
と言う事で活用させて頂いたこのサイト
混乱していた私にはとても有難いサイトです。ありがとうございます！
そんな感じで今日はログイン画面の作成をしておりました。
気をつけなきゃいけない事が多々ありました。
controllerの中で使用している変数はviewではそのまま使用できないので
controller内で変数を渡す。
※例：　$this->set(&#8216;変数名&#8217;, データ);　
ここに出てくる「$this->set()」はcake/controller/controller.phpを読み込んでます。
例えば変数名に「user」が入っていればこれはviewで使用する変数名が「$user」になり
データの場所に必要なデータを格納しておくことが出来、$userの中に格納できるそうです。
※そもそもMVC(モデル、ビュー、コントローラ)を分離させる（つまり別々のファイルに分ける）
システムなので当然、モデル⇒コントローラ⇒ビューと、データを渡していく必要があります。
調べたらこのような説明があり納得。だから橋渡しするメソッドが用意されているのですね。
　
明日も頑張るぞー！
お疲れ様です。
]]></description>
			<content:encoded><![CDATA[<p>フレームワークを使用した事が無かったので昨日から始めてみました。</p>
<p>の、前にDB定義書を初作成。<br />
一から作るのが楽しくて仕方ありませんが後の事を考えたら名前を付けるのに悩みます。<br />
自分の付けた名前で悩みたくない!!という思いで作りました。でも破綻してそう。</p>
<p>少し悩んだのがcakephpの規約。</p>
<li>テーブル名は複数</li>
<p>と言う事で活用させて頂いた<a href="http://www.cpa-lab.com/tech2/inflects/"　target='blank'>このサイト</a><br />
混乱していた私にはとても有難いサイトです。ありがとうございます！</p>
<p>そんな感じで今日はログイン画面の作成をしておりました。</p>
<p>気をつけなきゃいけない事が多々ありました。</p>
<li>controllerの中で使用している変数はviewではそのまま使用できないので<br />
controller内で変数を渡す。</li>
<p>※例：　$this->set(&#8216;変数名&#8217;, データ);　<br />
ここに出てくる「$this->set()」はcake/controller/controller.phpを読み込んでます。<br />
例えば変数名に「user」が入っていればこれはviewで使用する変数名が「$user」になり<br />
データの場所に必要なデータを格納しておくことが出来、$userの中に格納できるそうです。</p>
<p>※そもそもMVC(モデル、ビュー、コントローラ)を分離させる（つまり別々のファイルに分ける）<br />
システムなので当然、モデル⇒コントローラ⇒ビューと、データを渡していく必要があります。<br />
調べたらこのような説明があり納得。だから橋渡しするメソッドが用意されているのですね。<br />
　<br />
明日も頑張るぞー！<br />
お疲れ様です。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/780/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7に初めて触ってみたぜよ</title>
		<link>http://astrodeo.com/blog/archives/775</link>
		<comments>http://astrodeo.com/blog/archives/775#comments</comments>
		<pubDate>Tue, 31 Aug 2010 10:59:55 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=775</guid>
		<description><![CDATA[9月から我が社に新しい人が来ることになったので、その人には今まで僕が作ってたパソコンを渡して、僕は新しいパソコンを買うことになりました。
今日も東京は暑かったですね。デスクトップのパソコン一台とディスプレイ二台を担いで外を歩いていたら、もう10mで汗だくですよ。移動は電車だったから、徒歩の合計時間はまあ20分足らずなものだったと思いますが、ひどいもんでした。汗が。そして汗が。
まあ、そんな俺超頑張ったんじゃね的なアピールはどうでも良いとして、パソコンを新しくしたことにより、OSがWindows XPからWindows 7になりました。7にさわるのは初めてです。
とりあえず、勝手がよく分からなかった。これを書いている今もよく分かっとらんですたい。
そういうわけで、プログラムの話とは全然関係ないんですけど、今日Windows 7の使い方で分かったことが2つほどあったので、それを備忘録として書いとこうと思います。戸惑ったのが世界で僕一人だけなら、僕が馬鹿だった、で済む話なんですけど、もしも同じことで悩んでいる人がいたら、この記事が助けになればと思います。
フォルダオプションの設定
たぶん、デフォルトではファイルの拡張子が隠れてると思うんですよ。僕のPCはそうでした。で、フォルダオプションからその設定をいじろうと思ったんですが、フォルダオプションへの行き方が最初分からなかったので、メモ。
コントロールパネル　⇒　デスクトップのカスタマイズ　⇒　フォルダ-オプション
この流れでフォルダオプションにたどり着けるようです。
今までは適当なフォルダを開くとツールにフォルダオプションがあったからねぇ……参った参った。
ツールバーに任意のショートカットなどを入れる
Windows 7ではあれなんですって？　タスクバーとツールバーの厳密な境界みたいなのがなくなったんですって？
XPのときは適当にショートカットをツールバーまで引っ張ってやればツールバーに加えることができたんですけど、7ではどうもそれができないっぽい。タスクバーに持ってくと禁止マークみたいなのが出て移動できへん。
で、その解決方法なんですが、まず、ツールバーに入れたいショートカットやらファイルのアイコンを右クリックする。そのとき、出てきたメニューの中に『タスクバーに表示する』ってのがあればそれを選ぶだけで良いんですけど、ない場合があるみたい。そういうときは、プロパティを表示します。そして、リンク先に以下を追加する。
C:\Windows\explorer.exe
たとえば、Firefoxのショートカットにこの設定を適用する場合、リンク先の中身はこんな感じになるんじゃないでしょうか。
C:\Windows\explorer.exe &#8220;C:\Program Files\Mozilla Firefox\firefox.exe&#8221;
これを追加しておくと、今まで同様にアイコンをタスクバーまで引っ張ってけばツールバーに追加できる。
どっかの記事にはWindows 7になってタスクバーは一気に進化した、みたいなことが書いてあったんですけど、いくら進化したとはいえ、急に使い勝手が変わると、やっぱり戸惑っちゃいますよね。正直、進化の度合いみたいなのは僕には分からなかった。
しょせん、まだ数時間ほどしか触っていない今の僕には理解できないようです。ま、だからってアンインストールしてXPにダウングレード、なんてことはしませんけどね。恐れを知らない戦士のように振舞って、Windows 7を飼いならしますわい。
]]></description>
			<content:encoded><![CDATA[<p>9月から我が社に新しい人が来ることになったので、その人には今まで僕が作ってたパソコンを渡して、僕は新しいパソコンを買うことになりました。</p>
<p>今日も東京は暑かったですね。デスクトップのパソコン一台とディスプレイ二台を担いで外を歩いていたら、もう10mで汗だくですよ。移動は電車だったから、徒歩の合計時間はまあ20分足らずなものだったと思いますが、ひどいもんでした。汗が。そして汗が。</p>
<p>まあ、そんな俺超頑張ったんじゃね的なアピールはどうでも良いとして、パソコンを新しくしたことにより、OSがWindows XPからWindows 7になりました。7にさわるのは初めてです。</p>
<p>とりあえず、勝手がよく分からなかった。これを書いている今もよく分かっとらんですたい。</p>
<p>そういうわけで、プログラムの話とは全然関係ないんですけど、今日Windows 7の使い方で分かったことが2つほどあったので、それを備忘録として書いとこうと思います。戸惑ったのが世界で僕一人だけなら、僕が馬鹿だった、で済む話なんですけど、もしも同じことで悩んでいる人がいたら、この記事が助けになればと思います。</p>
<h4>フォルダオプションの設定</h4>
<p>たぶん、デフォルトではファイルの拡張子が隠れてると思うんですよ。僕のPCはそうでした。で、フォルダオプションからその設定をいじろうと思ったんですが、フォルダオプションへの行き方が最初分からなかったので、メモ。</p>
<p>コントロールパネル　⇒　デスクトップのカスタマイズ　⇒　フォルダ-オプション</p>
<p>この流れでフォルダオプションにたどり着けるようです。</p>
<p>今までは適当なフォルダを開くとツールにフォルダオプションがあったからねぇ……参った参った。</p>
<h4>ツールバーに任意のショートカットなどを入れる</h4>
<p>Windows 7ではあれなんですって？　タスクバーとツールバーの厳密な境界みたいなのがなくなったんですって？</p>
<p>XPのときは適当にショートカットをツールバーまで引っ張ってやればツールバーに加えることができたんですけど、7ではどうもそれができないっぽい。タスクバーに持ってくと禁止マークみたいなのが出て移動できへん。</p>
<p>で、その解決方法なんですが、まず、ツールバーに入れたいショートカットやらファイルのアイコンを右クリックする。そのとき、出てきたメニューの中に『タスクバーに表示する』ってのがあればそれを選ぶだけで良いんですけど、ない場合があるみたい。そういうときは、プロパティを表示します。そして、リンク先に以下を追加する。</p>
<p>C:\Windows\explorer.exe</p>
<p>たとえば、Firefoxのショートカットにこの設定を適用する場合、リンク先の中身はこんな感じになるんじゃないでしょうか。</p>
<p>C:\Windows\explorer.exe &#8220;C:\Program Files\Mozilla Firefox\firefox.exe&#8221;</p>
<p>これを追加しておくと、今まで同様にアイコンをタスクバーまで引っ張ってけばツールバーに追加できる。</p>
<p>どっかの記事にはWindows 7になってタスクバーは一気に進化した、みたいなことが書いてあったんですけど、いくら進化したとはいえ、急に使い勝手が変わると、やっぱり戸惑っちゃいますよね。正直、進化の度合いみたいなのは僕には分からなかった。</p>
<p>しょせん、まだ数時間ほどしか触っていない今の僕には理解できないようです。ま、だからってアンインストールしてXPにダウングレード、なんてことはしませんけどね。恐れを知らない戦士のように振舞って、Windows 7を飼いならしますわい。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/775/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cake1.3.3にしたら動かなくなった</title>
		<link>http://astrodeo.com/blog/archives/761</link>
		<comments>http://astrodeo.com/blog/archives/761#comments</comments>
		<pubDate>Thu, 26 Aug 2010 10:32:48 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=761</guid>
		<description><![CDATA[現在絶賛開発中のサービスがあるんですけど、最初はcakephpの1.3.0で開発してたんですが、1.3.3にしてみようと上から言われまして、cakeフォルダの中身だけ変えてみたんですよ。
そしたらま～……いろいろと動かなくなりました。いろいろなところでWarningって言われたり言われなかったり……何も表示されなくなったりならなかったり。
とりあえず、そのうちのいくつかをここに書いておこうと思います。
$this->renderElementがなくなった
ビューのエレメントを呼び出すとき、renderElement()ってメソッドを今まで使ってましたが、こいつがどうやらなくなったらしい。なくなったというか、正確には$this->element()というメソッドに変わったらしい。renderElementっていうメソッド名、結構気に入ってたのになぁ……。
フォームヘルパーのshowEmptyもなくなった
たとえばフォームヘルパーでセレクトボックスを作る場合、空のオプションを出さないようにするにはこんな書き方をしていたと思います。


echo $form->select('column', $select, null, null, false);


でも、この第5引数がなくなったみたいです。上と同じような挙動をさせるには、今度は第4引数に記述する必要があるみたい。


echo $form->select('column', $select, null, array('empty' => false));


まあ、ダメ……ではないけど、いきなり変ると戸惑っちゃいますね。あれ？　何で空のオプションがなくならへんのん？　ってね。
$model->del()までもなくなった
DBのデータを消す際に使っていたdel()がなくなって、今度からはdelete()一色になったみたいです。まあ、そんなに大きくは変わらないけど、普通にdel()を使っている部分があったので、ちょい直しが必要だった。
$session->flash()はechoしてあげないといけない
今までは$session->flash()って書いとくだけで、必要なメッセージが出力できてたんですけど、今度からはechoをつけてあげないとダメみたいです。正直、最初は何で出なくなったのか全然分からなかった。
デバッグログはデフォルトでは見れない
core.phpの中でConfigure::write(&#8216;debug&#8217;, 2)にしておけば、今までは何事もなくSQLログとか見れていたんですけど、今度からはちゃんとビュー側で必要なビューファイルを呼び出してあげないといけないみたい。


echo $this->element('sql_dump');


さっそくrenderElementじゃなくなったってのを活かすときが来ましたね。
ちなみに、/cake/libs/view/elements/にデフォルトでsql_dump.ctpが入っているのですが、これをapp側に持って来ていろいろとカスタマイズしても良いみたいです。例えばFirefoxで開発してるなら、ログをFirebugのコンソールに出力させることもできる。今まではプラグインを使わないと実現できなかったんですけど、これからはお手軽にFirebugで見られるようになったみたいですね。
カスタマイズの方法は、sql_dump.ctpの以下の部分を書き換える。50行目付近かな……？





ただ、個人的にはちょっと見づらい気がする。
今回引っかかったところは、こんなところですかね。
その他いろいろ変わってるところは、Cake1.3移行ガイドとかを見れば分かると思います。僕もまだ全部は見てないので、また何かあったら追記するかもです。
]]></description>
			<content:encoded><![CDATA[<p>現在絶賛開発中のサービスがあるんですけど、最初はcakephpの1.3.0で開発してたんですが、1.3.3にしてみようと上から言われまして、cakeフォルダの中身だけ変えてみたんですよ。</p>
<p>そしたらま～……いろいろと動かなくなりました。いろいろなところでWarningって言われたり言われなかったり……何も表示されなくなったりならなかったり。</p>
<p>とりあえず、そのうちのいくつかをここに書いておこうと思います。</p>
<h4>$this->renderElementがなくなった</h4>
<p>ビューのエレメントを呼び出すとき、renderElement()ってメソッドを今まで使ってましたが、こいつがどうやらなくなったらしい。なくなったというか、正確には$this->element()というメソッドに変わったらしい。renderElementっていうメソッド名、結構気に入ってたのになぁ……。</p>
<h4>フォームヘルパーのshowEmptyもなくなった</h4>
<p>たとえばフォームヘルパーでセレクトボックスを作る場合、空のオプションを出さないようにするにはこんな書き方をしていたと思います。</p>
<textarea name="code" class="php:nocontrols" cols="30" rows="5">

echo $form->select('column', $select, null, null, false);

</textarea>
<p>でも、この第5引数がなくなったみたいです。上と同じような挙動をさせるには、今度は第4引数に記述する必要があるみたい。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

echo $form->select('column', $select, null, array('empty' => false));

</textarea>
<p>まあ、ダメ……ではないけど、いきなり変ると戸惑っちゃいますね。あれ？　何で空のオプションがなくならへんのん？　ってね。</p>
<h4>$model->del()までもなくなった</h4>
<p>DBのデータを消す際に使っていたdel()がなくなって、今度からはdelete()一色になったみたいです。まあ、そんなに大きくは変わらないけど、普通にdel()を使っている部分があったので、ちょい直しが必要だった。</p>
<h4>$session->flash()はechoしてあげないといけない</h4>
<p>今までは$session->flash()って書いとくだけで、必要なメッセージが出力できてたんですけど、今度からはechoをつけてあげないとダメみたいです。正直、最初は何で出なくなったのか全然分からなかった。</p>
<h4>デバッグログはデフォルトでは見れない</h4>
<p>core.phpの中でConfigure::write(&#8216;debug&#8217;, 2)にしておけば、今までは何事もなくSQLログとか見れていたんですけど、今度からはちゃんとビュー側で必要なビューファイルを呼び出してあげないといけないみたい。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

echo $this->element('sql_dump');

</textarea>
<p>さっそくrenderElementじゃなくなったってのを活かすときが来ましたね。</p>
<p>ちなみに、/cake/libs/view/elements/にデフォルトでsql_dump.ctpが入っているのですが、これをapp側に持って来ていろいろとカスタマイズしても良いみたいです。例えばFirefoxで開発してるなら、ログをFirebugのコンソールに出力させることもできる。今まではプラグインを使わないと実現できなかったんですけど、これからはお手軽にFirebugで見られるようになったみたいですね。</p>
<p>カスタマイズの方法は、sql_dump.ctpの以下の部分を書き換える。50行目付近かな……？</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

<?php
	foreach ($logInfo['log'] as $k => $i) :
		echo "<tr><td>" . ($k + 1) . "</td><td>" . h($i['query']) . "</td><td>{$i['error']}</td><td style = \"text-align: right\">{$i['affected']}</td><td style = \"text-align: right\">{$i['numRows']}</td><td style = \"text-align: right\">{$i['took']}</td></tr>\n";
	endforeach;
?>

↓

<?php
	foreach ($logInfo['log'] as $k => $i) :
		echo $this->Html->scriptBlock('console.log("' . $i['query'] . '")');
	endforeach;
?>

</textarea>
<p>ただ、個人的にはちょっと見づらい気がする。</p>
<p>今回引っかかったところは、こんなところですかね。</p>
<p>その他いろいろ変わってるところは、<a href="http://hiromi2424.lv9.org/translate/cakephp13/" target="_blank">Cake1.3移行ガイド</a>とかを見れば分かると思います。僕もまだ全部は見てないので、また何かあったら追記するかもです。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/761/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>まとめてunbindModelするとき</title>
		<link>http://astrodeo.com/blog/archives/750</link>
		<comments>http://astrodeo.com/blog/archives/750#comments</comments>
		<pubDate>Wed, 18 Aug 2010 09:13:44 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=750</guid>
		<description><![CDATA[CakePHPでModelにアソシエーションの設定を書いた場合、必要のないところでは自分でunbindModelメソッドを使うことになるわけですが、紐づいているテーブルがたくさんある場合とか、後々仕様が変更になって新しいテーブルを紐づけたりした場合とか、いちいちunbindModelに全モデル名を列挙するのはめんどうですよね。特に仕様変更によってunbindModelの中身を修正する必要が出て来た場合、いろんな箇所でunbindModelしてたら、いちいち探して修正するのは効率も悪いです。
そんなときは、recursiveを-1にするといいみたいです。


$params = array('recursive' => -1);
$data = $this->Model->find('all', $params);


これなら、後で紐づき方がどう変わろうが、関係ないです。
ただし、特定のモデルだけをbindModelしたい場合は、この方法ではダメです。そういうときはコンテイナブルを使うといいみたいですが、それはまた別の話。
というか、俺自身がまずコンテイナブルを上手く扱えない（よく分かっていない）ので、記事にするのは早いｗｗ
もちっと勉強しておきます。まだ慌てるような時間でもないので。
]]></description>
			<content:encoded><![CDATA[<p>CakePHPでModelにアソシエーションの設定を書いた場合、必要のないところでは自分でunbindModelメソッドを使うことになるわけですが、紐づいているテーブルがたくさんある場合とか、後々仕様が変更になって新しいテーブルを紐づけたりした場合とか、いちいちunbindModelに全モデル名を列挙するのはめんどうですよね。特に仕様変更によってunbindModelの中身を修正する必要が出て来た場合、いろんな箇所でunbindModelしてたら、いちいち探して修正するのは効率も悪いです。</p>
<p>そんなときは、recursiveを-1にするといいみたいです。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$params = array('recursive' => -1);
$data = $this->Model->find('all', $params);

</textarea>
<p>これなら、後で紐づき方がどう変わろうが、関係ないです。</p>
<p>ただし、特定のモデルだけをbindModelしたい場合は、この方法ではダメです。そういうときは<a href="http://book.cakephp.org/ja/view/474/Containable" target="_blank">コンテイナブル</a>を使うといいみたいですが、それはまた別の話。</p>
<p>というか、俺自身がまずコンテイナブルを上手く扱えない（よく分かっていない）ので、記事にするのは早いｗｗ</p>
<p>もちっと勉強しておきます。まだ慌てるような時間でもないので。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/750/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitterみたいなURL表示にしたい</title>
		<link>http://astrodeo.com/blog/archives/713</link>
		<comments>http://astrodeo.com/blog/archives/713#comments</comments>
		<pubDate>Thu, 05 Aug 2010 01:31:41 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/713</guid>
		<description><![CDATA[twitterをやっている方はご存知だと思いますが、twitterでユーザーのプロフィールページに行くと、URLは↓こんな感じになっていますよね。


http://twitter.com/ユーザー名(screen_name)


CakePHPで開発をしている場合、普通は、ドメイン名の下にはコントローラー名が来ます。で、その下にはアクション名が来ます。だからあるコントローラーのあるアクションを呼び出せば、URLは例えば↓こんな感じになるでしょうか。


http://ドメイン名/コントローラー名/アクション名/ユーザー名


これをtwitterと同じような表示にしたい。果たしてそんなことが可能なのかというと、可能のようです。
世の中、たいていのことは頑張れば可能になるみたいですね。世界中のカラスを白く染め上げることも、ものすごい頑張れば可能なのかもしれません。それを100%立証することは不可能ですけれど、まあそんなことはどうでもいいです。
例えば、usersというコントローラーにprofileというアクションを設け、そこでユーザーのプロフィールページを表示させたいとします。その場合は、routes.phpに以下の一文を書きます。


Router::connect('/:name/', array('controller' => 'users', 'action' => 'profile'));


この『:name』というのがポイントのようです。こうやっておくと、twitterみたいにドメイン名の下にユーザー名を書けば、usersコントローラーのprofileが呼ばれます。


//URLにアクセス

http://test.com/macchi

//コントローラー側の処理
class UsersController extends AppController {
    function profile() {
        $user_name = $this->params['url']['url'];
        echo $user_name;
    }
}

//出力結果
macchi


上記の場合だと$this->params['url']['url']にmacchiという文字列が入って来るので、あとはそれを好きに使ってあれこれ処理すればOKです。
ただし、こういう設定にすると、例えばusersのindexを呼びたいときに『http://test.com/users』と書いても、indexメソッドを呼んではくれません。『users』というユーザー名だと認識して、profileメソッドが呼ばれます。だからこの設定にしてしまったら、indexメソッドを呼び出す場合もindexを省略せずに書くしかない（http://test.com/users/index）……と思っているのですが、何か回避策とかあるのかしら？
まあ、仮にusersという文字列が来たときだけusersコントローラーのindexを見に行くように設定したら、本当に『users』というユーザー名の人がいたときに、その人のプロフィールページ見れないもんね。だから仕方ないのかな……。
]]></description>
			<content:encoded><![CDATA[<p>twitterをやっている方はご存知だと思いますが、twitterでユーザーのプロフィールページに行くと、URLは↓こんな感じになっていますよね。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

http://twitter.com/ユーザー名(screen_name)

</textarea>
<p>CakePHPで開発をしている場合、普通は、ドメイン名の下にはコントローラー名が来ます。で、その下にはアクション名が来ます。だからあるコントローラーのあるアクションを呼び出せば、URLは例えば↓こんな感じになるでしょうか。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

http://ドメイン名/コントローラー名/アクション名/ユーザー名

</textarea>
<p>これをtwitterと同じような表示にしたい。果たしてそんなことが可能なのかというと、可能のようです。</p>
<p>世の中、たいていのことは頑張れば可能になるみたいですね。世界中のカラスを白く染め上げることも、ものすごい頑張れば可能なのかもしれません。それを100%立証することは不可能ですけれど、まあそんなことはどうでもいいです。</p>
<p>例えば、usersというコントローラーにprofileというアクションを設け、そこでユーザーのプロフィールページを表示させたいとします。その場合は、routes.phpに以下の一文を書きます。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

Router::connect('/:name/', array('controller' => 'users', 'action' => 'profile'));

</textarea>
<p>この『:name』というのがポイントのようです。こうやっておくと、twitterみたいにドメイン名の下にユーザー名を書けば、usersコントローラーのprofileが呼ばれます。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

//URLにアクセス

http://test.com/macchi

//コントローラー側の処理
class UsersController extends AppController {
    function profile() {
        $user_name = $this->params['url']['url'];
        echo $user_name;
    }
}

//出力結果
macchi

</textarea>
<p>上記の場合だと$this->params['url']['url']にmacchiという文字列が入って来るので、あとはそれを好きに使ってあれこれ処理すればOKです。</p>
<p>ただし、こういう設定にすると、例えばusersのindexを呼びたいときに『http://test.com/users』と書いても、indexメソッドを呼んではくれません。『users』というユーザー名だと認識して、profileメソッドが呼ばれます。だからこの設定にしてしまったら、indexメソッドを呼び出す場合もindexを省略せずに書くしかない（http://test.com/users/index）……と思っているのですが、何か回避策とかあるのかしら？</p>
<p>まあ、仮にusersという文字列が来たときだけusersコントローラーのindexを見に行くように設定したら、本当に『users』というユーザー名の人がいたときに、その人のプロフィールページ見れないもんね。だから仕方ないのかな……。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/713/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>データ送信時のパスワードのハッシュ化</title>
		<link>http://astrodeo.com/blog/archives/709</link>
		<comments>http://astrodeo.com/blog/archives/709#comments</comments>
		<pubDate>Tue, 03 Aug 2010 07:44:27 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=709</guid>
		<description><![CDATA[CakePHPで会員登録画面を作っていたときのことなのだけど、パスワードを入力する項目と、確認用にもう一度パスワードを入力する項目を、フォームヘルパーのパスワードメソッドを使って作っていたわけです。


echo $form->password('password');

echo $form->password('password_confirm');


で、最初は何の問題もなく動作していたんですが、いろいろと他の部分も作成してサーバーにファイルをアップしているうちに、この部分が正常に動かなくなった。具体的に言うと、確認用じゃない方のパスワードの値だけ自動的にハッシュ化されてしまい、パスワードと確認用のパスワードが一致せずにエラーになってしまうという、そんな状態に陥りました。
で、調べてみたのですが、こちらさんのページの中に、こんなことが書いてあった。
コントローラのアクションで$this->dataを利用する時やモデルでデータを検証しようとする時にはすでにハッシュ化されたパスワードになっています。したがって単純に&#8217;password&#8217;と&#8217;password_confirm&#8217;の入力の同一性を確認したり、&#8217;password&#8217;フィールドに検証ルールを設定して文字数チェックを行うなどの検証ができません。これはAuthComponentがアクションを実行する前にフォームから送られたデータにユーザー名とパスワードに相当するフィールド（$fieldsプロパティで設定可能）が揃っているとパスワードをハッシュ化するようになっているからです。
おおう、なるほど。だからか。
確かに、作ったばかりのときはまだAuthComponentを適用させていませんでしたからね。ただ登録ができるってだけで、実際に会員のログイン処理を入れたのはだいぶ経ってからのこと。
うん、確かにね、前にも同じようなことがあったから、むしろ何で今回はハッシュ化されずにデータが送信できているんだろうと、疑問に思わなかったわけではないんですよ。本当だよ？　でもまあ、登録されるまではハッシュ化されない方が都合が良かったから、何かよく分かんないけど良いやって思ってほっといたんです。
まあそういうわけなので、これを回避するにはテキストフィールドに適当な名前をつけといて、データ送信時にハッシュ化した値をパスワードとして使っているフィールドに入れなおすとか、AuthComponentのフィールドを別の名前に変えておくとか、そういう方法を取る必要がありますね。


//例１
//ビュー
echo $form->password('pass');

//データ登録時（コントローラー）
$this->data['Model']['password'] = $this->Auth->password($this->data['Model']['pass']);

//例２
//コントローラー
$this->Auth->fields('username' => 'username', 'password' => 'pass');

//ビュー
echo $form->password('password');


すごい端折った書き方ですが、こんな感じでしょうか。
しかし、やはりと言うべきか、よく分かんないけど望むとおりに動いてるから何となくオーケーだ、で物事を済ますのは、よろしくないですね。今回、そのことを再認識した次第にございます。
もっとちゃんと考えよう（今後の人生とか）
]]></description>
			<content:encoded><![CDATA[<p>CakePHPで会員登録画面を作っていたときのことなのだけど、パスワードを入力する項目と、確認用にもう一度パスワードを入力する項目を、フォームヘルパーのパスワードメソッドを使って作っていたわけです。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

echo $form->password('password');

echo $form->password('password_confirm');

</textarea>
<p>で、最初は何の問題もなく動作していたんですが、いろいろと他の部分も作成してサーバーにファイルをアップしているうちに、この部分が正常に動かなくなった。具体的に言うと、確認用じゃない方のパスワードの値だけ自動的にハッシュ化されてしまい、パスワードと確認用のパスワードが一致せずにエラーになってしまうという、そんな状態に陥りました。</p>
<p>で、調べてみたのですが、<a href="http://www.garacter.com/notes/CakePHP+Note:AuthComponent/pi:231" target="_blank">こちらさん</a>のページの中に、こんなことが書いてあった。</p>
<p><strong>コントローラのアクションで$this->dataを利用する時やモデルでデータを検証しようとする時にはすでにハッシュ化されたパスワードになっています。したがって単純に&#8217;password&#8217;と&#8217;password_confirm&#8217;の入力の同一性を確認したり、&#8217;password&#8217;フィールドに検証ルールを設定して文字数チェックを行うなどの検証ができません。これはAuthComponentがアクションを実行する前にフォームから送られたデータにユーザー名とパスワードに相当するフィールド（$fieldsプロパティで設定可能）が揃っているとパスワードをハッシュ化するようになっているからです。</strong></p>
<p>おおう、なるほど。だからか。</p>
<p>確かに、作ったばかりのときはまだAuthComponentを適用させていませんでしたからね。ただ登録ができるってだけで、実際に会員のログイン処理を入れたのはだいぶ経ってからのこと。</p>
<p>うん、確かにね、前にも同じようなことがあったから、むしろ何で今回はハッシュ化されずにデータが送信できているんだろうと、疑問に思わなかったわけではないんですよ。本当だよ？　でもまあ、登録されるまではハッシュ化されない方が都合が良かったから、何かよく分かんないけど良いやって思ってほっといたんです。</p>
<p>まあそういうわけなので、これを回避するにはテキストフィールドに適当な名前をつけといて、データ送信時にハッシュ化した値をパスワードとして使っているフィールドに入れなおすとか、AuthComponentのフィールドを別の名前に変えておくとか、そういう方法を取る必要がありますね。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

//例１
//ビュー
echo $form->password('pass');

//データ登録時（コントローラー）
$this->data['Model']['password'] = $this->Auth->password($this->data['Model']['pass']);

//例２
//コントローラー
$this->Auth->fields('username' => 'username', 'password' => 'pass');

//ビュー
echo $form->password('password');

</textarea>
<p>すごい端折った書き方ですが、こんな感じでしょうか。</p>
<p>しかし、やはりと言うべきか、よく分かんないけど望むとおりに動いてるから何となくオーケーだ、で物事を済ますのは、よろしくないですね。今回、そのことを再認識した次第にございます。</p>
<p>もっとちゃんと考えよう（今後の人生とか）</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/709/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSVヘルパーを使ってみよう（CakePHPで）</title>
		<link>http://astrodeo.com/blog/archives/705</link>
		<comments>http://astrodeo.com/blog/archives/705#comments</comments>
		<pubDate>Tue, 27 Jul 2010 14:42:26 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=705</guid>
		<description><![CDATA[CSV（チャンピオンに必要なものそれはヴィクトリー）をPHP側で出力しようとした場合、自分でfputcsvとかを使って頑張ってもいいのですが、文字列の処理が以外と面倒だったりすることもありますよね。上手くいったつもりでもいざファイルの中身を見てみたら列がずれちゃってたりとかもするし。
そこで役立つのがCSVヘルパー。チャンピオンになるための条件すなわちヴィクトリーをもたらしてくれる優秀な助っ人です。
使い方は簡単。ソースをコピペってcsv.phpとでも名前つけてhelpersに置くだけ。ソースはここから持って来ることができます。PHP5専用のを使ってもいいのですが、一応PHP4と互換のある方を使ってみましょう。まあ、どっちもやり方はたいして違いません。
ソースをコピーしたらあとはコントローラーとビューで以下のような処理をすればOKです。余分なソースは省略して書きまっする。


//コントローラー
class CsvController extends AppController {
    var $uses = array('User');
    var $helpers = array('Csv');

    function csv() {
        $data = $this->User->find('all');
        $this->set(compact('data'));
    }
}

//ビュー（csv.ctp）



主に必要なのはこんだけです。
$csv->render()の第一引数をtrueにすると、ファイルをダウンロードできます。falseにすると、ブラウザ上にデータが出力されるだけになります。デフォルトはtrueになっています。
$csv->addGrid()の第二引数をtrueにすると、テーブルのカラム（たとえばusernameとかpasswordとか）も出力されます。正確には配列のキーになっている部分ですが、上記みたいにデータをセットすると、テーブルのカラム名がそのまま配列のキーになりますからね。必要なければfalseにしておくといいでしょう。デフォルトはtrueです。
CSVはExcelで見ることが多いと思うので、文字コードはSJISに変換しておいた方がいいような気がします。$csv->render()の第二引数、第三引数でその辺の設定もできます。
参考サイトはこちらです。
]]></description>
			<content:encoded><![CDATA[<p>CSV（<strong>チ</strong>ャンピオンに必要なもの<strong>そ</strong>れは<strong>ヴィ</strong>クトリー）をPHP側で出力しようとした場合、自分でfputcsvとかを使って頑張ってもいいのですが、文字列の処理が以外と面倒だったりすることもありますよね。上手くいったつもりでもいざファイルの中身を見てみたら列がずれちゃってたりとかもするし。</p>
<p>そこで役立つのがCSVヘルパー。チャンピオンになるための条件すなわちヴィクトリーをもたらしてくれる優秀な助っ人です。</p>
<p>使い方は簡単。ソースをコピペってcsv.phpとでも名前つけてhelpersに置くだけ。ソースは<a href="http://ifunk.net/cakephp/helpers/csv.php.txt" target="_blank">ここ</a>から持って来ることができます。PHP5専用のを使ってもいいのですが、一応PHP4と互換のある方を使ってみましょう。まあ、どっちもやり方はたいして違いません。</p>
<p>ソースをコピーしたらあとはコントローラーとビューで以下のような処理をすればOKです。余分なソースは省略して書きまっする。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

//コントローラー
class CsvController extends AppController {
    var $uses = array('User');
    var $helpers = array('Csv');

    function csv() {
        $data = $this->User->find('all');
        $this->set(compact('data'));
    }
}

//ビュー（csv.ctp）
<?php
$csv->addGrid($data,false);
$csv->setFilename('sample.csv');
echo $csv->render(true, 'SJIS', 'UTF-8');
?>

</textarea>
<p>主に必要なのはこんだけです。</p>
<p>$csv->render()の第一引数をtrueにすると、ファイルをダウンロードできます。falseにすると、ブラウザ上にデータが出力されるだけになります。デフォルトはtrueになっています。</p>
<p>$csv->addGrid()の第二引数をtrueにすると、テーブルのカラム（たとえばusernameとかpasswordとか）も出力されます。正確には配列のキーになっている部分ですが、上記みたいにデータをセットすると、テーブルのカラム名がそのまま配列のキーになりますからね。必要なければfalseにしておくといいでしょう。デフォルトはtrueです。</p>
<p>CSVはExcelで見ることが多いと思うので、文字コードはSJISに変換しておいた方がいいような気がします。$csv->render()の第二引数、第三引数でその辺の設定もできます。</p>
<p>参考サイトは<a href="http://torhamzedd.blogspot.com/2010/01/cakephp12csv1.html">こちら</a>です。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/705/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>元のページに戻って来る</title>
		<link>http://astrodeo.com/blog/archives/699</link>
		<comments>http://astrodeo.com/blog/archives/699#comments</comments>
		<pubDate>Tue, 20 Jul 2010 05:22:05 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=699</guid>
		<description><![CDATA[表示側で会員のログインフォームがサイドバーなんかにある場合に、ログインしたら常に特定のページへリダイレクトするのではなく、できればそのままのページにいたいですよね。
要はリファラーを取得できればいいわけですが、CakePHPのcontroller.phpを見てみると、refererというメソッドがあります。これを使うと、あっさりとリファラーを取得できる。
なので


$this->redirect($this->referer());


ログインアクションにこんな一文を書いとけば、いっこ前のページに戻ってくれます。
ただ、あれですね。例えば会員用のマイページみたいなのがあって、ログアウトしている状態でそのページに行こうとすると、強制的にログイン画面に飛ばすような処理があった場合、上手くリファラは取れません。
トップページ　⇒　マイページ　⇒　ログインしていない状態だったのでログインページにリダイレクト
この場合のリファラはトップページになっています。だから、ログインしたらトップページに戻ってしまいますね。
あとはあれ。ログイン画面でログインに失敗した場合、リファラは今いるログイン画面になってしまうので、その状態でログインすると、無限ループになってしまいます。
ログイン画面がなく、ログアウト状態でマイページに飛んだら今のページに自動的に戻って来るとか、ログインフォームでログインに失敗してもエラーメッセージが出るだけでやっぱり今のページにいるままになるとか、そんな感じの仕様なら大丈夫だと思うんですけど、そうでなければこいつだけでは上手く対応できないかもですね。
まあ、便利な関数だとは思うんですけど、これ一つあれば万事解決ってほどの破壊力はない、ドラクエの呪文で言うとニフラムくらいの位置づけですかね？　それかザメハ。
]]></description>
			<content:encoded><![CDATA[<p>表示側で会員のログインフォームがサイドバーなんかにある場合に、ログインしたら常に特定のページへリダイレクトするのではなく、できればそのままのページにいたいですよね。</p>
<p>要はリファラーを取得できればいいわけですが、CakePHPのcontroller.phpを見てみると、refererというメソッドがあります。これを使うと、あっさりとリファラーを取得できる。</p>
<p>なので</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$this->redirect($this->referer());

</textarea>
<p>ログインアクションにこんな一文を書いとけば、いっこ前のページに戻ってくれます。</p>
<p>ただ、あれですね。例えば会員用のマイページみたいなのがあって、ログアウトしている状態でそのページに行こうとすると、強制的にログイン画面に飛ばすような処理があった場合、上手くリファラは取れません。</p>
<p>トップページ　⇒　マイページ　⇒　ログインしていない状態だったのでログインページにリダイレクト</p>
<p>この場合のリファラはトップページになっています。だから、ログインしたらトップページに戻ってしまいますね。</p>
<p>あとはあれ。ログイン画面でログインに失敗した場合、リファラは今いるログイン画面になってしまうので、その状態でログインすると、無限ループになってしまいます。</p>
<p>ログイン画面がなく、ログアウト状態でマイページに飛んだら今のページに自動的に戻って来るとか、ログインフォームでログインに失敗してもエラーメッセージが出るだけでやっぱり今のページにいるままになるとか、そんな感じの仕様なら大丈夫だと思うんですけど、そうでなければこいつだけでは上手く対応できないかもですね。</p>
<p>まあ、便利な関数だとは思うんですけど、これ一つあれば万事解決ってほどの破壊力はない、ドラクエの呪文で言うとニフラムくらいの位置づけですかね？　それかザメハ。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/699/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>フォームヘルパーのチェックボックスの取り扱い</title>
		<link>http://astrodeo.com/blog/archives/689</link>
		<comments>http://astrodeo.com/blog/archives/689#comments</comments>
		<pubDate>Mon, 12 Jul 2010 12:04:27 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=689</guid>
		<description><![CDATA[CakePHPのフォームヘルパーでチェックボックスを出力したときのお話。
デフォルトの状態でチェックをつけておくには、第２引数の属性にチェックを入れればいいのだけど（↓こんな感じで）


echo $form-&#62;checkbox('test', array('checked' =&#62; 'checked'));


例えば、DBに登録されているデータから特定のチェックボックスにだけチェックを入れたい、みたいなとき。
これはつい先日実際にあったお話ですが（別にホラーじゃないよ）、学校検索のページを作ってて、検索用のワードと学校の情報をHABTMで紐づけたんすよ。で、キーワードの新規入力画面で該当する学校を一覧から複数、チェックボックスで指定すると、そんな感じです。
例えば、『テニスが強い』というキーワードに『青春学園』『立海大付属』『氷帝学園』を紐づける、みたいな感じです。
HABTMでアソシエーションして、このキーワードのデータを引っ張ってくると、もちろん上記の3校のデータも同時に引っ張ってこれるわけですが、編集画面に行ったとき、この3校の部分にはあらかじめチェックが入っているのが望ましいっすよね。
HABTMってどうもデータの形が変則的で、だから引っ張って来たデータをそのまま$this-&#62;dataにぶっ込むだけだと、チェックがついてくれないみたいなんですね。青学不二の消えるサーブ並に「そのチェック、消えるよ」ってな具合です。
で、どうしようってなことになりまして、フォームヘルパーを読んでみたんですけど、checkboxのメソッドを見ると、こんなようなことが書いてありました。


$options = $this-&#62;_initInputField($fieldName, $options);
$value = current($this-&#62;value());

if (!isset($options['value']) &#124;&#124; empty($options['value'])) {
$options['value'] = 1;
} elseif (!empty($value) &#38;&#38; $value === $options['value']) {
$options['checked'] = 'checked';
}


まあ何のことやらよう分かりませんが、いろいろやってみたところ、どうやらチェックボックスのvalueとデータのvalueが完全に等しければ、デフォルトでチェックを入れてやるよにゃろうってことみたいです。
なので、まずはチェックボックスに適当なvalueを入れておく。


echo $form-&#62;checkbox('Model.school.1', array('value' =&#62; '1'));

echo $form-&#62;checkbox('Model.school.2', array('value' =&#62; '2'));


そしたらコントローラーとかで、valueと同じ値をデータに入れる。


$this-&#62;data['Model']['school'][1] = 1;

$this-&#62;data['Model']['school'][2] = 2;


よし、これでOK……と思ったそこのあなた。まだまだだね。
いや、俺もこれでできると最初は思ったんすけど、曲者なのがフォームヘルパーの中身の↓の部分。


$value === $options['value']


イコールが3つってことは型も一緒じゃないとダメよってことになりますが、上記のような書き方だと、チェックボックスの中のvalueはstring型になりますが、その下の、自分でvalueを入れている方はおそらくinteger型になります。なので、これをstring型で入れる必要がある。


$i = 1;

settype($i, 'string');

$this-&#62;data['Model']['school'][1] = $i;


settypeっていうのは、型を指定するときに使う関数だそうです。こんなん初めて使いましたわい。
まあ、こんなことしなくても多分


$this-&#62;data['Model']['school'][1] = '1';


みたいに書けば、string型になるような気もしますけれど……ってか、なるよね。
……と、こんな長ったらしい説明をしてはみましたが、これを書いたあとにいろいろとソースをいじってたら、何もしなくても$this-&#62;dataにデータを入れるだけで勝手に必要なところだけチェックがつくようになりました。何でだろ？
HABTMはよく分からないですね。たぶん、ツンデレとかいうやつなんだと思います。
ちょこっと調べた限りでは、MySQLはデータを持って来るときに暗黙の型変換とかいうのがそこはかとなく行われているみたいで、int型のデータもstring型になっていたりするらしいのですが、その辺りはまだ調査不足なので、またいずれ。
ふと思ったんですけど、俺、解決したら書きますとかもうちょっと調べて何か分かったらいずれ追記しますとか言って、今まで実行したことないですよね……たぶん。
]]></description>
			<content:encoded><![CDATA[<p>CakePHPのフォームヘルパーでチェックボックスを出力したときのお話。</p>
<p>デフォルトの状態でチェックをつけておくには、第２引数の属性にチェックを入れればいいのだけど（↓こんな感じで）</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

echo $form-&gt;checkbox('test', array('checked' =&gt; 'checked'));

</textarea>
<p>例えば、DBに登録されているデータから特定のチェックボックスにだけチェックを入れたい、みたいなとき。</p>
<p>これはつい先日実際にあったお話ですが（別にホラーじゃないよ）、学校検索のページを作ってて、検索用のワードと学校の情報をHABTMで紐づけたんすよ。で、キーワードの新規入力画面で該当する学校を一覧から複数、チェックボックスで指定すると、そんな感じです。</p>
<p>例えば、『テニスが強い』というキーワードに『青春学園』『立海大付属』『氷帝学園』を紐づける、みたいな感じです。</p>
<p>HABTMでアソシエーションして、このキーワードのデータを引っ張ってくると、もちろん上記の3校のデータも同時に引っ張ってこれるわけですが、編集画面に行ったとき、この3校の部分にはあらかじめチェックが入っているのが望ましいっすよね。</p>
<p>HABTMってどうもデータの形が変則的で、だから引っ張って来たデータをそのまま$this-&gt;dataにぶっ込むだけだと、チェックがついてくれないみたいなんですね。青学不二の消えるサーブ並に「そのチェック、消えるよ」ってな具合です。</p>
<p>で、どうしようってなことになりまして、フォームヘルパーを読んでみたんですけど、checkboxのメソッドを見ると、こんなようなことが書いてありました。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$options = $this-&gt;_initInputField($fieldName, $options);
$value = current($this-&gt;value());

if (!isset($options['value']) || empty($options['value'])) {
$options['value'] = 1;
} elseif (!empty($value) &amp;&amp; $value === $options['value']) {
$options['checked'] = 'checked';
}

</textarea>
<p>まあ何のことやらよう分かりませんが、いろいろやってみたところ、どうやらチェックボックスのvalueとデータのvalueが完全に等しければ、デフォルトでチェックを入れてやるよにゃろうってことみたいです。</p>
<p>なので、まずはチェックボックスに適当なvalueを入れておく。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

echo $form-&gt;checkbox('Model.school.1', array('value' =&gt; '1'));

echo $form-&gt;checkbox('Model.school.2', array('value' =&gt; '2'));

</textarea>
<p>そしたらコントローラーとかで、valueと同じ値をデータに入れる。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$this-&gt;data['Model']['school'][1] = 1;

$this-&gt;data['Model']['school'][2] = 2;

</textarea>
<p>よし、これでOK……と思ったそこのあなた。まだまだだね。</p>
<p>いや、俺もこれでできると最初は思ったんすけど、曲者なのがフォームヘルパーの中身の↓の部分。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$value === $options['value']

</textarea>
<p>イコールが3つってことは型も一緒じゃないとダメよってことになりますが、上記のような書き方だと、チェックボックスの中のvalueはstring型になりますが、その下の、自分でvalueを入れている方はおそらくinteger型になります。なので、これをstring型で入れる必要がある。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$i = 1;

settype($i, 'string');

$this-&gt;data['Model']['school'][1] = $i;

</textarea>
<p>settypeっていうのは、型を指定するときに使う関数だそうです。こんなん初めて使いましたわい。</p>
<p>まあ、こんなことしなくても多分</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$this-&gt;data['Model']['school'][1] = '1';

</textarea>
<p>みたいに書けば、string型になるような気もしますけれど……ってか、なるよね。</p>
<p>……と、こんな長ったらしい説明をしてはみましたが、これを書いたあとにいろいろとソースをいじってたら、何もしなくても$this-&gt;dataにデータを入れるだけで勝手に必要なところだけチェックがつくようになりました。何でだろ？</p>
<p>HABTMはよく分からないですね。たぶん、ツンデレとかいうやつなんだと思います。</p>
<p>ちょこっと調べた限りでは、MySQLはデータを持って来るときに暗黙の型変換とかいうのがそこはかとなく行われているみたいで、int型のデータもstring型になっていたりするらしいのですが、その辺りはまだ調査不足なので、またいずれ。</p>
<p>ふと思ったんですけど、俺、解決したら書きますとかもうちょっと調べて何か分かったらいずれ追記しますとか言って、今まで実行したことないですよね……たぶん。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/689/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
