<?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>BPS株式会社 開発ブログ Beyond Perspective Solutions LTD. &#187; CakePHP</title>
	<atom:link href="http://www.bpsinc.jp/blog/archives/category/framework/cakephp-framework/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bpsinc.jp/blog</link>
	<description>BPS株式会社（Beyond Perspective Solutions）のプログラマによる技術・開発などに関してのブログです</description>
	<lastBuildDate>Wed, 20 Jul 2011 08:14:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CakePHP Containableビヘイビア</title>
		<link>http://www.bpsinc.jp/blog/archives/2299</link>
		<comments>http://www.bpsinc.jp/blog/archives/2299#comments</comments>
		<pubDate>Thu, 02 Sep 2010 08:49:08 +0000</pubDate>
		<dc:creator>shibachan</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[芝原]]></category>
		<category><![CDATA[Behavior]]></category>
		<category><![CDATA[Containable]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=2299</guid>
		<description><![CDATA[Containableビヘイビアをご存知でしょうか？
もし、使用していならばこれを機にぜひ導入してみてください。
公式ページによると
ContainableBehavior は CakePHP のコアの新機能です。このビ [...]]]></description>
			<content:encoded><![CDATA[<p>Containableビヘイビアをご存知でしょうか？<br />
もし、使用していならばこれを機にぜひ導入してみてください。</p>
<p><a href="http://book.cakephp.org/ja/view/474/Containable">公式ページ</a>によると</p>
<blockquote><p>ContainableBehavior は CakePHP のコアの新機能です。このビヘイビアは find を実行するときに関連したモデルを選別したり限定したりするために使用します。コンテイナブル(<em>Containable</em>)は、データベース中の不要なものを削減し、アプリケーションの速度やパフォーマンスを改善します。このクラスを使うと、ユーザに対するデータの検索とフィルタを、美しく一貫した方法で行うこともできます。</p></blockquote>
<p>と、魅力的に説明されています。</p>
<p>使用方法や動作は、公式ページをみるのが手っ取り早いので割愛しますm(_ _)m<br />
#ググってください</p>
<p>このビヘイビアのメリットはたくさんあるのですが、<br />
特に便利だと思う点が</p>
<ul>
<li> recursiveやbindModelやunbindModelの記述がなくなって、<strong>ソースコードがきれいでわかりやすくなる</strong></li>
<li> あとで関連を選別できるからモデルの<strong>関連をモリモリの最大</strong>で書いておくことができる</li>
</ul>
<p>の２点で、とにかく便利です。</p>
<p>さらに以下のサンプルのようにモデルのrecursiveのデフォルト値を-1としておけば、<br />
何をcontainすればいいのか、しているのかがソースコードからわかりやすくなってお勧めです。</p>
<pre class="brush:php">class UserModel extends AppModel {

    public $recursive = -1;
    public $actsAs = array('Containable');
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/2299/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP 1.3でのプレフィックスルーティング(Prefix Routing)が簡単になった</title>
		<link>http://www.bpsinc.jp/blog/archives/2276</link>
		<comments>http://www.bpsinc.jp/blog/archives/2276#comments</comments>
		<pubDate>Tue, 24 Aug 2010 11:00:44 +0000</pubDate>
		<dc:creator>shibachan</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[芝原]]></category>
		<category><![CDATA[CakePHP1.3]]></category>
		<category><![CDATA[Prefix]]></category>
		<category><![CDATA[Routing]]></category>
		<category><![CDATA[プレフィックス]]></category>
		<category><![CDATA[ルーティング]]></category>
		<category><![CDATA[変更点]]></category>
		<category><![CDATA[移行]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=2276</guid>
		<description><![CDATA[CakePHPのPrefixRoutingは
例えばadmin_editという関数に対して、通常
/:controller/admin_edit
となるURLを
/admin/:controller/edit
とすること [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPのPrefixRoutingは<br />
例えばadmin_editという関数に対して、通常<br />
/:controller/admin_edit<br />
となるURLを<br />
/admin/:controller/edit<br />
とすることができるもの。</p>
<p>管理画面やWebAPIのために特別なURLを用意することができる。</p>
<p>このPrefixRoutingだが、設定の方法がCakePHP1.3より簡単なものに変更された。</p>
<p>そのやり方とは/app/config/core.phpで</p>
<pre class="brush:php">
Configure::write('Routing.prefixes', array('admin', 'api'));
</pre>
<p>とするだけ。<br />
# サンプルとしてadminとapiというプレフィックスを設定</p>
<p>ね、かんたんでしょ。</p>
<p>CakePHP1.2の時は複数のプレフィックス設定するのはRoutesをいちいち書いて結構めんどくさかったなー</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/2276/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>カタぞうの画像表示高速化</title>
		<link>http://www.bpsinc.jp/blog/archives/2004</link>
		<comments>http://www.bpsinc.jp/blog/archives/2004#comments</comments>
		<pubDate>Mon, 05 Jul 2010 00:20:10 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[カタぞう]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[キャッシュ]]></category>
		<category><![CDATA[画像]]></category>
		<category><![CDATA[高速化]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=2004</guid>
		<description><![CDATA[Webプログラミングの超基本ですが、画像表示の最適化です。
カタぞうでは、画像を動的に出力（サイズを変えたりなど）するために、いったんPHPを通しています。
投稿時に縮小しておくやりかたもありますが、ディスク容量を圧迫す [...]]]></description>
			<content:encoded><![CDATA[<p>Webプログラミングの超基本ですが、画像表示の最適化です。</p>
<p><a href="http://katazou.jp/">カタぞう</a>では、画像を動的に出力（サイズを変えたりなど）するために、いったんPHPを通しています。</p>
<p>投稿時に縮小しておくやりかたもありますが、ディスク容量を圧迫するのと、今後違うサイズが求められる可能性があるため、基本的に最大サイズで保存しておいて出力時に縮小画像を生成する仕組みを採用しています。</p>
<p>ところでこの仕組み、CakePHPのアクション内で実行すると、恐ろしく時間がかかります。</p>
<p>単純に画像をfpassthruするだけのコードで、600ミリ秒程度もかかりました。</p>
<p>主な原因は、Routingやフレームワークの初期処理が300msec程度、DBへのDESCRIBEが100msec程度、各種コンポーネントの初期化が200msec程度でした。</p>
<p>さすがに苦しいため、ここだけ生PHPで書いたところ、平均5msecに短縮。<br />
これなら、画像をwebrootにキャッシュしてApacheのキャッシュを使わせる・・・　等の処理をしなくても、遜色ありません。</p>
<p>今後のスケールに向けてもう少し練らないといけませんが、やっぱり基本は、不要な複雑処理を省くところですね。</p>
<p>（Railsの高速化テクを見ていて、「とにかくRailsに到達させるな」という方針で悲しくなりましたが、それと同じ）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/2004/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPで簡単Basic認証</title>
		<link>http://www.bpsinc.jp/blog/archives/1966</link>
		<comments>http://www.bpsinc.jp/blog/archives/1966#comments</comments>
		<pubDate>Wed, 30 Jun 2010 07:25:51 +0000</pubDate>
		<dc:creator>shibachan</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[芝原]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1966</guid>
		<description><![CDATA[CakePHPで簡単な管理画面を作ったので、認証をかけたいけど、UserテーブルつくってAuthComponentっていうのはめんどくさい。
複数人のアカウント制御できる必要もないし、そんなのオーバースペックだ。
つい先 [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPで簡単な管理画面を作ったので、認証をかけたいけど、UserテーブルつくってAuthComponentっていうのはめんどくさい。<br />
複数人のアカウント制御できる必要もないし、そんなのオーバースペックだ。</p>
<p>つい先ほど、まさにこの状態になって、簡単に認証を設定できないかと<br />
ネットの海をさまよっていると、やはりありました。<br />
<a href="http://blog.spicebox.jp/labs/2009/03/cakephp_12_basic.html">CakePHP 1.2 の Basic 認証設定があまりにも簡単すぎる </a></p>
<p>SecurityComponentを使ってController#beforeFillterでベーシック認証を設定するという方法です。</p>
<pre class="brush:php">
class HogeController extends AppController {

    public $components = array('Security');

    public function beforeFilter() {
        $this-&#62;Security-&#62;loginOptions = array('type'=&#62;'basic');
        $this-&#62;Security-&#62;loginUsers = array('username'=&#62;'password');
        $this-&#62;Security-&#62;requireLogin('*');  // 全アクションを指定（特定アクションも設定できる）
    }
}
</pre>
<p>確かにすごい簡単でした。<br />
パスワードが平文というのが少し気になりますが、簡単な認証でしたらこれで十分ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1966/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OAuthライブラリが謎の停止</title>
		<link>http://www.bpsinc.jp/blog/archives/1903</link>
		<comments>http://www.bpsinc.jp/blog/archives/1903#comments</comments>
		<pubDate>Sun, 27 Jun 2010 01:03:47 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[バグ]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1903</guid>
		<description><![CDATA[CakePHPでOAuthを使うのに、このライブラリが有名だと思います。
http://code.42dh.com/oauth/
MITライセンスなのが良いですよね。
ところが、これを使ったCakePHPのシステムで、d [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPでOAuthを使うのに、このライブラリが有名だと思います。</p>
<p><a href="http://code.42dh.com/oauth/">http://code.42dh.com/oauth/</a></p>
<p>MITライセンスなのが良いですよね。</p>
<p>ところが、これを使ったCakePHPのシステムで、debug=2の時は動くのに、debug=0にすると動かないという謎の問題に出くわしました。</p>
<p>止まる場所は、認証ページへのリダイレクトに使う、</p>
<pre class="brush:php">
$consumer-&#62;getRequestToken('http://twitter.com/oauth/request_token', $callback);
</pre>
<p>のあたりです。</p>
<p>ソースを追ってみたところ、OAuth.phpの以下の場所で止まっていました。</p>
<pre class="brush:php">
public function get_normalized_http_url() {
  $parts = parse_url($this-&#62;http_url);

  $port = @$parts&#91;'port'&#93;; // ←ここ！！
  $scheme = $parts&#91;'scheme'&#93;;
  $host = $parts&#91;'host'&#93;;
  $path = @$parts&#91;'path'&#93;;

  $port or $port = ($scheme == 'https') ? '443' : '80';

  if (($scheme == 'https' &#038;&#038; $port != '443')
      || ($scheme == 'http' &#038;&#038; $port != '80')) {
    $host = "$host:$port";
  }
  return "$scheme://$host$path";
}
</pre>
<p>いや、確かに、portというキーは無かったんですけど、<br />
そのための＠演算子だし、そもそもこんなのでFatal Errorになるはずもなく。</p>
<p>要するに、PHPエンジンの方のバグなのか、謎ですね・・・</p>
<p>解決策は以下。</p>
<pre class="brush:php">
public function get_normalized_http_url() {
  $parts = parse_url($this-&#62;http_url);

  //== add this ==
  if (!array_key_exists('port', $parts)) {
      $parts&#91;'port'&#93; = (isset($parts&#91;'scheme'&#93;) &#038;&#038; $parts&#91;'scheme'&#93; == 'https') ? '443' : '80';
  }
  //== add this ==

  $port = @$parts&#91;'port'&#93;;
  $scheme = $parts&#91;'scheme'&#93;;
  $host = $parts&#91;'host'&#93;;
  $path = @$parts&#91;'path'&#93;;

  $port or $port = ($scheme == 'https') ? '443' : '80';

  if (($scheme == 'https' &#038;&#038; $port != '443')
      || ($scheme == 'http' &#038;&#038; $port != '80')) {
    $host = "$host:$port";
  }
  return "$scheme://$host$path";
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1903/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP findの形式</title>
		<link>http://www.bpsinc.jp/blog/archives/1874</link>
		<comments>http://www.bpsinc.jp/blog/archives/1874#comments</comments>
		<pubDate>Tue, 22 Jun 2010 00:35:57 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1874</guid>
		<description><![CDATA[CakePHPのfind自体は使いやすいのですが、返ってくるのが配列で、しかもへんてこな形式なので、結構めんどくさいですよね。
たとえば、Userテーブルでfind(&#8217;all&#8217;)すると、

arr [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPのfind自体は使いやすいのですが、返ってくるのが配列で、しかもへんてこな形式なので、結構めんどくさいですよね。</p>
<p>たとえば、Userテーブルでfind(&#8217;all&#8217;)すると、</p>
<pre class="brush:php">
array(
  'User' =&#62; array(
    'id' =&#62; 1,
    'name' =&#62; 'yamada'
  ),
  'User' =&#62; array(
    'id' =&#62; 2,
    'name' =&#62; 'tanaka'
  ),
  'User' =&#62; array(
    'id' =&#62; 3,
    'name' =&#62; 'suzuki'
  ),
);
</pre>
<p>ですが、</p>
<p>Group hasMany Users の場合、Groupをfindすると、</p>
<pre class="brush:php">
array(
  'Group' =&#62; array(
    'id' =&#62; 1,
    'name' =&#62; 'Group-A'
  ),
  'User' =&#62; array(
    array(
      'id' =&#62; 1,
      'name' =&#62; 'yamada',
    ),
    array(
      'id' =&#62; 2,
      'name' =&#62; 'tanaka',
    ),
    array(
      'id' =&#62; 3,
      'name' =&#62; 'suzuki',
    ),
  ),
);
</pre>
<p>となり、形式が全然違います。</p>
<p>そのため、配列を引数にとるelementを作って、Viewを効率的にまとめる、という当たり前のことが、非常にやりにくい。<br />
こんなときは仕方ないので、後者の形式が来ることを期待して、前者の形式が来たら、以下のような姑息な手段が有効です。</p>
<pre class="brush:php">
if (isset($user&#91;'User'&#93;)) {
  $user+= $user&#91;'User'&#93;;
}
</pre>
<p>ほんっと、<br />
Rails → コード書いている時楽しいけど、その後がめんどくさい<br />
Cake → コード書いている時は苦痛だけど、インストールも運用も簡単<br />
ですよね・・・</p>
<p>↑のようなことをTwitterでつぶやいていたら、中の人から、Set::mapやFilterを使うと良いとアドバイスを頂きました。感謝感謝です。<br />
ただ、paginatorなどとの互換性を維持しつつ、望んでいる利便性を確保するには、少し工夫が必要そうですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1874/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP hiddenでclassを設定できない</title>
		<link>http://www.bpsinc.jp/blog/archives/1751</link>
		<comments>http://www.bpsinc.jp/blog/archives/1751#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:40:00 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1751</guid>
		<description><![CDATA[Formヘルパーを使う際、inputタグなどなら、

$form-&#62;input('User.name', array('class' =&#62; 'test'));

のようにclassを指定できますが、
hi [...]]]></description>
			<content:encoded><![CDATA[<p>Formヘルパーを使う際、inputタグなどなら、</p>
<pre class="brush:php">
$form-&#62;input('User.name', array('class' =&#62; 'test'));
</pre>
<p>のようにclassを指定できますが、</p>
<p>hiddenタグの場合、class指定は無視されます。</p>
<pre class="brush:php">
$form-&#62;input('User.id', array('type' =&#62; 'hidden', 'class' =&#62; 'test'));
</pre>
<p>これは、formヘルパーが以下のように意図的に無視している為で、<strong>仕様</strong>のようです。</p>
<pre class="brush:php">
function hidden($fieldName, $options = array()) {
        //（略）
	return sprintf(
		$this-&#62;Html-&#62;tags&#91;'hidden'&#93;,
		$options&#91;'name'&#93;,
		$this-&#62;_parseAttributes($options, array('name', 'class'), '', ' ')
	);
}
</pre>
<p>JavaScriptから制御する際など、hiddenにもclassを付けたいことは多々ありますが、考慮されていないようですね。</p>
<p>直接タイプしても面倒じゃないので、まあそれほど困らないのですが。</p>
<pre class="brush:html">
&#60;input type="hidden" name="data&#91;User&#93;&#91;id&#93;" class="test" /&#62;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1751/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP1.3 リンク付き画像の表示方法</title>
		<link>http://www.bpsinc.jp/blog/archives/1804</link>
		<comments>http://www.bpsinc.jp/blog/archives/1804#comments</comments>
		<pubDate>Mon, 14 Jun 2010 12:22:54 +0000</pubDate>
		<dc:creator>shibachan</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[芝原]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1804</guid>
		<description><![CDATA[リンクのついた画像をHtmlヘルパーで表示する方法がCakePHP1.3から変更になりました。
CakePHP1.2までであればこれは
$html-&#62;link($html-&#62;image('sample.p [...]]]></description>
			<content:encoded><![CDATA[<p>リンクのついた画像をHtmlヘルパーで表示する方法がCakePHP1.3から変更になりました。</p>
<p>CakePHP1.2までであればこれは</p>
<pre class="brush:php">$html-&#62;link($html-&#62;image('sample.png'),
        array('action' =&#62; 'hoge'), null, null, false);</pre>
<p>と書けました。<br />
第５引数のタイトル文字のエスケープ設定にfalseをセットし、imgタグをエスケープせずに、そのまま出力しています。</p>
<p>ですが、<br />
CakePHP1.3からはこのやり方ができなくなってしまいました。<br />
1.2</p>
<pre class="brush:php">HtmlHelper#link($title, $url = null, $options = array(), $confirmMessage = false, $escapeTitle = true);</pre>
<p>1.3</p>
<pre class="brush:php">HtmlHelper#link($title, $url = null, $options = array(), $confirmMessage = false);</pre>
<p>と$escapeTitle引数が削除されてしまいました。</p>
<p>エスケープができないんじゃ、画像表示されないじゃん！！と早合点したあなた、安心してください。<br />
CakeBookによれば$options['escape']を使用してくださいとのことです。<br />
なるほど。</p>
<p>というわけで、前置きが長くなりましたがCakePHP1.3からはリンク付きの画像を出力するには</p>
<pre class="brush:php">$html-&#62;link($html-&#62;image('sample.png'), $url, array('escape' =&#62; false));</pre>
<p>のようにします。</p>
<p>すこし、スマートになった気がしていいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1804/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPで、parent::beforeFilterの呼び忘れを防止</title>
		<link>http://www.bpsinc.jp/blog/archives/1748</link>
		<comments>http://www.bpsinc.jp/blog/archives/1748#comments</comments>
		<pubDate>Mon, 14 Jun 2010 00:49:00 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1748</guid>
		<description><![CDATA[CakePHPでは、AppControllerのbeforeFilter()で、Authコンポーネントの設定など色々な処理を書くと思います。
各コントローラでbeforeFilter()をオーバーライドした際、よくpar [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPでは、AppControllerのbeforeFilter()で、Authコンポーネントの設定など色々な処理を書くと思います。</p>
<p>各コントローラでbeforeFilter()をオーバーライドした際、よくparent::beforeFilter()を呼び忘れてハマるのは、たぶん私だけではないですよね？</p>
<p>そこで、呼び忘れを防止する簡単な対策です。</p>
<pre class="brush:php">
class AppController extends Controller {
    public function __construct() {
        parent::__construct();
        $this-&#62;layout = 'error';
    }

    public function beforeFilter() {
        $this-&#62;layout = 'front';

        //ほにゃらら
    }
}
</pre>
<p>このようにすることで、各コントローラでparent::beforeFilter()を呼び忘れると、エラーレイアウトが表示されます。<br />
目立って、すぐに分かりますね。</p>
<p>コンストラクタでerrorをセットすることで、各コントローラで</p>
<pre class="brush:php">
public $layout = 'front';
</pre>
<p>のようにやっていても上書きできます。</p>
<p>各コントローラのbeforeFilter()でlayoutをセットしていたら検知できないですが、簡易的な対策として、一定の効果はあるのでは無いでしょうか？</p>
<p>開発が終わったら、最適化のため消しておきましょう。</p>
<p># 気づいていると思いますが、AndriodのSuperNotCalledExceptionのノリです</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1748/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IXRライブラリの使い方</title>
		<link>http://www.bpsinc.jp/blog/archives/1671</link>
		<comments>http://www.bpsinc.jp/blog/archives/1671#comments</comments>
		<pubDate>Wed, 09 Jun 2010 01:07:10 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1671</guid>
		<description><![CDATA[PHPでXML-RPCサーバを作るには、IXRのライブラリが簡単です。
PEAR::XML_RPC2も良いですが、こっちの方がCakePHPで使うには良さそうですね。
以下のページで、CakePHPでの使い方もまとまって [...]]]></description>
			<content:encoded><![CDATA[<p>PHPでXML-RPCサーバを作るには、IXRのライブラリが簡単です。</p>
<p>PEAR::XML_RPC2も良いですが、こっちの方がCakePHPで使うには良さそうですね。</p>
<p>以下のページで、CakePHPでの使い方もまとまっています。<br />
<a href="http://bakery.cakephp.org/articles/view/how-to-create-an-xml-rpc-server-with-cakephp">http://bakery.cakephp.org/articles/view/how-to-create-an-xml-rpc-server-with-cakephp</a></p>
<p>基本的に、インデックスアクションでレシーバを登録するだけで、後は各アクションでPHPのオブジェクトをreturnできます。</p>
<p>あまりに簡単すぎて、基本的なことを調べるのがめんどくさくなります。</p>
<p>たとえば、base64やdateTimeで囲んだ値を返したいときはどうしたら良いでしょうか？</p>
<p>このようにやればOKです。</p>
<pre class="brush:php">
function _hogeAction($data) {
  return new IXR_Base64($bytedata);
}
function _piyoAction($data) {
  return new IXR_Date(time());
}
</pre>
<p>Base64は、内部でbase64_encodeが呼ばれるので、バイトデータを直接渡すようにします。<br />
dateは、タイムスタンプ値かISO形式を渡します。</p>
<p>dateのパースは、あまり柔軟性は無いので気をつけてください。</p>
<pre class="brush:php">
function parseIso($iso) {
    $this-&#62;year = substr($iso, 0, 4);
    $this-&#62;month = substr($iso, 4, 2);
    $this-&#62;day = substr($iso, 6, 2);
    $this-&#62;hour = substr($iso, 9, 2);
    $this-&#62;minute = substr($iso, 12, 2);
    $this-&#62;second = substr($iso, 15, 2);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1671/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

