<?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>アストロデオブログ &#187; CakePHP</title>
	<atom:link href="http://astrodeo.com/blog/archives/category/cakephp/feed" rel="self" type="application/rss+xml" />
	<link>http://astrodeo.com/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Wed, 28 Jul 2010 01:18:46 +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>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>
		<item>
		<title>AppControllerを分ける</title>
		<link>http://astrodeo.com/blog/archives/670</link>
		<comments>http://astrodeo.com/blog/archives/670#comments</comments>
		<pubDate>Mon, 21 Jun 2010 10:18:46 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=670</guid>
		<description><![CDATA[前回や前々回で管理側と表示側でURLを変えてみたりコントローラーを整理したりしてみましたが、もうこうなったらAppControllerも管理側と表示側で分けてしまいましょう。行けるところまで行っちゃいましょう。地獄の淵が見えるまでね。
別に難しいことはないです。要は間に一枚挟めばいいだけなので。


class AppController extends Controller {
    //AppControllerの中身
}

//管理画面のAppController
class AdminAppController extends AppController {
    //中身
}

//表示画面用のAppController
class ExpressAppController extends AppController {
    //中身
}

//users_controller.php(管理画面)
class UsersController extends AdminAppController {
    //中身
}

//home_controller.php(表示画面)
class HomeController extends ExpressAppController {
    //中身
}


ざっくりとしか書きませんでしたが、まあこんな感じです。これだけでも言いたいことは伝わると思う（たぶん）
あとは管理側や表示側で共通する部分をそれぞれのAppControllerの中に書けばオッケーです。
上記でいうところのAdminAppControllerやExpressAppControllerは、それぞれ別ファイルにすると他にも設定をいじらなきゃいけないところが出て来るみたいなので、app_controller.phpの中にまとめて書いてしまってもいいと思います。
ファイルを分けたい場合は、正しいやり方はちょっと分からないのですが、↓こんなやり方でもいけることは確認しました。ちょっとダサいかも？


//app_controller.php
App::import('Controller', 'AdminApp');
App::import('Controller', 'ExpressApp');
class AppController extends Controller {

}


app_controller.phpで分けたいAppControllerをインポートしてやると、大丈夫っぽいです。でも、もっとちゃんとしたやり方があると思う（たぶん）
地獄の淵は全く見えませんでしたが、管理側と表示側を今まで以上に効率よく管理できる希望の光みたいなのは見えた気がします。特に僕はなるべく細かくメソッドを分けたい派なので（たぶん）、こういうことができるのは助かるです（たぶん）
]]></description>
			<content:encoded><![CDATA[<p><a href="http://astrodeo.com/blog/archives/667">前回</a>や<a href="http://astrodeo.com/blog/archives/663">前々回</a>で管理側と表示側でURLを変えてみたりコントローラーを整理したりしてみましたが、もうこうなったらAppControllerも管理側と表示側で分けてしまいましょう。行けるところまで行っちゃいましょう。地獄の淵が見えるまでね。</p>
<p>別に難しいことはないです。要は間に一枚挟めばいいだけなので。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

class AppController extends Controller {
    //AppControllerの中身
}

//管理画面のAppController
class AdminAppController extends AppController {
    //中身
}

//表示画面用のAppController
class ExpressAppController extends AppController {
    //中身
}

//users_controller.php(管理画面)
class UsersController extends AdminAppController {
    //中身
}

//home_controller.php(表示画面)
class HomeController extends ExpressAppController {
    //中身
}

</textarea>
<p>ざっくりとしか書きませんでしたが、まあこんな感じです。これだけでも言いたいことは伝わると思う（たぶん）</p>
<p>あとは管理側や表示側で共通する部分をそれぞれのAppControllerの中に書けばオッケーです。</p>
<p>上記でいうところのAdminAppControllerやExpressAppControllerは、それぞれ別ファイルにすると他にも設定をいじらなきゃいけないところが出て来るみたいなので、app_controller.phpの中にまとめて書いてしまってもいいと思います。</p>
<p>ファイルを分けたい場合は、正しいやり方はちょっと分からないのですが、↓こんなやり方でもいけることは確認しました。ちょっとダサいかも？</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

//app_controller.php
App::import('Controller', 'AdminApp');
App::import('Controller', 'ExpressApp');
class AppController extends Controller {

}

</textarea>
<p>app_controller.phpで分けたいAppControllerをインポートしてやると、大丈夫っぽいです。でも、もっとちゃんとしたやり方があると思う（たぶん）</p>
<p>地獄の淵は全く見えませんでしたが、管理側と表示側を今まで以上に効率よく管理できる希望の光みたいなのは見えた気がします。特に僕はなるべく細かくメソッドを分けたい派なので（たぶん）、こういうことができるのは助かるです（たぶん）</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/670/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPでURLを任意に変更させる</title>
		<link>http://astrodeo.com/blog/archives/667</link>
		<comments>http://astrodeo.com/blog/archives/667#comments</comments>
		<pubDate>Mon, 14 Jun 2010 10:03:13 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=667</guid>
		<description><![CDATA[前回の記事でコントローラーの中身をフォルダ分けして整理するやり方を書きましたけど、その流れに乗ってURLなんかも管理側と表示側で変えることはできないのかなと思ったら、これが出来るらしいんですね。なかなか柔軟な野郎ですね。レッドオクトパス市原のようですね。
core.phpの60～70行目の辺りを見てみると


Configure::write('Routing.admin', 'admin');


みたいな感じの一文がコメントアウトされてると思うんですけど、このコメントアウトを外すと、URLが以下のような感じに変化されるようです。


http://localhost/test/controller/action/

↓

http://localhost/test/admin/controller/action/


デフォルトはadminになっていますが、これは任意に変えることが可能なようですね。
これを利用すれば、前回のやり方で管理画面用のコントローラーをcontrollers/admin以下に作成して、それらのURLをadmin/contorller/actionにすることもできるって寸法ですね。
ちなみに、URLをadmin～に変化させた場合は、コントローラーの中身もちょっと変えないといけない。


class TestsController extends AppController {

var $name= 'Tests';

function admin_index() {
    //詳細
}


本来のアクション名の前にadmin_をつけ足さないとmissingエラーが出ちゃいます。adminを任意の文字列に変えた場合は、この部分もそれに合わせて変えれば問題ないでしょう。試してないけど、たぶん。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://astrodeo.com/blog/archives/663">前回の記事</a>でコントローラーの中身をフォルダ分けして整理するやり方を書きましたけど、その流れに乗ってURLなんかも管理側と表示側で変えることはできないのかなと思ったら、これが出来るらしいんですね。なかなか柔軟な野郎ですね。レッドオクトパス市原のようですね。</p>
<p>core.phpの60～70行目の辺りを見てみると</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

Configure::write('Routing.admin', 'admin');

</textarea>
<p>みたいな感じの一文がコメントアウトされてると思うんですけど、このコメントアウトを外すと、URLが以下のような感じに変化されるようです。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

http://localhost/test/controller/action/

↓

http://localhost/test/admin/controller/action/

</textarea>
<p>デフォルトはadminになっていますが、これは任意に変えることが可能なようですね。</p>
<p>これを利用すれば、前回のやり方で管理画面用のコントローラーをcontrollers/admin以下に作成して、それらのURLをadmin/contorller/actionにすることもできるって寸法ですね。</p>
<p>ちなみに、URLをadmin～に変化させた場合は、コントローラーの中身もちょっと変えないといけない。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

class TestsController extends AppController {

var $name= 'Tests';

function admin_index() {
    //詳細
}

</textarea>
<p>本来のアクション名の前にadmin_をつけ足さないとmissingエラーが出ちゃいます。adminを任意の文字列に変えた場合は、この部分もそれに合わせて変えれば問題ないでしょう。試してないけど、たぶん。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/667/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>コントローラの中身をフォルダ分けする</title>
		<link>http://astrodeo.com/blog/archives/663</link>
		<comments>http://astrodeo.com/blog/archives/663#comments</comments>
		<pubDate>Mon, 07 Jun 2010 02:40:35 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=663</guid>
		<description><![CDATA[CakePHPのcontrollerは、どうやら階層を深くできるらしい。例えば、表示側と管理側でコントローラーを分けて見やすいように整理したい場合。


app/
　　└controllers/
　　　　├admin/
　　　　│　　├users_controller.php
　　　　│　　└topics_controller.php
　　　　└home_controller.php


こんな感じにフォルダ分けしたりすることができる。
ただしこれだけだと正常な動作をしないので、bootstrap.phpに以下の設定を記述する必要がある。


$controllerPaths = array(
    ROOT.DS.APP_DIR.DS.'controllers'.DS.'admin'.DS,
    ROOT.DS.APP_DIR.DS.'controllers'.DS,  
);


ちなみにこれはコントローラーに限った話ではなくて、モデルやビューでも同様の設定はできる。


$modelPaths = array(
    ROOT.DS.APP_DIR.DS.'models'.DS.'admin'.DS,
    ROOT.DS.APP_DIR.DS.'models'.DS,
);

$viewPaths = array(
    ROOT.DS.APP_DIR.DS.'views'.DS.'admin'.DS,
    ROOT.DS.APP_DIR.DS.'views',
);


参考サイトさんはこちら。
http://d.hatena.ne.jp/yandod/20080510/1210416583
ところで、上のフォルダ構成っぽいのを記述しているところに使っている『└』『├』って、どうやって入力するんすかね？　よく分かんないんで今回は適当なところからコピって来たんだけど……。
]]></description>
			<content:encoded><![CDATA[<p>CakePHPのcontrollerは、どうやら階層を深くできるらしい。例えば、表示側と管理側でコントローラーを分けて見やすいように整理したい場合。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

app/
　　└controllers/
　　　　├admin/
　　　　│　　├users_controller.php
　　　　│　　└topics_controller.php
　　　　└home_controller.php

</textarea>
<p>こんな感じにフォルダ分けしたりすることができる。</p>
<p>ただしこれだけだと正常な動作をしないので、bootstrap.phpに以下の設定を記述する必要がある。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$controllerPaths = array(
    ROOT.DS.APP_DIR.DS.'controllers'.DS.'admin'.DS,
    ROOT.DS.APP_DIR.DS.'controllers'.DS,  
);

</textarea>
<p>ちなみにこれはコントローラーに限った話ではなくて、モデルやビューでも同様の設定はできる。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$modelPaths = array(
    ROOT.DS.APP_DIR.DS.'models'.DS.'admin'.DS,
    ROOT.DS.APP_DIR.DS.'models'.DS,
);

$viewPaths = array(
    ROOT.DS.APP_DIR.DS.'views'.DS.'admin'.DS,
    ROOT.DS.APP_DIR.DS.'views',
);

</textarea>
<p>参考サイトさんはこちら。</p>
<p><a href="http://d.hatena.ne.jp/yandod/20080510/1210416583" target="_blank">http://d.hatena.ne.jp/yandod/20080510/1210416583</a></p>
<p>ところで、上のフォルダ構成っぽいのを記述しているところに使っている『└』『├』って、どうやって入力するんすかね？　よく分かんないんで今回は適当なところからコピって来たんだけど……。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/663/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ctpファイルでPHPの補完機能を使えるようにする</title>
		<link>http://astrodeo.com/blog/archives/651</link>
		<comments>http://astrodeo.com/blog/archives/651#comments</comments>
		<pubDate>Thu, 03 Jun 2010 01:11:50 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=651</guid>
		<description><![CDATA[この前、わけあってこのブログの過去記事を漁っていたら、こんな記事を見つけまして……僕自身が一年前くらいに書いたものなんですが、こんな一文がありました。
eclipseを使うと、phpファイルなんかのソースを書く場合には『（』を書くと自動的に『）』もつけてくれるので（クォーテーションなんかも同様）書き逃しも少ないのだけど、ctpファイルの場合なんかはそういう補完をやってくれないから、だいたい最初にページをチェックするときはエラーが出ちゃいますね。
ctpファイルの場合なんかはそういう補完をやってくれないから
ほぉ……なるほど。そうだったんですか。
当時はプログラマになったばかりでeclipseのこともほとんど全くこれっぽっちも理解していなかったので、さも当たり前のようにこんなことを書いちゃいますが、まあ、設定次第で補完機能は使えます。もっとも、それ知ったのつい最近なんすけどね（汗）
こちらのサイトさんを今回は参考にさせていただきました。
僕のeclipseは英語なので、英語の方で説明しますが、設定方法は以下の通り。

メニューバーの『window』にある『Preferences』をクリック。
出て来た画面の左側にあるメニューの中から『General』から『Cotent Types』を選択
画面の右側で『Text』から『PHP Content Type』を選択
下にFile associationsの一覧が出ていると思うので、そこに『*.ctp』を追加

こんな感じでOKです。
上記のサイトさんにはその他の設定も載っているので、いろいろ参考になると思います。
]]></description>
			<content:encoded><![CDATA[<p>この前、わけあってこのブログの過去記事を漁っていたら、<a href="http://astrodeo.com/blog/archives/186">こんな記事</a>を見つけまして……僕自身が一年前くらいに書いたものなんですが、こんな一文がありました。</p>
<p><strong>eclipseを使うと、phpファイルなんかのソースを書く場合には『（』を書くと自動的に『）』もつけてくれるので（クォーテーションなんかも同様）書き逃しも少ないのだけど、ctpファイルの場合なんかはそういう補完をやってくれないから、だいたい最初にページをチェックするときはエラーが出ちゃいますね。</strong></p>
<p><strong style="font-size:large">ctpファイルの場合なんかはそういう補完をやってくれないから</strong></p>
<p>ほぉ……なるほど。そうだったんですか。</p>
<p>当時はプログラマになったばかりでeclipseのこともほとんど全くこれっぽっちも理解していなかったので、さも当たり前のようにこんなことを書いちゃいますが、まあ、設定次第で補完機能は使えます。もっとも、それ知ったのつい最近なんすけどね（汗）</p>
<p><a href="http://d.hatena.ne.jp/ngtn/20080204/1202142255" target="_blank">こちらのサイト</a>さんを今回は参考にさせていただきました。</p>
<p>僕のeclipseは英語なので、英語の方で説明しますが、設定方法は以下の通り。</p>
<ol>
<li>メニューバーの『window』にある『Preferences』をクリック。</li>
<li>出て来た画面の左側にあるメニューの中から『General』から『Cotent Types』を選択</li>
<li>画面の右側で『Text』から『PHP Content Type』を選択</li>
<li>下にFile associationsの一覧が出ていると思うので、そこに『*.ctp』を追加</li>
</ol>
<p>こんな感じでOKです。</p>
<p>上記のサイトさんにはその他の設定も載っているので、いろいろ参考になると思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/651/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPで404エラー画面を作る</title>
		<link>http://astrodeo.com/blog/archives/606</link>
		<comments>http://astrodeo.com/blog/archives/606#comments</comments>
		<pubDate>Thu, 13 May 2010 00:18:30 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=606</guid>
		<description><![CDATA[CakePHPのcake/libs/viewを見ると、errorsというフォルダの中にerror404.ctpというファイルがある。これをapp側のview/errors下に置くと、404エラーが出た時に、error404.ctpの内容が表示される。
ただし、これだけだとlayoutはdefault.ctpが呼ばれてしまうので、エラー用のページのレイアウトを他のページと完全に分けたい場合なんかは、views/layoutsに新しいctpファイルを作る必要がある。たとえばerror.ctpとか。
error.ctpを作ったら、今度はapp直下にerror.phpファイルを作成する。ファイルの中身はこんな感じ。


class AppError extends ErrorHandler {

    function error404($params) {

        $this-&#62;controller-&#62;layout = 'error';

        parent::error404($params);

    }

}


ちょいとこじゃれた404エラーページを作りたければ、この辺のデザインを参考にすると良いかもしれない。個人的には本が開かれていて404ページだけ「The page cannot be found」って書いてあるデザインが良いと思う。
404エラーって、普通にサイトを閲覧する分にはそう滅多に見られるようなページでもないと思うんですけど、そういうところのデザインにこだわりを持って凝ったデザインにしているサイトとかって、かっこいいと思います。
]]></description>
			<content:encoded><![CDATA[<p>CakePHPのcake/libs/viewを見ると、errorsというフォルダの中にerror404.ctpというファイルがある。これをapp側のview/errors下に置くと、404エラーが出た時に、error404.ctpの内容が表示される。</p>
<p>ただし、これだけだとlayoutはdefault.ctpが呼ばれてしまうので、エラー用のページのレイアウトを他のページと完全に分けたい場合なんかは、views/layoutsに新しいctpファイルを作る必要がある。たとえばerror.ctpとか。</p>
<p>error.ctpを作ったら、今度はapp直下にerror.phpファイルを作成する。ファイルの中身はこんな感じ。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

class AppError extends ErrorHandler {

    function error404($params) {

        $this-&gt;controller-&gt;layout = 'error';

        parent::error404($params);

    }

}

</textarea>
<p>ちょいとこじゃれた404エラーページを作りたければ、<a href="http://e0166.blog89.fc2.com/blog-entry-262.html" target="_blank">この辺のデザイン</a>を参考にすると良いかもしれない。個人的には本が開かれていて404ページだけ「The page cannot be found」って書いてあるデザインが良いと思う。</p>
<p>404エラーって、普通にサイトを閲覧する分にはそう滅多に見られるようなページでもないと思うんですけど、そういうところのデザインにこだわりを持って凝ったデザインにしているサイトとかって、かっこいいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/606/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「scaffold？　何それ？」って言ったら笑われた</title>
		<link>http://astrodeo.com/blog/archives/555</link>
		<comments>http://astrodeo.com/blog/archives/555#comments</comments>
		<pubDate>Mon, 26 Apr 2010 00:49:24 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=555</guid>
		<description><![CDATA[先日、他のプログラマの方たちとCakePHPについて語り合っているときに、scaffoldって単語が飛び交いました。僕以外の二人は当然のようにそれを分かっていましたが、僕だけ何のことか分からなかったので、「それ何ですか？」って聞いたら「知らないのかYO！！」って言われてしまいました。
何かよく分かんないけど、CakePHPとかを使っていればわりと初期の段階で知ることなんだそうです。
主人がオオアリクイに殺されてからもう一年くらい経つのに……間違えた、僕がプログラマになってからもう一年くらい経つのに……普通に知りませんでした。Scatmanなら知ってるけど……。
CakePHPにおけるscaffoldとは何ぞやというと、コントローラーとモデルさえ作っとけば勝手にデータの生成や編集、削除のフォームを良い感じに作ってくれるということらしいです。


//コントローラー
class UsersController extends AppController {
    var $name = 'Users';
    var $scaffold;
}

//モデル
class User extends AppModel {
    var $name = 'User';
}


何とこれだけでOK。超お手軽です。あとはデータベースにusersのテーブルを作っとけば、ビューが自動でできあがる。
The CakeBookを読むと、この機能はかなりクールなんだそうです。あまりにクールすぎるため、製品版のアプリケーションで使用したくなるほどクールなんだそうです。使用したくなってしまうそんなあなたもクールなんだそうです。きっとレンタルボディーガードよりクールなんだと思います。スピードワゴンの去り方よりもクールに違いありません。
でも、あくまでもスキャフォールディングはスキャフォールディングであるらしく、プロジェクトの初期段階で素早く構築できるというルーズな構造なんだそうです。何のことかよく分かりませんが、どんな場合にでも対応できるほど柔軟で万能なものではないということなんでしょう。クールでルーズなツールのようです。
まあ、今まで一度も使ったことがないですし、これから先も使うかどうかは分かりませんが、知っといて損はないなと思いました。
そもそも僕が知らない原因の一つは、Cakeをbakeしたことがないからなんだそうです。正確に言うと初めてCakePHPに触ったときに一回だけやったことはあるんですけど（この辺りの記事にそのときのことが書いてある）、あれは本に書いてある通りにやったら最終的に本に書いてある通りの結果が返って来ただけで、いったい何をやっていたのかは全く分かってなかったので、事実上ノーカウントです。
]]></description>
			<content:encoded><![CDATA[<p>先日、他のプログラマの方たちとCakePHPについて語り合っているときに、scaffoldって単語が飛び交いました。僕以外の二人は当然のようにそれを分かっていましたが、僕だけ何のことか分からなかったので、「それ何ですか？」って聞いたら「知らないのかYO！！」って言われてしまいました。</p>
<p>何かよく分かんないけど、CakePHPとかを使っていればわりと初期の段階で知ることなんだそうです。</p>
<p>主人がオオアリクイに殺されてからもう一年くらい経つのに……間違えた、僕がプログラマになってからもう一年くらい経つのに……普通に知りませんでした。Scatmanなら知ってるけど……。</p>
<p>CakePHPにおけるscaffoldとは何ぞやというと、コントローラーとモデルさえ作っとけば勝手にデータの生成や編集、削除のフォームを良い感じに作ってくれるということらしいです。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

//コントローラー
class UsersController extends AppController {
    var $name = 'Users';
    var $scaffold;
}

//モデル
class User extends AppModel {
    var $name = 'User';
}

</textarea>
<p>何とこれだけでOK。超お手軽です。あとはデータベースにusersのテーブルを作っとけば、ビューが自動でできあがる。</p>
<p><a href="http://book.cakephp.org/ja/view/105/Scaffolding" target="_blank">The CakeBook</a>を読むと、この機能はかなりクールなんだそうです。あまりにクールすぎるため、製品版のアプリケーションで使用したくなるほどクールなんだそうです。使用したくなってしまうそんなあなたもクールなんだそうです。きっとレンタルボディーガードよりクールなんだと思います。スピードワゴンの去り方よりもクールに違いありません。</p>
<p>でも、あくまでもスキャフォールディングはスキャフォールディングであるらしく、プロジェクトの初期段階で素早く構築できるというルーズな構造なんだそうです。何のことかよく分かりませんが、どんな場合にでも対応できるほど柔軟で万能なものではないということなんでしょう。クールでルーズなツールのようです。</p>
<p>まあ、今まで一度も使ったことがないですし、これから先も使うかどうかは分かりませんが、知っといて損はないなと思いました。</p>
<p>そもそも僕が知らない原因の一つは、Cakeをbakeしたことがないからなんだそうです。正確に言うと初めてCakePHPに触ったときに一回だけやったことはあるんですけど（<a href="http://astrodeo.com/blog/archives/181">この辺りの記事</a>にそのときのことが書いてある）、あれは本に書いてある通りにやったら最終的に本に書いてある通りの結果が返って来ただけで、いったい何をやっていたのかは全く分かってなかったので、事実上ノーカウントです。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/555/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ホスト名を取得する</title>
		<link>http://astrodeo.com/blog/archives/442</link>
		<comments>http://astrodeo.com/blog/archives/442#comments</comments>
		<pubDate>Mon, 22 Feb 2010 08:54:24 +0000</pubDate>
		<dc:creator>マッチー</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/?p=442</guid>
		<description><![CDATA[CakePHPでウェブルートのアドレスを取得したい場合


$this-&#62;webroot;


これで取得できるが、でもこれだとホスト名が含まれない。Routerの書き方にもよるけれど、大体の場合は「/」の一文字が返ってくるんじゃないだろうか。


pr($this-&#62;webroot.$this-&#62;params['url']['url']);

//出力結果
/home/index/1


こんなような感じになると思う。でも場合によってはホスト名が欲しい場合があるかもしれない。たとえばhttp://www.astrodeo.comとアドレスに入力されたらhttp://astrodeo.comにリダイレクトさせたい場合とか。
そういうときはこれ↓を使う。


env('HTTP_HOST');


env()は環境変数を取得する関数です。これでホスト名を取得できる。
]]></description>
			<content:encoded><![CDATA[<p>CakePHPでウェブルートのアドレスを取得したい場合</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

$this-&gt;webroot;

</textarea>
<p>これで取得できるが、でもこれだとホスト名が含まれない。Routerの書き方にもよるけれど、大体の場合は「/」の一文字が返ってくるんじゃないだろうか。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

pr($this-&gt;webroot.$this-&gt;params['url']['url']);

//出力結果
/home/index/1

</textarea>
<p>こんなような感じになると思う。でも場合によってはホスト名が欲しい場合があるかもしれない。たとえば<a href="http://www.astrodeo.com/">http://www.astrodeo.com</a>とアドレスに入力されたら<a href="http://astrodeo.com/">http://astrodeo.com</a>にリダイレクトさせたい場合とか。</p>
<p>そういうときはこれ↓を使う。</p>
<textarea name="code" class="PHP:nocontrols" cols="30" rows="5">

env('HTTP_HOST');

</textarea>
<p>env()は環境変数を取得する関数です。これでホスト名を取得できる。</p>
]]></content:encoded>
			<wfw:commentRss>http://astrodeo.com/blog/archives/442/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
