<?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>IDEA*IDEA &#187; CakePHP関連</title>
	<atom:link href="http://www.ideaxidea.com/archives/category/cakephp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ideaxidea.com</link>
	<description>百式管理人のライフハックブログ</description>
	<lastBuildDate>Thu, 09 Feb 2012 07:41:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>CakePHPでjQueryを使ってAjaxする方法</title>
		<link>http://www.ideaxidea.com/archives/2009/10/cakephp_and_jquery_ajax.html</link>
		<comments>http://www.ideaxidea.com/archives/2009/10/cakephp_and_jquery_ajax.html#comments</comments>
		<pubDate>Fri, 30 Oct 2009 10:04:24 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>
		<category><![CDATA[jQuery関連]]></category>
		<category><![CDATA[開発ツール・技術]]></category>

		<guid isPermaLink="false">http://www.ideaxidea.com/?p=8443</guid>
		<description><![CDATA[「CakePHPのAjaxヘルパーってprototypeかよ・・・」というjQueryラヴァーへ捧げるエントリー。 jQuery+CakePHPでAjaxしちゃう方法ですよ。例題として簡単なタスク管理システムつくるぜ。  [...]]]></description>
			<content:encoded><![CDATA[<p>「CakePHPのAjaxヘルパーってprototypeかよ・・・」というjQueryラヴァーへ捧げるエントリー。</p>
<p>jQuery+CakePHPでAjaxしちゃう方法ですよ。例題として簡単なタスク管理システムつくるぜ。</p>
<p><img src="http://www.ideaxidea.com/wp-content/uploads/2009/10/task.gif" alt="task" title="task" width="300" height="196" class="alignnone size-full wp-image-8442" /></p>
<p>↑ こういうやつ。/tasks/indexの画面す。</p>
<p>タスクをFormからSubmitすると下のリストに画面遷移なく追加されていく、というものです。</p>
<p>以下、作業ログ。</p>
<p><strong>■ DB設定</strong></p>
<p>こんな感じで。ちょーてきとー。</p>
<pre class="code">
DROP TABLE IF EXISTS tasks;
CREATE TABLE tasks (
  id int(11) unsigned NOT NULL auto_increment,
  title varchar(255),
  created datetime NOT NULL,
  modified datetime NOT NULL,
  PRIMARY KEY (id),
  KEY created (created),
  KEY modified (modified)
);
</pre>
<p>あとモデルも適当につくっておいてください。</p>
<p><strong>■ jQueryから</strong></p>
<p>まずはJavaScriptを書いちゃうのがわかりやすいでしょう。いじるのは「views/tasks/index.ctp」です。なお、layoutの方でjQueryを読み込んでおくのを忘れずに。</p>
<p>面倒だから全部貼り付けてみる。</p>
<pre class="code">
&lt;h2&gt;Tasks&lt;/h2&gt;
&lt;?php
echo $form-&gt;create('Task', <strong>array('default'=&gt;false)</strong>);
echo $form-&gt;input('title');
echo $form-&gt;submit('Add');
echo $form-&gt;end();
?&gt;
&lt;ul id=&quot;tasks&quot;&gt;
&lt;?php foreach($tasks as $task) { ?&gt;
&lt;li&gt;&lt;?= h($task['Task']['title']); ?&gt;&lt;/li&gt;
&lt;?php } ?&gt;
&lt;/ul&gt;
&lt;script language=&quot;JavaScript&quot;&gt;
$(function() {
    $(&quot;#TaskAddForm&quot;).submit(function() {
      $.post('/tasks/ajax_add', {
        title: $(&quot;#TaskTitle&quot;).val()
      }, function(rs) {
        $(&quot;#tasks&quot;).prepend(rs);
        $(&quot;#TaskTitle&quot;).val('').focus();
      });
    });
});
&lt;/script&gt;
</pre>
<p>注意する点は、formがsubmitされても画面遷移しちゃわないようにform作るときに&#8221;default&#8221;をfalseにすることぐらいすかね。</p>
<p><strong>■ コントローラー</strong></p>
<p>で、ajaxで呼び出されるajax_addも含め、コントローラーはこんな感じ。わかりやすいようにコメントつけといたよー。「controllers/tasks_controller.php」です。</p>
<pre class="code">
class TasksController extends AppController {
  var $name = 'Tasks';
  // ajax呼び出しに必要
  var $components = array('RequestHandler');
  // とりあえずタスクの一覧表示
  function index() {
    $this-&gt;set('tasks', $this-&gt;Task-&gt;findAll());
  }
  // ajaxで呼び出される関数
  function ajax_add() {
    // デバッグ情報出力を抑制
    Configure::write('debug', 0);
    // ajax用のレイアウトを使用
    $this-&gt;layout = &quot;ajax&quot;;
    // ajaxによる呼び出し？
    if($this-&gt;RequestHandler-&gt;isAjax()) {
      // POST情報は$this-&gt;params['form']で取得
      $title = $this-&gt;params['form']['title'];
      // DBに突っ込みます
      $this-&gt;Task-&gt;id = null;
      $this-&gt;data['Task']['title'] = $title;
      $this-&gt;Task-&gt;save($this-&gt;data);
      // 表示用のデータをviewに渡す
      $this-&gt;set('t', $title);
    }
  }
}
</pre>
<p>何点か。</p>
<ul>
<li>RequestHandlerのComponent呼び出しはajax通信かどうかの判定に必要。他のコントローラーでも使いたかったらapp_controller.phpでやっちゃってもいいです。</li>
<li>開発中はデバッグ情報出している人も多いと思うので「Configure::write(&#8216;debug&#8217;, 0);」としておくと吉。</li>
<li>ajaxから$.postで渡される変数は$this-&gt;params['form']で取得でアクセス可能です。</li>
</ul>
<p><strong>■ ビュー関連</strong></p>
<p>ビューは「views/tasks/ajax_add.ctp」と「views/layout/ajax.ctp」、それから先ほどJavaScriptを書いた「views/tasks/index.ctp」ですな。</p>
<p>まずはajaxのlayout。出力以外何もいらないので一行ね。</p>
<pre class="code">
&lt;?php echo $content_for_layout ?&gt;
</pre>
<p>次にajax_add.ctp。今回要素をliで追加していくのでこんな感じ。コントローラーから渡された「t」を表示します。</p>
<pre class="code">
&lt;li&gt;&lt;?php echo h($t); ?&gt;&lt;/li&gt;
</pre>
<p><strong>■ まとめ</strong></p>
<p>ま、こんなところですかね。jQueryのコードから書いていくとまぁ、わかりやすいのでは。今回は一番典型的っぽい$.postを取り扱いましたが、他のAjaxも似たような感じでできるかと思います。ご参考までに。</p>
<p>なお、一番参考になったチュートリアルはこちらでした。あわせてどうぞ。</p>
<ul>
<li><a href="http://teknoid.wordpress.com/2009/01/19/jquery-in-the-cakephp-world-part-1/">JQuery in the CakePHP world (part 1 – the basics) « nuts and bolts of cakephp</a></li>
<li><a href="http://teknoid.wordpress.com/2009/01/21/jquery-in-the-cakephp-world-part-2-is-client-side-code-all-that-great/">JQuery in the CakePHP world (part 2 – is client side code all that great?) « nuts and bolts of cakephp</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2009/10/cakephp_and_jquery_ajax.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CakePHPのAuthComponentではまったところ</title>
		<link>http://www.ideaxidea.com/archives/2009/10/cake_authcomponent_pitfalls.html</link>
		<comments>http://www.ideaxidea.com/archives/2009/10/cake_authcomponent_pitfalls.html#comments</comments>
		<pubDate>Wed, 28 Oct 2009 04:20:03 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>
		<category><![CDATA[開発ツール・技術]]></category>

		<guid isPermaLink="false">http://www.ideaxidea.com/?p=8397</guid>
		<description><![CDATA[先日のエントリーの続編。またしても超絶個人的メモ。ごめん。 フォームからusername、passwordにあたるものが送信されると自動的にpasswordはhash化される・・・。はまった。 User情報の更新などで「 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ideaxidea.com/wp-content/uploads/2009/10/cake_auth.gif" alt="cake_auth" title="cake_auth" width="500" height="147" class="alignnone size-full wp-image-8358" /></p>
<p>先日の<a href="http://www.ideaxidea.com/archives/2009/10/cakephp_auth_component.html">エントリー</a>の続編。またしても超絶個人的メモ。ごめん。</p>
<ul>
<li>フォームからusername、passwordにあたるものが送信されると自動的にpasswordはhash化される・・・。はまった。</li>
<li>User情報の更新などで「password欄が空欄だったらそのまま、入力されたら更新」という処理があると思いますが、上記の注意事項があるため気をつけましょう。コード的には以下かな（$meには現在のユーザー情報）。</li>
<pre class="code">
if ($this-&gt;data['User']['password']==$this-&gt;Auth-&gt;password('')) {
	$this-&gt;data['User']['password'] = $me['User']['password'];
}
</pre>
<li>$this-&gt;Auth-&gt;user()にはpasswordが含まれていません。別の言い方をすると$this-&gt;Auth-&gt;user(&#8216;password&#8217;)はNULL。</li>
<li>User情報の更新を$this-&gt;User-&gt;save()でやっても$this-&gt;Auth-&gt;user()の情報は更新されません。更新するには再度login、logoutする、とかといった工夫が必要（<a href="http://q.hatena.ne.jp/1224083211">参考</a>）。</li>
</ul>
<p>以上ですかね。いやー、勉強になりますな！</p>
<p><strong>追記：</strong>Passwordチェックは、フォーム上でPasswordのフィールド名を変更しておく手もあります（Thanks to <a href="http://twitter.com/msng">@msng</a>）。こちらだと入力値のチェックが自由自在でいいかもですね。</p>
<pre class="code">
$this-&gt;data['User']['password'] = $this-&gt;Auth-&gt;password($this-&gt;data['User']['password_to_be']);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2009/10/cake_authcomponent_pitfalls.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPのAuthComponentに関する覚書</title>
		<link>http://www.ideaxidea.com/archives/2009/10/cakephp_auth_component.html</link>
		<comments>http://www.ideaxidea.com/archives/2009/10/cakephp_auth_component.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 02:28:07 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://www.ideaxidea.com/?p=8357</guid>
		<description><![CDATA[超個人的メモ。すまん。 ■ まずはこちら 参考情報的な。 Authentication :: Core Components :: The Manual :: 1.2 Collection :: The Cookbook [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ideaxidea.com/wp-content/uploads/2009/10/cake_auth.gif" alt="cake_auth" title="cake_auth" width="500" height="147" class="alignnone size-full wp-image-8358" /></p>
<p>超個人的メモ。すまん。</p>
<p><strong>■ まずはこちら</strong></p>
<p>参考情報的な。</p>
<ul>
<li><a href="http://book.cakephp.org/view/172/Authentication">Authentication :: Core Components :: The Manual :: 1.2 Collection :: The Cookbook</a></li>
<p>公式マニュアル。人とおり目を通すこと。</p>
<li><a href="http://blog.ne2ma2.com/archives/160">【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】 | ねねとまつの小部屋</a></li>
<p>こちらで復習。</p>
<li><a href="http://blog.ne2ma2.com/archives/161">【CakePHP】AuthComponentについてのまとめ その２【ちょっとしたコツ編】 | ねねとまつの小部屋</a></li>
<p>さらに読んどくべし。</p>
<li><a href="http://blog.ne2ma2.com/archives/163">【CakePHP】AuthComponentについてのまとめ その３【ログイン後のリダイレクト編】 | ねねとまつの小部屋</a></li>
<p>リダイレクトの処理だけど、最新版ではSessionに戻り先が保存されているっぽいから不要？？</p>
<li><a href="http://www.garacter.com/notes/CakePHP+Note:%E8%87%AA%E5%8B%95%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%9D%E3%81%AE%EF%BC%91/pi:233">CakePHP Note:自動ログインその１</a></li>
<p>自動ログインまでやりたい場合はこちらで。</p>
</ul>
<p><strong>■ 実装までの手順</strong></p>
<p>コードは上記サイトを見てもらうとして概念的なステップ。</p>
<ul>
<li>全部のモデルで使いたいと思うからAPP/controllers/app_controller.phpに「var $components = array(&#8216;Auth&#8217;);」って書いちゃう。</li>
<li>細かい設定は同ファイルのbeforeFilterに書いちゃう。</li>
<li>ただ、$this-&gt;Auth-&gt;allowだけは各コントローラーに記述。その際は「parent::beforeFilter();」を忘れぬこと。</li>
<li>DB側は基本的にUsersテーブル、username, passwordを設定しておけばOK。ここでusernameじゃなくて、emailにしたい場合もあるだろうから「$this-&gt;Auth-&gt;fields」をbeforeFilterへ。</li>
<li>自動ログインしたい場合（＝Cookie使う場合）は「$this-&gt;Auth-&gt;autoRedirect = false;」してからlogin()にいろいろ記述。</li>
<li>入力時にパスワードの再確認をしたい場合は比較処理に注意（入力値をHash化してから比較すること）。</li>
</ul>
<p><strong>■ 使ってみた感想！</strong></p>
<p>以前のCakePHP修行ではそれぞれのメソッドに_checkLogin()とかかましていましたが、それらが根こそぎ不要に！なんという便利さ！みんな、使ったほうがいいよ！</p>
<p><strong>追記：</strong><a href="http://www.ideaxidea.com/archives/2009/10/cake_authcomponent_pitfalls.html">CakePHPのAuthComponentではまったところ</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2009/10/cakephp_auth_component.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>独習CakePHP ～ 最初の7日間で何をすべきか？ ～</title>
		<link>http://www.ideaxidea.com/archives/2008/02/cakephp_7.html</link>
		<comments>http://www.ideaxidea.com/archives/2008/02/cakephp_7.html#comments</comments>
		<pubDate>Thu, 21 Feb 2008 01:17:44 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2008/02/%e7%8b%ac%e7%bf%92cakephp-%ef%bd%9e-%e6%9c%80%e5%88%9d%e3%81%ae7%e6%97%a5%e9%96%93%e3%81%a7%e4%bd%95%e3%82%92%e3%81%99%e3%81%b9%e3%81%8d%e3%81%8b%ef%bc%9f-%ef%bd%9e.html</guid>
		<description><![CDATA[第2回CakePHP勉強会に参加しました。 なんちゃってエンジニアなので隅っこの方で話を聞いていようかなぁ、と思っていたのですが、青い人から「ライトニングトークしませんか？」と誘われました。やったことのないものはとりあえ [...]]]></description>
			<content:encoded><![CDATA[<p>第2回CakePHP勉強会に参加しました。</p>
<p>なんちゃってエンジニアなので隅っこの方で話を聞いていようかなぁ、と思っていたのですが、<a href="http://www.akiyan.com/">青い人</a>から「ライトニングトークしませんか？」と誘われました。やったことのないものはとりあえずチャレンジ！ということで5分程度しゃべってきました。</p>
<p>以下、資料。CakePHP初心者向けに、最初の7日で何をすべきか＋陥りやすい罠などをまとめてみました。まぁ、ネタですがｗ。</p>
<div style="margin-left:30px;">
<div style="width:425px;text-align:left" id="__ss_273823"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=cakephp-lightening-talk-20080221-1203526172679687-4"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=cakephp-lightening-talk-20080221-1203526172679687-4" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/taguchi/cakephp-lightening-talk-20080221?src=embed" title="View 'CakePHP Lightening Talk (2008-02-21)' on SlideShare">View</a> | <a href="http://www.slideshare.net/upload?src=embed">Upload your own</a></div>
</div>
</div>
<p>↑ Slideshare、はじめて使うな、そういえば。</p>
<p>僕のパートはまぁ、いいとして、その他の方のお話がやっぱり参考になりました。実際のところ、みんながどうやってコードを書いているのか、とか、どういう開発をしているのかとかが普段の生活からはわからないので勉強になりましたよ・・・とりあえずmemcache使いたい。</p>
<p>今回の勉強会は数時間で満員とのこと・・・第3回目も油断せずに申し込まないとですね。最後になりますが、主催者のみなさま、会場を提供していただいた<a href="http://www.tricorn.co.jp/">トライコーン</a>の方々、ありがとうございました！</p>
<p>&raquo; <a href="http://events.php.gr.jp/event.php/event_show/36">第2回CakePHP勉強会::events.php.gr.jp</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2008/02/cakephp_7.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CakePHPでCSVファイルをダウンロードさせたいときの作法</title>
		<link>http://www.ideaxidea.com/archives/2008/01/cakephpcsv.html</link>
		<comments>http://www.ideaxidea.com/archives/2008/01/cakephpcsv.html#comments</comments>
		<pubDate>Fri, 11 Jan 2008 11:39:34 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2008/01/cakephp%e3%81%a7csv%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%95%e3%81%9b%e3%81%9f%e3%81%84%e3%81%a8%e3%81%8d%e3%81%ae%e4%bd%9c%e6%b3%95.html</guid>
		<description><![CDATA[ひさびさにCakePHPの開発メモ。エンジニアじゃない人はスルーの方向で・・・。 さてアプリをつくっていてCSVファイルをダウンロードさせたい、みたいなときがありますが、その際にCakePHPではこうするといいよ、という [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="cake_top.gif" src="http://www.ideaxidea.com/archives/2008/01/11/cake_top.gif" width="500" height="164" /></p>
<p>ひさびさにCakePHPの開発メモ。エンジニアじゃない人はスルーの方向で・・・。</p>
<p>さてアプリをつくっていてCSVファイルをダウンロードさせたい、みたいなときがありますが、その際にCakePHPではこうするといいよ、というお話。なお、このコードに関しては主に青い人に聞きまくりました（笑）。</p>
<p>では早速。</p>
<p><strong>■ やりたいこと</strong></p>
<p>/user/download のURLにてユーザー全部の情報をCSVでダウンロードさせたい。</p>
<p></strong>■ users_controller.php</strong></p>
<p>コントローラーのdownload()を以下のように記述。</p>
<pre class="code">
function download($id) {
$this->autoRender = false; // Viewを使わないように
Configure::write('debug', 0); // debugコードを出さないように
$csv_file = sprintf("users_%s.csv", date("Ymd-hi")); // 適当にファイル名を指定
header ("Content-disposition: attachment; filename=" . $csv_file);
header ("Content-type: application/octet-stream; name=" . $csv_file);
$buf = "";
// ごにょごにょして$bufにUserの内容を追加
// 注意点は二つ。
// 1. 一つにまとめたい文字列は""で囲む。
// 2. 文字列内に"がある場合は""としてエスケープ
print($buf); // 出力
return;
}
</pre>
<p>これで/users/download/にアクセスすればCSVファイルが出力されるはずです。よろしければどうぞ。</p>
<p>その他のCakePHP関連情報は以下からどうぞ。</p>
<p>&raquo; <a href="http://www.ideaxidea.com/archives/cakephp/">CakePHP修行！ アーカイブ | IDEA*IDEA</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2008/01/cakephpcsv.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CakePHPでSNSっぽいものをつくってみる企画で学んだこと（CakePHP修行 最終回）</title>
		<link>http://www.ideaxidea.com/archives/2007/08/cakephpsnscakephp_1.html</link>
		<comments>http://www.ideaxidea.com/archives/2007/08/cakephpsnscakephp_1.html#comments</comments>
		<pubDate>Wed, 22 Aug 2007 06:02:06 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2007/08/cakephp%e3%81%a7sns%e3%81%a3%e3%81%bd%e3%81%84%e3%82%82%e3%81%ae%e3%82%92%e3%81%a4%e3%81%8f%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e4%bc%81%e7%94%bb%e3%81%a7%e5%ad%a6%e3%82%93%e3%81%a0%e3%81%93%e3%81%a8.html</guid>
		<description><![CDATA[さてCakePHP修行。今回が最終回です。このエントリーを書くのがすっかり遅くなってしまった（理由は後述）。 初回が6月20日だったので2ヶ月ぐらいかかりました。ただ、期間はかかりましたが、フレームワークによるラピッド開 [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="cake_top.gif" src="http://www.ideaxidea.com/archives/2007/08/22/cake_top.gif" width="450" height="269" /></p>
<p>さてCakePHP修行。今回が最終回です。このエントリーを書くのがすっかり遅くなってしまった（理由は後述）。</p>
<p>初回が6月20日だったので2ヶ月ぐらいかかりました。ただ、期間はかかりましたが、フレームワークによるラピッド開発の威力を思い知りました。やってよかった。</p>
<p>さて最終回はつらつらと今回の企画で学んだことや雑感などをメモ程度にまとめてみたいと思います。</p>
<p><strong>■ フレームワークについて</strong></p>
<p>この企画をやる前はあまりフレームワークに良い印象はありませんでした。なんとなく感じていたのは次のようなものでした。</p>
<ul>
<li>なんかもっさりしていそう（動作が重そう）。</li>
<li>カスタマイズするのがやりにくそう。</li>
<li>ドキュメントが少なそう。</li>
<li>ゼロから作るのが男だぜ！俺のアイディアはフレームにはまらないぜ！</li>
<li>赤松さんも使ってないしー。</li>
</ul>
<p>ただ、終わったあとには次のように思いました。</p>
<ul>
<li>やっぱり開発速度は段違い！コードが短いので見直しも楽！</li>
<li>動作速度は検証していないからわからないけど、CakePHPはなんか軽そう（あくまで主観）。</li>
<li>カスタマイズは十分にできることが判明！（つか、カスタマイズしたいところだけ従来の手法でガシガシ書ける）</li>
<li>ただ、ドキュメントはやっぱり少ないかも。参考にできるようなコードもあまりなかったような・・・。</li>
</ul>
<p>今回SNSっぽいものを作りましたが、だいぶデータの作り方、取り出し方などがわかりました。作りたいものもたくさんあるので、しばらくはCakePHPでアプリ開発してみたいと思います。慣れてくればもっと速く作れそうでwktkです。</p>
<p><strong>■ CakePHP開発のTips</strong></p>
<p>あまりエンジニアっぽくない僕がいうのもなんですが、次のようなことに気をつけると開発しやすいのかなぁ、と。あくまで個人的なメモですよ、メモ。</p>
<ul>
<li>コーディングはやっぱり毎日やらないと忘れる。毎日ちょっとずつでもやりたい。</li>
<li>CakePHPで一番重要なのは<a href="http://api.cakephp.org/">APIドキュメント</a>っぽい。ある程度仕組みが分かってきたらこのドキュメントばかり見てました。デバッグに必須です。</li>
<li>まずは開発環境をセットアップしてから開発すると良いですね。今回初Tracでしたが、かなり便利でした。自分なりの環境をすぐにセットアップできるWikiをまとめておくと良いですね。</li>
<li>開発は見た目から。当初はデザインはミニマムで、と思っていましたがやっぱり開発のノリはインターフェースに左右されますね。綺麗な画面を作ってからやると良いかと思います。</li>
<li>当たり前ですが、フレームワークはかなり論理的に作られています。はまったら一歩ひいて「フレームワークの開発者だったらこういう命令つくるよなぁ」と考えるとすっきりすることが多かったです。</li>
<li>どの言語にもいえることがですが、同じ処理をするのにやり方は複数あります。どのやり方が正しいとか美しいとかは個々人の判断だと思いますが、あまりどれが正しいとか考えずに「とりあえず動くものを」「あとでリファクタリング」と考えれば変にはまってふて寝とかすることがなくなるかと。</li>
<li>ブログで開発レポートをするのは大変だとわかりました・・・。</li>
</ul>
<p><strong>■ 謝辞！</strong></p>
<p>最後になりますが、あいかわらず<a href="http://www.akiyan.com/">青い人</a>にはお世話になりました。この場を借りて感謝感激す。ブログ上でのコメントもさることながら、チャットでもいろいろ教えてくれてありがとう！</p>
<p>ちなみに青い人は若いのにかなり教え上手だと思うのですが、彼の教え方を見ているといくつか特徴があるっぽいのでちょっとまとめてみます。</p>
<ul>
<li>「えーと、これは忘れてください」</li>
<p>コーディングの仕方はたいてい複数あると思うのですが、青い人はよく「えーと、このやり方は忘れてください」といいながら教えてくれます。あきらかにバッドノウハウ的なもの、まだ難しすぎるものについてはとりあえず選択肢から外し、<strong>わかりやすい少数の選択肢から選ばせてくれることが多い</strong>ように思います。</p>
<p>なお、少数の選択肢を提示するときはちゃんとそれらのメリット、デメリットを提示した上で、自分で考えて選べるようにしてくれます。</p>
<li>「ん？何がしたいんですか？」</li>
<p>複雑なロジックを追っているときには質問をすること自体が難しくなることがあります。そうしたときには常に「何がしたいか」を確認しながら話を進めてくれます。</p>
<p>当たり前かも知れませんが、お互いに「相手がやりたいのはこういうことなのかなぁ」といった適当な推測にはまる（←よくある）前に話を戻すのがうまいっす。</p>
<li>「はいはい」</li>
<p>質問をすると「はいはい、なんでしょう」と言いながら、ヘッドフォンをはずし、手をキーボードから離し、こちらを向いて話を聴いてくれます。基本的なことですが、これができる人って少なかったりしますよね。</p>
<p>ちなみに彼が忙しくて質問に答えられないときはきっちり最初に断られます。忙しいから適当に話きくよー、という態度をされるよりはきっちり断ってもらったほうがいいですよね。</p>
</ul>
<p>いやー、お世話になったなぁ・・・タイ土産買っていかなくちゃ（あ、買ってきたけど渡してないｗ）。</p>
<p><strong>■ あ、そうだ。</strong></p>
<p>この企画で挫折しなかったらCakePHPに$100寄付するという約束でした。以下が証拠ね。ちなみにこの記事を書くのが遅れたのはPaypalに送金していたため（しかも一回失敗してさらに遅れるという・・・）。</p>
<p><img alt="cake_donate.gif" src="http://www.ideaxidea.com/archives/2007/08/22/cake_donate.gif" width="400" height="245" /></p>
<p>↑ 微力ではありますが、貢献できるところからしておかねば。お世話になりました（＆今後もなります）。</p>
<p>というわけでCakePHP修行は終わります！興味のない人にはまったく興味のない内容だったでしょうが、個人的にはかなり楽しかったです。また衝動的にマニアックな企画をするかもしれませんが、そのときはご容赦ください！</p>
<p>※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじは<a href="http://www.ideaxidea.com/archives/cakephp/">こちら</a>へ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2007/08/cakephpsnscakephp_1.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>日記のコメントを残せるようにする（CakePHP修行 #44）</title>
		<link>http://www.ideaxidea.com/archives/2007/08/cakephp_44.html</link>
		<comments>http://www.ideaxidea.com/archives/2007/08/cakephp_44.html#comments</comments>
		<pubDate>Fri, 10 Aug 2007 05:11:56 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2007/08/%e6%97%a5%e8%a8%98%e3%81%ae%e3%82%b3%e3%83%a1%e3%83%b3%e3%83%88%e3%82%92%e6%ae%8b%e3%81%9b%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b%ef%bc%88cakephp%e4%bf%ae%e8%a1%8c-44%ef%bc%89.html</guid>
		<description><![CDATA[さてCakePHP修行。だいぶ終盤に近づいてきました。今回は日記にコメントを残す機能を作りこんでいきます。 ■ モデルやらをいろいろ作る 日記のコメントは当初予定していなかったのでSQLから作り始めます。 まずはSQL。 [...]]]></description>
			<content:encoded><![CDATA[<p>さてCakePHP修行。だいぶ終盤に近づいてきました。今回は日記にコメントを残す機能を作りこんでいきます。</p>
<p><strong>■ モデルやらをいろいろ作る</strong></p>
<p>日記のコメントは当初予定していなかったのでSQLから作り始めます。</p>
<p>まずはSQL。</p>
<pre class="code">
CREATE&nbsp;TABLE&nbsp;comments&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;INT&nbsp;UNSIGNED&nbsp;AUTO_INCREMENT&nbsp;PRIMARY&nbsp;KEY,
&nbsp;&nbsp;&nbsp;&nbsp;post_id&nbsp;INT&nbsp;UNSIGNED,
&nbsp;&nbsp;&nbsp;&nbsp;user_id&nbsp;INT&nbsp;UNSIGNED,
&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;TEXT,
&nbsp;&nbsp;&nbsp;&nbsp;created&nbsp;DATETIME&nbsp;DEFAULT&nbsp;NULL,
&nbsp;&nbsp;&nbsp;&nbsp;modified&nbsp;DATETIME&nbsp;DEFAULT&nbsp;NULL,
&nbsp;&nbsp;&nbsp;&nbsp;KEY&nbsp;post_id_created&nbsp;(post_id,&nbsp;created)
);
</pre>
<p>これにあわせてAssociationを設定します。UserとPostに対してhasManyの関係を記述します。またCommentモデル＆コントローラーも作成します。</p>
<p><strong>■ コメントの一覧</strong></p>
<p>コメントはそれぞれの日記に対してつくので、posts_controller.phpのdetail()に記述します。えーと、コードは次の一行足しただけですね・・・フレームワークの威力発揮です。簡単すぎる・・・。</p>
<pre class="code">
$this-&gt;set('comments',&nbsp;$this-&gt;Comment-&gt;findAll(array('Comment.post_id'=&gt;$post['Post']['id']),null,'Comment.created&nbsp;DESC'));
</pre>
<p>ちなみに画面はこんな感じ。</p>
<p><img alt="comment.gif" src="http://www.ideaxidea.com/archives/2007/08/10/comment.gif" width="400" height="302" /></p>
<p>↑ 日記の内容に対してコメントの一覧。自分のものに関しては削除できます。また新規追加もここから可能。</p>
<p><strong>■ コメントの追加、削除</strong></p>
<p>コメントの追加、削除に関しても基本的にはこの画面でできるので、CommentのViewは作っていません。作ったのはコントローラーの次の記述だけ。</p>
<pre class="code">
function&nbsp;add($id)&nbsp;{
&nbsp;&nbsp;$this-&gt;_checkLogin();
&nbsp;&nbsp;$me&nbsp;=&nbsp;$this-&gt;User-&gt;findById_hash($_COOKIE['my_id']);
&nbsp;&nbsp;$this-&gt;set('me',&nbsp;$me);
&nbsp;&nbsp;if&nbsp;(!empty($this-&gt;data))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Comment']['id']&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Comment']['post_id']&nbsp;=&nbsp;$id;
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Comment']['user_id']&nbsp;=&nbsp;$me['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Comment-&gt;save($this-&gt;data);
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Session-&gt;write('sys_msg',&nbsp;'Your&nbsp;comment&nbsp;has&nbsp;been&nbsp;added.');
&nbsp;&nbsp;}
&nbsp;&nbsp;$this-&gt;redirect('/posts/detail/'.$id);
}
function&nbsp;del($id)&nbsp;{
&nbsp;&nbsp;$this-&gt;_checkLogin();
&nbsp;&nbsp;$me&nbsp;=&nbsp;$this-&gt;User-&gt;findById_hash($_COOKIE['my_id']);
&nbsp;&nbsp;$comment&nbsp;=&nbsp;$this-&gt;Comment-&gt;findById($id);
&nbsp;&nbsp;$post&nbsp;=&nbsp;$this-&gt;Post-&gt;findById($comment['Comment']['post_id']);
&nbsp;&nbsp;$this-&gt;set('me',&nbsp;$me);
&nbsp;&nbsp;$this-&gt;Comment-&gt;del($id);
&nbsp;&nbsp;$this-&gt;Session-&gt;write('sys_msg',&nbsp;'Your&nbsp;comment&nbsp;has&nbsp;been&nbsp;deleted.');
&nbsp;&nbsp;$this-&gt;redirect('/posts/detail/'.$post['Post']['id']);
}
</pre>
<p>超簡単・・・20分ぐらいだったのでは。</p>
<p>これでコメントの追加、削除ができるようになりました。なお、編集は面倒なので省きました。削除して追加する方向でｗ。こういう機能の追加がやたら簡単ですね。フレームワーク。なめてました。</p>
<p>さてこんなところですかね。アプリとしてはまだまだ甘いところがありますが（エラー処理とか、権限処理とか）、修行としてはいったんここで終了ということにしましょう。あとは最後に今回学んだことをまとめて終わりにします。</p>
<p>挫折する気まんまんでしたが、無事に終わってしまいそうですな・・・。</p>
<p>※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじは<a href="http://www.ideaxidea.com/archives/cakephp/">こちら</a>へ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2007/08/cakephp_44.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>友達の招待・承認系の続きをつくる（CakePHP修行 #43）</title>
		<link>http://www.ideaxidea.com/archives/2007/08/cakephp_43.html</link>
		<comments>http://www.ideaxidea.com/archives/2007/08/cakephp_43.html#comments</comments>
		<pubDate>Fri, 10 Aug 2007 04:55:41 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2007/08/%e5%8f%8b%e9%81%94%e3%81%ae%e6%8b%9b%e5%be%85%e3%83%bb%e6%89%bf%e8%aa%8d%e7%b3%bb%e3%81%ae%e7%b6%9a%e3%81%8d%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b%ef%bc%88cakephp%e4%bf%ae%e8%a1%8c-43%ef%bc%89.html</guid>
		<description><![CDATA[さてさてCakePHP修行。ちょっと間が開きましたがさぼっていたわけではありません。細かいところで苦戦していました。 では作業報告。淡々といきます。 ■ 友達の招待（メール編） 友達を自分の友達にするには二通りあります。 [...]]]></description>
			<content:encoded><![CDATA[<p>さてさてCakePHP修行。ちょっと間が開きましたがさぼっていたわけではありません。細かいところで苦戦していました。</p>
<p>では作業報告。淡々といきます。</p>
<p><strong>■ 友達の招待（メール編）</strong></p>
<p>友達を自分の友達にするには二通りあります。メールで直接招待する方法と、友達の友達をみていて「この人とつながりたいな」と思ったときです。</p>
<p>まずはメールでの招待からいってみましょう。画面の流れは前回の「<a href="http://www.ideaxidea.com/archives/2007/08/snscakephp_38.html">SNSっぽい友達系の処理をつくりはじめてみる（CakePHP修行 #38）</a>」で紹介しました。</p>
<p>ここからメールを受け取った人がとる処理を考えます。</p>
<p>えーと、いきなりコード。簡単そうに見えていろいろ面倒でした。</p>
<pre class="code">
function&nbsp;invite()&nbsp;{
&nbsp;&nbsp;//&nbsp;check&nbsp;login
&nbsp;&nbsp;$this-&gt;_checkLogin();
&nbsp;&nbsp;//&nbsp;sys&nbsp;message
&nbsp;&nbsp;$this-&gt;set('sys_msg',&nbsp;$this-&gt;Session-&gt;read('sys_msg'));
&nbsp;&nbsp;$this-&gt;Session-&gt;delete('sys_msg');
&nbsp;&nbsp;//&nbsp;get&nbsp;&quot;my&nbsp;info&quot;
&nbsp;&nbsp;$me&nbsp;=&nbsp;$this-&gt;User-&gt;findById_hash($_COOKIE['my_id']);
&nbsp;&nbsp;$this-&gt;set('me',&nbsp;$me);
&nbsp;&nbsp;$this-&gt;pageTitle&nbsp;=&nbsp;'Invite&nbsp;a&nbsp;new&nbsp;friend';
&nbsp;&nbsp;//&nbsp;from&nbsp;start
&nbsp;&nbsp;$this-&gt;set('email_error',&nbsp;false);
&nbsp;&nbsp;if&nbsp;(!empty($this-&gt;data))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;error&nbsp;handling
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(empty($this-&gt;data['User']['email']))&nbsp;{&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;set('email_error',&nbsp;true);&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;user&nbsp;exists?
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($this-&gt;User-&gt;findCount(aa('User.email',$this-&gt;data['User']['email'])))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;user&nbsp;exists!
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$pal&nbsp;=&nbsp;$this-&gt;User-&gt;findByEmail($this-&gt;data['User']['email']);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($this-&gt;Friend-&gt;findCount(array('Friend.user_id'=&gt;$me['User']['id'],'Friend.friend_user_id'=&gt;$pal['User']['id'])))&nbsp;{&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;set('email_error',&nbsp;true);&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['id']&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['user_id']&nbsp;=&nbsp;$me['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['friend_user_id']&nbsp;=&nbsp;$pal['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['status']&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Friend-&gt;save($this-&gt;data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$inviteLink&nbsp;=&nbsp;WWW_URL.'friends'.DS.'accept'.DS.$this-&gt;Friend-&gt;getLastInsertID();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$inviteMail&nbsp;=&nbsp;VIEWS.'mail/friends_accept.php';
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;new&nbsp;user,&nbsp;add&nbsp;user&nbsp;and&nbsp;update&nbsp;hash
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;User-&gt;id&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;User-&gt;save($this-&gt;data['User']);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$new_id&nbsp;=&nbsp;$this-&gt;User-&gt;getLastInsertID();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$new_user['User']['id']&nbsp;=&nbsp;$new_id;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$new_user['User']['id_hash']&nbsp;=&nbsp;sha1(SHA1_KEY.$new_id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;User-&gt;save($new_user['User']);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;add&nbsp;friend&nbsp;relationship
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Friend-&gt;id&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['user_id']&nbsp;=&nbsp;$me['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['friend_user_id']&nbsp;=&nbsp;$new_id;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['status']&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Friend-&gt;save($this-&gt;data['Friend']);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$inviteLink&nbsp;=&nbsp;WWW_URL.'users'.DS.'join'.DS.$this-&gt;Friend-&gt;getLastInsertID();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$inviteMail&nbsp;=&nbsp;VIEWS.'mail/users_join.php';
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;send&nbsp;invites
&nbsp;&nbsp;&nbsp;&nbsp;$inviter&nbsp;=&nbsp;$me['User']['name'];
&nbsp;&nbsp;&nbsp;&nbsp;$msg&nbsp;=&nbsp;implode&nbsp;(file($inviteMail));
&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;(&quot;\$msg&nbsp;=&nbsp;\&quot;$msg\&quot;;&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;$toName&nbsp;=&nbsp;$this-&gt;data['User']['email'];
&nbsp;&nbsp;&nbsp;&nbsp;$subject&nbsp;=&nbsp;&quot;[code*code]&nbsp;Invitation&nbsp;from&nbsp;...&nbsp;&quot;.$me['User']['name'];
&nbsp;&nbsp;&nbsp;&nbsp;mb_send_mail&nbsp;($toName,&nbsp;$subject,&nbsp;$msg,&nbsp;&quot;From:&nbsp;&quot;.ADMIN_EMAIL);
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;write&nbsp;msg,&nbsp;jump
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Session-&gt;write('sys_msg',&nbsp;'Invitaion&nbsp;mail&nbsp;has&nbsp;been&nbsp;sent.');
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;redirect('/friends/');
&nbsp;&nbsp;}
}
</pre>
<p>面倒だったのは、今から招待しようとしている人のメールアドレスがすでに登録されているかどうか、また、すでに招待メールを送ったかどうかなどの判断をして場合分けしていくところ。</p>
<p>最初ぐちゃぐちゃとコードを書いていたのですが、わけがわからなくなったので、コーヒー飲んで気分をすっきりさせたあとにゼロから勢いで書きましたｗ。</p>
<p>なお、これで次のようなメールが送られます。まずは未登録の場合の招待メール。</p>
<blockquote><p>
Hello,<br />
taguchi wants you!<br />
click a link below to join in!<br />
---</p>
<p>http://www.codexcode.com/users/join/6</p>
<p>---
</p></blockquote>
<p>次にすでに登録されている場合の招待メール。</p>
<blockquote><p>
Hello,<br />
akiyan wants to join your network.<br />
click a link below to accept him!<br />
---</p>
<p>http://www.codexcode.com/friends/accept/8</p>
</blockquote>
<p>IDもろだしでよくないのでは、という意見もありますが、それはそれ。面倒なのでこのままにしちゃいました。まぁ、良しとしましょう。</p>
<p>で、これを受け取った人は次のような画面に飛びます（未登録の場合。登録済みの場合は後述）。</p>
<p><img alt="join.gif" src="http://www.ideaxidea.com/archives/2007/08/10/join.gif" width="400" height="297" /></p>
<p>↑ ここで友達からのメッセージを見て登録します。</p>
<p><img alt="join_2.gif" src="http://www.ideaxidea.com/archives/2007/08/10/join_2.gif" width="400" height="320" /></p>
<p>↑ 無事登録できました！</p>
<p><strong>■ 友達の友達を友達として登録する</strong></p>
<p>さて次は友達の友達を見ていて「お、この人と友達になりたい！」と思った場合です。画面で処理の流れを見ていきましょう。</p>
<p><img alt="accept_1.gif" src="http://www.ideaxidea.com/archives/2007/08/10/accept_1.gif" width="400" height="367" /></p>
<p>↑ まだ自分の友達でないユーザーをみるとこんな感じ。「Addしますか？」ときかれます。</p>
<p><img alt="accept_2.gif" src="http://www.ideaxidea.com/archives/2007/08/10/accept_2.gif" width="400" height="322" /></p>
<p>↑ Addしたい場合はメッセージを入れられます。</p>
<p><img alt="accept_3.gif" src="http://www.ideaxidea.com/archives/2007/08/10/accept_3.gif" width="400" height="192" /></p>
<p>↑ それを受け取ったほうはトップページでこのように「承認依頼が来ています！」と出ます。</p>
<p><img alt="accept_4.gif" src="http://www.ideaxidea.com/archives/2007/08/10/accept_4.gif" width="400" height="248" /></p>
<p>↑ 承認するかどうか選べます。</p>
<p>さらりと書きましたが、なかなか大変でした。友達にAddする部分のコードはこちら。</p>
<pre class="code">
function&nbsp;add($id)&nbsp;{
&nbsp;&nbsp;//&nbsp;check&nbsp;login
&nbsp;&nbsp;$this-&gt;_checkLogin();
&nbsp;&nbsp;//&nbsp;sys&nbsp;message
&nbsp;&nbsp;$this-&gt;set('sys_msg',&nbsp;$this-&gt;Session-&gt;read('sys_msg'));
&nbsp;&nbsp;$this-&gt;Session-&gt;delete('sys_msg');
&nbsp;&nbsp;//&nbsp;get&nbsp;&quot;my&nbsp;info&quot;
&nbsp;&nbsp;$me&nbsp;=&nbsp;$this-&gt;User-&gt;findById_hash($_COOKIE['my_id']);
&nbsp;&nbsp;$this-&gt;set('me',&nbsp;$me);
&nbsp;&nbsp;$pal&nbsp;=&nbsp;$this-&gt;User-&gt;findById($id);
&nbsp;&nbsp;$this-&gt;set('pal',&nbsp;$pal);
&nbsp;&nbsp;$this-&gt;pageTitle&nbsp;=&nbsp;'Add&nbsp;a&nbsp;new&nbsp;friend';
&nbsp;&nbsp;//&nbsp;process&nbsp;form
&nbsp;&nbsp;if&nbsp;(!empty($this-&gt;data))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$f&nbsp;=&nbsp;$this-&gt;Friend-&gt;findCount(array('Friend.user_id'=&gt;$me['User']['id'],'Friend.friend_user_id'=&gt;$id))&nbsp;?&nbsp;&nbsp;$this-&gt;Friend-&gt;find(array('Friend.user_id'=&gt;$me['User']['id'],'Friend.friend_user_id'=&gt;$id),'id')&nbsp;:&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['id']&nbsp;=&nbsp;&nbsp;$f&nbsp;?&nbsp;&nbsp;$f['Friend']['id']&nbsp;:&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['user_id']&nbsp;=&nbsp;$me['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['friend_user_id']&nbsp;=&nbsp;$id;
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['status']&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($this-&gt;Friend-&gt;save($this-&gt;data))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Session-&gt;write('sys_msg',&nbsp;'Invitaion&nbsp;mail&nbsp;has&nbsp;been&nbsp;sent.');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;redirect('/friends/');
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
}
</pre>
<p>次のその友達をAccept（承認）する場合はこちら。</p>
<pre class="code">
function&nbsp;accept($id)&nbsp;{
&nbsp;&nbsp;//&nbsp;check&nbsp;login
&nbsp;&nbsp;$this-&gt;_checkLogin();
&nbsp;&nbsp;//&nbsp;sys&nbsp;message
&nbsp;&nbsp;$this-&gt;set('sys_msg',&nbsp;$this-&gt;Session-&gt;read('sys_msg'));
&nbsp;&nbsp;$this-&gt;Session-&gt;delete('sys_msg');
&nbsp;&nbsp;//&nbsp;get&nbsp;&quot;my&nbsp;info&quot;
&nbsp;&nbsp;$me&nbsp;=&nbsp;$this-&gt;User-&gt;findById_hash($_COOKIE['my_id']);
&nbsp;&nbsp;$this-&gt;set('me',&nbsp;$me);
&nbsp;&nbsp;$pal&nbsp;=&nbsp;$this-&gt;User-&gt;findById($this-&gt;Friend-&gt;field('user_id',&nbsp;&quot;Friend.id=$id&quot;));
&nbsp;&nbsp;$this-&gt;set('pal',&nbsp;$pal);
&nbsp;&nbsp;$this-&gt;pageTitle&nbsp;=&nbsp;'Accept&nbsp;a&nbsp;new&nbsp;friend';
&nbsp;&nbsp;//&nbsp;process&nbsp;form
&nbsp;&nbsp;$this-&gt;set('memo',&nbsp;$this-&gt;Friend-&gt;field('memo',&nbsp;&quot;Friend.id=$id&quot;));
&nbsp;&nbsp;$this-&gt;set('id',&nbsp;$id);
&nbsp;&nbsp;//&nbsp;var_dump($this-&gt;params);
&nbsp;&nbsp;if&nbsp;(!empty($this-&gt;params['form']))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;switch($this-&gt;params['form']['cmd'])&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'yes':
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;accept
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['id']&nbsp;=&nbsp;$id;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['status']&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Friend-&gt;save($this-&gt;data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;link&nbsp;from&nbsp;me
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['id']&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['user_id']&nbsp;=&nbsp;$me['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['friend_user_id']&nbsp;=&nbsp;$pal['User']['id'];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data['Friend']['status']&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Friend-&gt;save($this-&gt;data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Session-&gt;write('sys_msg',&nbsp;'New&nbsp;member&nbsp;to&nbsp;your&nbsp;network!');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;redirect('/friends/');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'no':
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Friend-&gt;del($id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Session-&gt;write('sys_msg',&nbsp;'Request&nbsp;declined!');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;redirect('/users/home/');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
}
</pre>
<p>さすがにここらへんまでやるといろいろ慣れてきましたね。findやfield、findCountなどを使いこなせるようになってきました（かな？）。</p>
<p>さてこのままでもSNSっぽいとは思うのですがやはり日記のコメントぐらいは残したいもの。最後に日記コメント系の処理を作りこんでいきます。</p>
<p>※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじは<a href="http://www.ideaxidea.com/archives/cakephp/">こちら</a>へ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2007/08/cakephp_43.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>友達の日記一覧を作る（CakePHP修行 #42）</title>
		<link>http://www.ideaxidea.com/archives/2007/08/cakephp_42.html</link>
		<comments>http://www.ideaxidea.com/archives/2007/08/cakephp_42.html#comments</comments>
		<pubDate>Thu, 02 Aug 2007 09:37:27 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2007/08/%e5%8f%8b%e9%81%94%e3%81%ae%e6%97%a5%e8%a8%98%e4%b8%80%e8%a6%a7%e3%82%92%e4%bd%9c%e3%82%8b%ef%bc%88cakephp%e4%bf%ae%e8%a1%8c-42%ef%bc%89.html</guid>
		<description><![CDATA[さてmixiの中の人が「これが一番重いんですよー」と昔言っていたような気がする「友達の日記一覧」を作ります。ちょっと悩んだ。UserとFriendが紐づいているからそこからPostまで見にいけるか、など試行錯誤しましたが [...]]]></description>
			<content:encoded><![CDATA[<p>さてmixiの中の人が「これが一番重いんですよー」と昔言っていたような気がする「友達の日記一覧」を作ります。ちょっと悩んだ。UserとFriendが紐づいているからそこからPostまで見にいけるか、など試行錯誤しましたが、面倒になったので二段階で処理しました。</p>
<p>これって一段階で処理できるようなものなのかな？アソシエーションと$recursiveとか使えばひょっとしてできる？（＞青い人）。</p>
<p>ではコード。</p>
<pre class="code">
//&nbsp;friends'&nbsp;posts
$my_pals&nbsp;=&nbsp;array();
foreach&nbsp;($this-&gt;Friend-&gt;findAll(array('Friend.user_id'=&gt;$me['User']['id'],'Friend.status'=&gt;1),'friend_user_id')&nbsp;as&nbsp;$pal)&nbsp;{
&nbsp;&nbsp;$my_pals[]&nbsp;=&nbsp;$pal['Friend']['friend_user_id'];
}
$this-&gt;set('posts',&nbsp;$this-&gt;Post-&gt;findAll(aa(&quot;Post.user_id&quot;,&nbsp;$my_pals),null,'Post.created&nbsp;DESC'));
</pre>
<p>$my_palsにまずは友達のIDを突っ込み、そのIDに該当する日記を引っ張ってきています。ついでに作成日順に並べ替えてみました。</p>
<p>できあがったのはこちら。</p>
<p><img alt="home.gif" src="http://www.ideaxidea.com/archives/2007/08/02/home.gif" width="400" height="310" /></p>
<p>↑ 無事に友達の日記を引っ張ってこれました。数が多くなってきたときの処理作らなくちゃなー。</p>
<p>さて、こんなところですかね・・・次は何だろ。</p>
<p>友達の招待＆承認系の処理か・・・これが鬼門。</p>
<p>※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじは<a href="http://www.ideaxidea.com/archives/cakephp/">こちら</a>へ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2007/08/cakephp_42.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ヘルパーの使い方がわからなかったよ！（CakePHP修行 #41）</title>
		<link>http://www.ideaxidea.com/archives/2007/08/cakephp_41.html</link>
		<comments>http://www.ideaxidea.com/archives/2007/08/cakephp_41.html#comments</comments>
		<pubDate>Thu, 02 Aug 2007 09:04:06 +0000</pubDate>
		<dc:creator>taguchi</dc:creator>
				<category><![CDATA[CakePHP関連]]></category>

		<guid isPermaLink="false">http://100wp.sakura.ne.jp/archives/2007/08/%e3%83%98%e3%83%ab%e3%83%91%e3%83%bc%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%81%8c%e3%82%8f%e3%81%8b%e3%82%89%e3%81%aa%e3%81%8b%e3%81%a3%e3%81%9f%e3%82%88%ef%bc%81%ef%bc%88cakephp%e4%bf%ae%e8%a1%8c-41.html</guid>
		<description><![CDATA[CakePHPにはやたら便利そうなヘルパーというものがあるのですが、マニュアルに載っている数々の便利機能が使えなくて四苦八苦してしまいました。 何が足りなかったかというと、コントローラー内における次の一行・・・。 var [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPにはやたら便利そうなヘルパーというものがあるのですが、マニュアルに載っている数々の便利機能が使えなくて四苦八苦してしまいました。</p>
<p>何が足りなかったかというと、コントローラー内における次の一行・・・。</p>
<pre class="code">
var&nbsp;$helpers&nbsp;=&nbsp;array(&quot;time&quot;);
</pre>
<p>標準でHTMLヘルパーとか使えるからtimeヘルパーもそのままいけるかと思ったじゃないか！自分が気づかなかっただけだけとこれでかれこれ30分悩んでしまったよ・・・。</p>
<p><img alt="timeago.gif" src="http://www.ideaxidea.com/archives/2007/08/02/timeago.gif" width="400" height="258" /></p>
<p>↑ これで$time-&gt;timeAgoInWords()が使えるようになった！</p>
<p>それにしてもタイまで来て食事も抜いた状態で開発ってどういうことだよ・・・でも今夜は報告会。それまでになんとか形にしたい。まぁ、なんとかなりそうかな。夜ぐらいは出かけようかな。</p>
<p>※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじは<a href="http://www.ideaxidea.com/archives/cakephp/">こちら</a>へ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ideaxidea.com/archives/2007/08/cakephp_41.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

