<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2chinesetwfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:base="http://planetcakephp.org">
<channel>
 <title>Planet CakePHP - 中文</title>
 <link>http://planetcakephp.org/taxonomy/term/8/0</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/planet-cakephp-aggregator-chinese" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="planet-cakephp-aggregator-chinese" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-chinese" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-chinese" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/planet-cakephp-aggregator-chinese" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-chinese" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-chinese" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-chinese" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-chinese" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><item>
 <title>轉址..因為內地擋了 wrodpress.com …</title>
 <link>http://mooncakephp.wordpress.com/2009/12/06/%E8%BD%89%E5%9D%80-%E5%9B%A0%E7%82%BA%E5%85%A7%E5%9C%B0%E6%93%8B%E4%BA%86-wrodpress-com/</link>
 <description>&lt;p&gt;redirects… as mainland China blocks wordpress.com..&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cakephp.treetwo.com/"&gt;http://cakephp.treetwo.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/98/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/98/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/98/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/98/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/98/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/98/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/98/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/98/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/98/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/98/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D98%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/jPLGClXYUbc" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sun, 06 Dec 2009 12:36:12 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3881 at http://planetcakephp.org</guid>
</item>
<item>
 <title>About Code generation and other stuff</title>
 <link>http://mooncakephp.wordpress.com/2009/12/01/about-code-generation-and-other-stuff/</link>
 <description>&lt;p&gt;我最近在看 &lt;a href="http://www.amazon.com/Code-Generation-Action-Jack-Herrington/dp/1930110979"&gt;code generation in action&lt;/a&gt;, 其實是 CakePHP 的 bake 提起了我對code generation 的興趣, 然後我的 &lt;a href="http://www.littlehart.net/atthekeyboard/2009/11/10/code-generation-for-fun-and-profit/?utm_source%3Drss%26utm_medium%3Drss%26utm_campaign%3Drss"&gt;subscription&lt;/a&gt; 又看到有關 RoR 很多靈感都是來自這書, 便借了一本來看.&lt;/p&gt;
&lt;p&gt;只看到第4Chapter 的中間, 但….總覺得很難應用於project 上面, 是我的 project 太小型? 努力看下去再update 大家&lt;/p&gt;
&lt;p&gt;另外, deployment 永遠都是大難的日子, 特別是開發時沒有想過deployment 的code, 真的很煩, 開新的project, 下手寫code 之前, 一定要記得將deployment management 先想好, 特別是DB 應用很重的, config 會寫到DB的, 更是麻煩中的麻煩… (Drupal 等的CMS 的不例外…)&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/96/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/96/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/96/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/96/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/96/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/96/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/96/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/96/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/96/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/96/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D96%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/YMaus465BQE" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 01 Dec 2009 14:21:00 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3852 at http://planetcakephp.org</guid>
</item>
<item>
 <title>cakePHP Security Component – diabled field.</title>
 <link>http://mooncakephp.wordpress.com/2009/11/24/cakephp-security-component-diabled-field/</link>
 <description>&lt;p&gt;Security Component 會遇到的問題還真的不是一般的少&lt;/p&gt;
&lt;p&gt;今天的問題是，做了一頁form, 沒有使用自定義的form inputs, 但 submit 時仍然出現404 的 error. 我這個form 只有3 個 input, 兩個 dropdown box, 一個disabled 的field,&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
&amp;lt;?php
echo $form-&gt;create('pages',array('url'=&gt;'/pages/add'));
echo $form-&gt;input('env',array('label'=&gt;'Add to','default'=&gt;'woo','disabled'=&gt;'disabled'));
echo $form-&gt;label('current');
echo $form-&gt;select('current',array(1,2,3));
echo $form-&gt;label('day');
echo $form-&gt;select('day',array(1,2,3,4,5,6,7,8,9,10));
echo $form-&gt;label('trip');
echo $form-&gt;select('trip',array(1,2,3));
echo $form-&gt;end('Add');
?&gt;
&lt;/pre&gt;&lt;p&gt;顯示一個打算read only 的 field. 我一個一個將它們移除， 發覺問題出現在disable 的field 內.&lt;br /&gt;
google 一下, &lt;a href="https://trac.cakephp.org/ticket/3997"&gt;https://trac.cakephp.org/ticket/3997&lt;/a&gt; 發覺Security component 是不支持 disbaled field 的.. ticket 內有一些說明, 但… 一年多的ticket 呀…&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/89/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/89/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/89/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/89/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/89/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/89/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/89/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/89/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/89/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/89/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D89%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/h4TDSnCaXrw" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 24 Nov 2009 16:11:44 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3799 at http://planetcakephp.org</guid>
</item>
<item>
 <title>MySQL字符串函数大全</title>
 <link>http://www.thinkly.cn/index.php/archives/386</link>
 <description>&lt;dl compact="compact"&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;原文地址&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;p&gt;&lt;a title="http://www.phpv.net/html/1443.html" href="http://www.phpv.net/html/1443.html"&gt;http://www.phpv.net/html/1443.html&lt;/a&gt;&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;ASCII(str)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a name="IDX378"&gt;&lt;/a&gt;返回字符串&lt;code&gt;str&lt;/code&gt;的最左面字符的ASCII代码值。如果&lt;code&gt;str&lt;/code&gt;是空字符串，返回&lt;code&gt;0&lt;/code&gt;。如果&lt;code&gt;str&lt;/code&gt;是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。
&lt;pre&gt;mysql&gt; select ASCII('2');
        -&gt; 50
mysql&gt; select ASCII(2);
        -&gt; 50
mysql&gt; select ASCII('dx');
        -&gt; 100&lt;/pre&gt;&lt;p&gt;也可参见ORD()函数。 &lt;a name="IDX379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ORD(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;如果字符串str最左面字符是一个多字节字符，通过以格式&lt;code&gt;((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]&lt;/code&gt;返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与&lt;code&gt;ASCII()&lt;/code&gt;函数返回的相同值。
&lt;pre&gt;mysql&gt; select ORD('2');
        -&gt; 50
 &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;CONV(N,from_base,to_base)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;在不同的数字基之间变换数字。返回数字&lt;code&gt;N&lt;/code&gt;的字符串数字，从&lt;code&gt;from_base&lt;/code&gt;基变换为&lt;code&gt;to_base&lt;/code&gt;基，如果任何参数是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。参数&lt;code&gt;N&lt;/code&gt;解释为一个整数，但是可以指定为一个整数或一个字符串。最小基是&lt;code&gt;2&lt;/code&gt;且最大的基是&lt;code&gt;36&lt;/code&gt;。如果&lt;code&gt;to_base&lt;/code&gt;是一个负数，&lt;code&gt;N&lt;/code&gt;被认为是一个有符号数，否则，&lt;code&gt;N&lt;/code&gt;被当作无符号数。 &lt;code&gt;CONV&lt;/code&gt;以64位点精度工作。 
&lt;pre&gt;mysql&gt; select CONV("a",16,2);
        -&gt; '1010'
mysql&gt; select CONV("6E",18,8);
        -&gt; '172'
mysql&gt; select CONV(-17,10,-18);
        -&gt; '-H'
mysql&gt; select CONV(10+"10"+'10'+0xa,10,10);
        -&gt; '40'
&lt;a name="IDX381"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;BIN(N)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回二进制值&lt;code&gt;N&lt;/code&gt;的一个字符串表示，在此&lt;code&gt;N&lt;/code&gt;是一个长整数(&lt;code&gt;BIGINT&lt;/code&gt;)数字，这等价于&lt;code&gt;CONV(N,10,2)&lt;/code&gt;。如果&lt;code&gt;N&lt;/code&gt;是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select BIN(12);
        -&gt; '1100'&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;OCT(N)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;返回八进制值&lt;code&gt;N&lt;/code&gt;的一个字符串的表示，在此&lt;code&gt;N&lt;/code&gt;是一个长整型数字，这等价于&lt;code&gt;CONV(N,10,8)&lt;/code&gt;。如果&lt;code&gt;N&lt;/code&gt;是NULL，返回&lt;code&gt;NULL&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select OCT(12);
        -&gt; '14'
 &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;HEX(N)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;返回十六进制值&lt;code&gt;N&lt;/code&gt;一个字符串的表示，在此&lt;code&gt;N&lt;/code&gt;是一个长整型(&lt;code&gt;BIGINT&lt;/code&gt;)数字，这等价于&lt;code&gt;CONV(N,10,16)&lt;/code&gt;。如果&lt;code&gt;N&lt;/code&gt;是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select HEX(255);
        -&gt; 'FF'
&lt;a name="IDX384"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;CHAR(N,...)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;&lt;code&gt;CHAR()&lt;/code&gt;将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。&lt;/strong&gt;&lt;code&gt;NULL&lt;/code&gt;值被跳过。 
&lt;pre&gt;mysql&gt; select CHAR(77,121,83,81,'76');
        -&gt; 'MySQL'
mysql&gt; select CHAR(77,77.3,'77.3');
        -&gt; 'MMM'
 &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;CONCAT(str1,str2,...)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;返回来自于参数连结的字符串&lt;/strong&gt;。如果任何参数是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。 
&lt;pre&gt;mysql&gt; select CONCAT('My', 'S', 'QL');
        -&gt; 'MySQL'
mysql&gt; select CONCAT('My', NULL, 'QL');
        -&gt; NULL
mysql&gt; select CONCAT(14.3);
        -&gt; '14.3'&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;LENGTH(str)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;OCTET_LENGTH(str)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;CHAR_LENGTH(str)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;CHARACTER_LENGTH(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;的长度。 
&lt;pre&gt;mysql&gt; select LENGTH('text');
        -&gt; 4
mysql&gt; select OCTET_LENGTH('text');
        -&gt; 4&lt;/pre&gt;&lt;p&gt;注意，对于多字节字符，其CHAR_LENGTH()仅计算一次。 &lt;a name="IDX390"&gt;&lt;/a&gt;&lt;a name="IDX391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LOCATE(substr,str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;POSITION(substr IN str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回子串&lt;code&gt;substr&lt;/code&gt;在字符串&lt;code&gt;str&lt;/code&gt;第一个出现的位置，如果&lt;code&gt;substr&lt;/code&gt;不是在&lt;code&gt;str&lt;/code&gt;里面，返回&lt;code&gt;0&lt;/code&gt;. 
&lt;pre&gt;mysql&gt; select LOCATE('bar', 'foobarbar');
        -&gt; 4
mysql&gt; select LOCATE('xbar', 'foobar');
        -&gt; 0&lt;/pre&gt;&lt;pre&gt;该函数是多字节可靠的。 &lt;a name="IDX392"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LOCATE(substr,str,pos)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回子串&lt;code&gt;substr&lt;/code&gt;在字符串&lt;code&gt;str&lt;/code&gt;第一个出现的位置，从位置&lt;code&gt;pos&lt;/code&gt;开始。如果&lt;code&gt;substr&lt;/code&gt;不是在&lt;code&gt;str&lt;/code&gt;里面，返回&lt;code&gt;0&lt;/code&gt;。
&lt;pre&gt;mysql&gt; select LOCATE('bar', 'foobarbar',5);
        -&gt; 7&lt;/pre&gt;&lt;p&gt;这函数是多字节可靠的。 &lt;a name="IDX393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;INSTR(str,substr)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回子串&lt;code&gt;substr&lt;/code&gt;在字符串&lt;code&gt;str&lt;/code&gt;中的第一个出现的位置。这与有2个参数形式的&lt;code&gt;LOCATE()&lt;/code&gt;相同，除了参数被颠倒。 
&lt;pre&gt;mysql&gt; select INSTR('foobarbar', 'bar');
        -&gt; 4
mysql&gt; select INSTR('xbar', 'foobar');
        -&gt; 0&lt;/pre&gt;&lt;p&gt;这函数是多字节可靠的。 &lt;a name="IDX394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LPAD(str,len,padstr)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，左面用字符串&lt;code&gt;padstr&lt;/code&gt;填补直到&lt;code&gt;str&lt;/code&gt;是&lt;code&gt;len&lt;/code&gt;个字符长。 
&lt;pre&gt;mysql&gt; select LPAD('hi',4,'??');
        -&gt; '??hi'
&lt;a name="IDX395"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;RPAD(str,len,padstr)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，右面用字符串&lt;code&gt;padstr&lt;/code&gt;填补直到&lt;code&gt;str&lt;/code&gt;是&lt;code&gt;len&lt;/code&gt;个字符长。  
&lt;pre&gt;mysql&gt; select RPAD('hi',5,'?');
        -&gt; 'hi???'&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LEFT(str,len)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;的最左面&lt;code&gt;len&lt;/code&gt;个字符。
&lt;pre&gt;mysql&gt; select LEFT('foobarbar', 5);
        -&gt; 'fooba'&lt;/pre&gt;&lt;p&gt;该函数是多字节可靠的。 &lt;a name="IDX397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;RIGHT(str,len)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;的最右面&lt;code&gt;len&lt;/code&gt;个字符&lt;code&gt;。&lt;/code&gt;
&lt;pre&gt;mysql&gt; select RIGHT('foobarbar', 4);
        -&gt; 'rbar'&lt;/pre&gt;&lt;p&gt;该函数是多字节可靠的。 &lt;a name="IDX398"&gt;&lt;/a&gt;&lt;a name="IDX399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SUBSTRING(str,pos,len)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SUBSTRING(str FROM pos FOR len)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;MID(str,pos,len)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;从字符串&lt;code&gt;str&lt;/code&gt;返回一个&lt;code&gt;len&lt;/code&gt;个字符的子串，从位置&lt;code&gt;pos&lt;/code&gt;开始。使用&lt;code&gt;FROM&lt;/code&gt;的变种形式是ANSI SQL92语法。 
&lt;pre&gt;mysql&gt; select SUBSTRING('Quadratically',5,6);
        -&gt; 'ratica'&lt;/pre&gt;&lt;p&gt;该函数是多字节可靠的。 &lt;a name="IDX400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SUBSTRING(str,pos)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SUBSTRING(str FROM pos)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;从字符串&lt;code&gt;str&lt;/code&gt;的起始位置&lt;code&gt;pos&lt;/code&gt;返回一个子串。 
&lt;pre&gt;mysql&gt; select SUBSTRING('Quadratically',5);
        -&gt; 'ratically'
mysql&gt; select SUBSTRING('foobarbar' FROM 4);
        -&gt; 'barbar'&lt;/pre&gt;&lt;p&gt;该函数是多字节可靠的。 &lt;a name="IDX401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SUBSTRING_INDEX(str,delim,count)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回从字符串&lt;code&gt;str&lt;/code&gt;的第&lt;code&gt;count&lt;/code&gt;个出现&lt;code&gt;的&lt;/code&gt;分隔符&lt;code&gt;delim&lt;/code&gt;之后的子串。如果&lt;code&gt;count&lt;/code&gt;是正数，返回最后的分隔符到左边(从左边数) 的所有字符。如果&lt;code&gt;count&lt;/code&gt;是负数，返回最后的分隔符到右边的所有字符(从右边数)。 
&lt;pre&gt;mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -&gt; 'www.mysql'
mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -&gt; 'mysql.com'&lt;/pre&gt;&lt;p&gt;该函数对多字节是可靠的。 &lt;a name="IDX402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LTRIM(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回删除了其前置空格字符的字符串&lt;code&gt;str&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select LTRIM('  barbar');
        -&gt; 'barbar'&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;RTRIM(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回删除了其拖后空格字符的字符串&lt;code&gt;str&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select RTRIM('barbar   ');
        -&gt; 'barbar'&lt;/pre&gt;&lt;pre&gt;该函数对多字节是可靠的。 &lt;a name="IDX404"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，其所有&lt;code&gt;remstr&lt;/code&gt;前缀或后缀被删除了。如果没有修饰符&lt;code&gt;BOTH&lt;/code&gt;、&lt;code&gt;LEADING&lt;/code&gt;或&lt;code&gt;TRAILING&lt;/code&gt;给出，&lt;code&gt;BOTH&lt;/code&gt;被假定。如果&lt;code&gt;remstr&lt;/code&gt;没被指定，空格被删除。 
&lt;pre&gt;mysql&gt; select TRIM('  bar   ');
        -&gt; 'bar'
mysql&gt; select TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -&gt; 'barxxx'
mysql&gt; select TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -&gt; 'bar'
mysql&gt; select TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -&gt; 'barx'&lt;/pre&gt;&lt;p&gt;该函数对多字节是可靠的。 &lt;a name="IDX405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SOUNDEX(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回&lt;code&gt;str&lt;/code&gt;的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符，但是&lt;code&gt;SOUNDEX()&lt;/code&gt;函数返回一个任意长的字符串。你可以在结果上使用&lt;code&gt;SUBSTRING()&lt;/code&gt;得到一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。 
&lt;pre&gt;mysql&gt; select SOUNDEX('Hello');
        -&gt; 'H400'
mysql&gt; select SOUNDEX('Quadratically');
        -&gt; 'Q36324'
&lt;a name="IDX406"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;SPACE(N)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回由&lt;code&gt;N&lt;/code&gt;个空格字符组成的一个字符串。 
&lt;pre&gt;mysql&gt; select SPACE(6);
        -&gt; '      '
&lt;a name="IDX407"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;REPLACE(str,from_str,to_str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，其字符串&lt;code&gt;from_str&lt;/code&gt;的所有出现由字符串&lt;code&gt;to_str&lt;/code&gt;代替。 
&lt;pre&gt;mysql&gt; select REPLACE('www.mysql.com', 'w', 'Ww');
        -&gt; 'WwWwWw.mysql.com'&lt;/pre&gt;&lt;p&gt;该函数对多字节是可靠的。 &lt;a name="IDX408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;REPEAT(str,count)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回由重复&lt;code&gt;count&lt;/code&gt;Times次的字符串&lt;code&gt;str&lt;/code&gt;组成的一个字符串。如果&lt;code&gt;count &amp;lt;= 0&lt;/code&gt;，返回一个空字符串。如果&lt;code&gt;str&lt;/code&gt;或&lt;code&gt;count&lt;/code&gt;是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select REPEAT('MySQL', 3);
        -&gt; 'MySQLMySQLMySQL'
&lt;a name="IDX409"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;REVERSE(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回颠倒字符顺序的字符串&lt;code&gt;str&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; select REVERSE('abc');
        -&gt; 'cba'&lt;/pre&gt;&lt;p&gt;该函数对多字节可靠的。 &lt;a name="IDX410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;INSERT(str,pos,len,newstr)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，在位置&lt;code&gt;pos&lt;/code&gt;起始的子串且&lt;code&gt;len&lt;/code&gt;个字符长得子串由字符串&lt;code&gt;newstr&lt;/code&gt;代替。 
&lt;pre&gt;mysql&gt; select INSERT('Quadratic', 3, 4, 'What');
        -&gt; 'QuWhattic'&lt;/pre&gt;&lt;p&gt;该函数对多字节是可靠的。 &lt;a name="IDX411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ELT(N,str1,str2,str3,...)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;如果&lt;code&gt;N&lt;/code&gt;= &lt;code&gt;1&lt;/code&gt;，返回&lt;code&gt;str1&lt;/code&gt;，如果&lt;code&gt;N&lt;/code&gt;= &lt;code&gt;2&lt;/code&gt;，返回&lt;code&gt;str2&lt;/code&gt;，等等。如果&lt;code&gt;N&lt;/code&gt;小于&lt;code&gt;1&lt;/code&gt;或大于参数个数，返回&lt;code&gt;NULL&lt;/code&gt;。&lt;code&gt;ELT()&lt;/code&gt;是&lt;code&gt;FIELD()&lt;/code&gt;反运算。 
&lt;pre&gt;mysql&gt; select ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -&gt; 'ej'
mysql&gt; select ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -&gt; 'foo'&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;FIELD(str,str1,str2,str3,...)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回&lt;code&gt;str&lt;/code&gt;在&lt;code&gt;str1&lt;/code&gt;, &lt;code&gt;str2&lt;/code&gt;, &lt;code&gt;str3&lt;/code&gt;, &lt;code&gt;...&lt;/code&gt;清单的索引。如果&lt;code&gt;str&lt;/code&gt;没找到，返回&lt;code&gt;0&lt;/code&gt;。&lt;code&gt;FIELD()&lt;/code&gt;是&lt;code&gt;ELT()&lt;/code&gt;反运算。 
&lt;pre&gt;mysql&gt; select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -&gt; 2
mysql&gt; select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -&gt; 0&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;FIND_IN_SET(str,strlist)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;如果字符串&lt;code&gt;str&lt;/code&gt;在由&lt;code&gt;N&lt;/code&gt;子串组成的表&lt;code&gt;strlist&lt;/code&gt;之中，返回一个&lt;code&gt;1&lt;/code&gt;到&lt;code&gt;N&lt;/code&gt;的值。一个字符串表是被&lt;samp&gt;“,”&lt;/samp&gt;分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为&lt;code&gt;SET&lt;/code&gt;的列，&lt;code&gt;FIND_IN_SET()&lt;/code&gt;函数被优化而使用位运算！如果&lt;code&gt;str&lt;/code&gt;不是在&lt;code&gt;strlist&lt;/code&gt;里面或如果&lt;code&gt;strlist&lt;/code&gt;是空字符串，返回&lt;code&gt;0&lt;/code&gt;。如果任何一个参数是&lt;code&gt;NULL&lt;/code&gt;，返回&lt;code&gt;NULL&lt;/code&gt;。如果第一个参数包含一个&lt;samp&gt;“,”&lt;/samp&gt;，该函数将工作不正常。 
&lt;pre&gt;mysql&gt; SELECT FIND_IN_SET('b','a,b,c,d');
        -&gt; 2
&lt;a name="IDX414"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;MAKE_SET(bits,str1,str2,...)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回一个集合 (包含由&lt;samp&gt;“,”&lt;/samp&gt;字符分隔的子串组成的一个字符串)，由相应的位在&lt;code&gt;bits&lt;/code&gt;集合中的的字符串组成。&lt;code&gt;str1&lt;/code&gt;对应于位0，&lt;code&gt;str2&lt;/code&gt;对应位1，等等。在&lt;code&gt;str1&lt;/code&gt;, &lt;code&gt;str2&lt;/code&gt;, &lt;code&gt;...&lt;/code&gt;中的&lt;code&gt;NULL&lt;/code&gt;串不添加到结果中。 
&lt;pre&gt;mysql&gt; SELECT MAKE_SET(1,'a','b','c');
        -&gt; 'a'
mysql&gt; SELECT MAKE_SET(1 | 4,'hello','nice','world');
        -&gt; 'hello,world'
mysql&gt; SELECT MAKE_SET(0,'a','b','c');
        -&gt; ''&lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;EXPORT_SET(bits,on,off,[separator,[number_of_bits]])&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回一个字符串，在这里对于在“bits”中设定每一位，你得到一个“on”字符串，并且对于每个复位(reset)的位，你得到一个 “off”字符串。每个字符串用“separator”分隔(缺省“,”)，并且只有“bits”的“number_of_bits” (缺省64)位被使用。 
&lt;pre&gt;mysql&gt; select EXPORT_SET(5,'Y','N',',',4)
        -&gt; Y,N,Y,N &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;LCASE(str)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LOWER(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。 
&lt;pre&gt;mysql&gt; select LCASE('QUADRATICALLY');
        -&gt; 'quadratically'
&lt;a name="IDX419"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;UCASE(str)&lt;/code&gt; &lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;UPPER(str)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;返回字符串&lt;code&gt;str&lt;/code&gt;，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。 
&lt;pre&gt;mysql&gt; select UCASE('Hej');
        -&gt; 'HEJ'&lt;/pre&gt;&lt;p&gt;该函数对多字节是可靠的。 &lt;a name="IDX420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LOAD_FILE(file_name)&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;读入文件并且作为一个字符串返回文件内容。文件必须在服务器上，你必须指定到文件的完整路径名，而且你必须有&lt;strong&gt;file&lt;/strong&gt;权限。文件必须所有内容都是可读的并且小于&lt;code&gt;max_allowed_packet&lt;/code&gt;。如果文件不存在或由于上面原因之一不能被读出，函数返回&lt;code&gt;NULL&lt;/code&gt;。 
&lt;pre&gt;mysql&gt; UPDATE table_name
           SET blob_column=LOAD_FILE("/tmp/picture")
           WHERE id=1;&lt;/pre&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;必要时自动变换数字为字符串，并且反过来也如此： &lt;/p&gt;
&lt;pre&gt;mysql&gt; SELECT 1+"1";
        -&gt; 2
mysql&gt; SELECT CONCAT(2,' test');
        -&gt; '2 test'&lt;/pre&gt;&lt;p&gt;如果你想要明确地变换一个数字到一个字符串，把它作为参数传递到&lt;code&gt;CONCAT()&lt;/code&gt;。 &lt;/p&gt;
&lt;p&gt;如果字符串函数提供一个二进制字符串作为参数，结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。 &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/18dwgyhrNNA" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 24 Nov 2009 06:41:41 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">3795 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Uncaught exception ‘Zend_Gdata_App_HttpException’ with message ‘Expected response code 200, got 400</title>
 <link>http://mooncakephp.wordpress.com/2009/11/17/uncaught-exception-zend_gdata_app_httpexception-with-message-expected-response-code-200-got-400/</link>
 <description>&lt;p&gt;今天我在使用 &lt;a href="http://code.google.com/intl/zh-TW/apis/gdata/articles/php_client_lib.html#gdata-installation"&gt;gdata&lt;/a&gt;(來自 PHP Zend framework) 嘗試存取一段youtube video的影片的時候遇到了標題的error. 我使用了半個小時設定一個正確的 InstalltionChecker.php, 先排除我的伺服器已經裝有 php-xml libraries, ssl libraries, 但仍然無解. Google 沒有提供一個合用的答案.&lt;/p&gt;
&lt;p&gt;最後我發現, 是youtube 判定該 video 違反了某些版權協定, 所以返回了 400錯誤碼, 正解是:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
&amp;lt;?php
try {
  $yt = new Zend_Gdata_YouTube();
  $videoEntry = $yt-&gt;getVideoEntry($key);
} catch(Zend_Gdata_App_HttpException e) {
  //handle error
}
?&gt;
&lt;/pre&gt;&lt;p&gt;Today i encountered the above error when i am trying to fetch youtube data given the video id using PHP Zend framework suggested by &lt;a href="http://code.google.com/intl/zh-TW/apis/gdata/articles/php_client_lib.html#gdata-installation"&gt;google&lt;/a&gt;. I had made half an hour top setup the InstallationChecker.php, which shows the installation had no errors. I further debug using xdebug, cross check php-xml libraries, ssl libraries on the server, but no clue. Google do not provide a solution.&lt;/p&gt;
&lt;p&gt;In the end, youtube banned the video because of copyrights, but just throw a response code 400… to solve it:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
&amp;lt;?php
try {
  $yt = new Zend_Gdata_YouTube();
  $videoEntry = $yt-&gt;getVideoEntry($key);
} catch(Zend_Gdata_App_HttpException e) {
  //handle error
}
?&gt;
&lt;/pre&gt;&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/80/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/80/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/80/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/80/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/80/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/80/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/80/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/80/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/80/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/80/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D80%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/-3zF1Ew66GI" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 17 Nov 2009 12:18:05 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3713 at http://planetcakephp.org</guid>
</item>
<item>
 <title>續 Security Component</title>
 <link>http://mooncakephp.wordpress.com/2009/11/06/%E7%BA%8C-security-component/</link>
 <description>&lt;p&gt;Security Component enable 了以後, 在 $form-&gt;end() 的時候會加一個 hash token. 這很容易理解, 就是用這個hash tag 證明這張表單的正確性. 但實際上這個hash 是如何產生?&lt;br /&gt;
API: &lt;a href="http://api.cakephp.org/view_source/security-component/#line-612"&gt;http://api.cakephp.org/view_source/security-component/#line-612&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;簡明點說, 沒有timestamp , 但有form 的每一個field, field 的name attribute. 所以你不可以自己加 input tags. 例子:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
&amp;lt;?php
//add.ctp
  echo $form-&gt;create('page',array('url'=&gt;$this-&gt;here));
  echo $form-&gt;input('title');
  echo $form-&gt;input('check',array('type'=&gt;'checkbox'));
?&gt;
&lt;input name="data[page][abc]" value="abc" /&gt;
&amp;lt;?php
  echo $form-&gt;end('submit');
?&gt;
&lt;/pre&gt;&lt;p&gt;便pass 不了有 security component 的 controller 了, 因為有一個field 不使用 $form-&gt;input()&lt;/p&gt;
&lt;p&gt;第一眼看, 這樣沒有問題呀, 因為input 可以使用 $form-&gt;input(). 有很多設定(options)可以改變 input 的, div=&gt;false, label=&gt;false 等等. layout html 上應該沒有什麼限制&lt;/p&gt;
&lt;p&gt;對, 所以我都只是找到一個情況會出亂子. 就是 checkbox:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
&amp;lt;?php
$form-&gt;input('check',array('type'=&gt;'checkbox'));
?&gt;
&lt;/pre&gt;&lt;p&gt;會輸出兩個input tag, 一個hidden, 一個type 是checkbox. (v1.3 好像可以不輸出hidden field)&lt;/p&gt;
&lt;p&gt;問題是, 兩個同一個name 的 input 會令某些 js validation framework 出亂子. 永遠都只看hidden 的 input tag (&lt;a href="http://api.cakephp.org/view_source/form-helper/#line-871"&gt;因為 hidden 又一定在前面, type=’checkbox’ 在後&lt;/a&gt; ). 所以…改js validation&lt;/p&gt;
&lt;p&gt;p.s. 最最後, 我發覺, 只要你的 input tag 不使用 data[model][name] 的方式命名. 便不會出現問題, 因為 security component 只找用這個方式命名的field 做 hash… 但 controller 的 $this-&gt;data 便不會出現這field (model 的validation 都不會經過..), 除非…&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
//controller.php
function beforeFilter() {
  parent::beforeFilter();
  //unsafe!!! check exact equals of model and field name before merge
  //記得對清楚 model 和 field name 才 merge..
  $this-&gt;data = array_merge($this-&gt;data,$this-&gt;params[model]);
}
&lt;/pre&gt;&lt;p&gt;我的 case 不合用了, 我只需要使用者check了就好, 不需要走進DB, 直接check 了就pass, 否則fail&lt;/p&gt;
&lt;p&gt;p.p.s: &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"&gt;http://en.wikipedia.org/wiki/Cross-site_request_forgery&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/56/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/56/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/56/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/56/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/56/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/56/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/56/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/56/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/56/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/56/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D56%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/ruvSMIAJmUA" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Fri, 06 Nov 2009 17:09:00 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3586 at http://planetcakephp.org</guid>
</item>
<item>
 <title>New Feed: My findings on CakePHP</title>
 <link>http://planetcakephp.org/aggregator/sources/3548-my-findings-on-cakephp</link>
 <description>&lt;p&gt;Just another WordPress.com weblog&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/RceplTFIJfY" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Thu, 05 Nov 2009 13:28:09 +0000</pubDate>
 <dc:creator>Derick Ng</dc:creator>
 <guid isPermaLink="false">3548 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP Security component</title>
 <link>http://mooncakephp.wordpress.com/2009/11/04/cakephp-security-component/</link>
 <description>&lt;p&gt;Advanced: &lt;a href="http://mooncakephp.wordpress.com/2009/11/06/%E7%BA%8C-security-component/"&gt;http://mooncakephp.wordpress.com/2009/11/06/續-security-component/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今天遇到了一個特別的 bug, 在一個 add 頁面, page load 沒有問題,&lt;br /&gt;
但submit 的時候卻白畫面, 有進過 controller 的 beforeFilter(),&lt;br /&gt;
但沒有進過controller 的 add.&lt;br /&gt;
答案是 Security compoent enable 了, 因為沒有使用$form-&gt;end()&lt;br /&gt;
令頁面沒有提交一組 hidden 的 hash code, CakePHP 以為是安全問題, beforeFilter 之後就 filter 了….&lt;/p&gt;
&lt;p&gt;cookbook:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;When using the Security Component you &lt;strong&gt;must&lt;/strong&gt; use the FormHelper to create your forms. The Security Component looks for certain indicators that are created and managed by the FormHelper (especially those created in create() and end()).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/53/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/53/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/53/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/53/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/53/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/53/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/53/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/53/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/53/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/53/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D53%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/rTYuJUZEfA4" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Wed, 04 Nov 2009 14:14:50 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3549 at http://planetcakephp.org</guid>
</item>
<item>
 <title>cakePHP admin pages setup</title>
 <link>http://mooncakephp.wordpress.com/2009/11/03/cakephp-admin-pages-setup/</link>
 <description>&lt;div&gt;使用內建的 admin routing 的缺點:&lt;br /&gt;
1. 會使用同一個 model, 包括model 的 validation rules, beforeFilter(), beforeValidate() 等等&lt;/div&gt;
&lt;div&gt;直接令model 的結構複雜化 (因為要同時照顧/考慮admin site)&lt;/div&gt;
&lt;div&gt;2. deploy admin site 時也有機會影響到 normal site&lt;/div&gt;
&lt;div&gt;因為修改的都是同一組files&lt;/div&gt;
&lt;div&gt;第二個缺點還可以使用 test 來減少出錯&lt;/div&gt;
&lt;div&gt;但共用 model 還真的是很麻煩&lt;/div&gt;
&lt;div&gt;特別是同一組 validation rules, 因為 admin site 的 validation 通常都很鬆&lt;/div&gt;
&lt;div&gt;而normal site 就很小心&lt;/div&gt;
&lt;div&gt;所以我使用了另一個方法做 admin site, 就是開另一個admin project&lt;/div&gt;
&lt;div&gt;bake: cake/console/cake bake project admin&lt;/div&gt;
&lt;div&gt;再重新bake MVC&lt;/div&gt;
&lt;p&gt;最後:&lt;/p&gt;
&lt;div id="attachment_49" class="wp-caption alignnone" style="width: 353px"&gt;&lt;img class="size-full wp-image-49" title="admin_site" src="http://mooncakephp.files.wordpress.com/2009/11/admin_site.png?w%3D343%26h%3D475" alt="Admin site 結構" width="343" height="475" /&gt;&lt;br /&gt;
&lt;p class="wp-caption-text"&gt;Admin site 結構&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/48/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/48/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/48/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/48/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/48/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/48/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/48/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/48/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/48/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/48/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D48%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/ChwCU9OirzM" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 03 Nov 2009 10:07:14 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3550 at http://planetcakephp.org</guid>
</item>
<item>
 <title>RESTful Router::parseExtensions()</title>
 <link>http://mooncakephp.wordpress.com/2009/10/28/restful-routerparseextensions/</link>
 <description>&lt;p&gt;在嘗試 RESTful 的response 的時候, (其實只想 time.xml 返回xml, time.json 返回json 而已)&lt;br /&gt;
參考了cookbook: &lt;a href="http://book.cakephp.org/view/477/The-Simple-Setup"&gt;http://book.cakephp.org/view/477/The-Simple-Setup&lt;/a&gt;&lt;br /&gt;
API: &lt;a href="http://api.cakephp.org/class/router#method-RouterparseExtensions"&gt;http://api.cakephp.org/class/router#method-RouterparseExtensions&lt;/a&gt;&lt;br /&gt;
Router 內加一句, 再在 APP./views/{controller}/xml/time.ctp&lt;br /&gt;
便可以返回xml, 但問題是, html header 不是 text/xml, 而是一般的 text/html?&lt;/p&gt;
&lt;p&gt;為什麼!!!!!&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/46/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/46/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/46/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/46/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/46/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/46/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/46/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/46/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/46/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/46/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D46%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/llh3LZXJ9m8" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Wed, 28 Oct 2009 16:34:32 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3551 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP path rewriter/SEO knife: Router</title>
 <link>http://mooncakephp.wordpress.com/2009/10/20/cakephp-path-rewriterseo-knife-router/</link>
 <description>&lt;p&gt;存在的意義:&lt;br /&gt;
將url /users/add 改成 /member/add 同樣可以存取&lt;/p&gt;
&lt;p&gt;當然, 你還有很多其他的需要而需要修改存取的 url,&lt;br /&gt;
例如, SEO 的原因, 項目長的”就是不喜歡” 或者 “你不覺得 create 比 add 好?”&lt;br /&gt;
省一口氣, 寫一條 router 算吧了&lt;br /&gt;
所以, Router 救了程序員一命&lt;br /&gt;
特別是因為MVC frameworks(CakePHP 當然不例外) 都習慣使用controller 名為相對應的url&lt;/p&gt;
&lt;p&gt;Router 其實就像 apache 的 .htaccess 一樣&lt;br /&gt;
你可以將一些目標字眼轉到 controller 的特定函數來處理&lt;/p&gt;
&lt;p&gt;使用上也可以很簡單, 如果你的需求只是和上面的第一個意義一樣的話&lt;br /&gt;
例如,&lt;/p&gt;
&lt;p&gt;存取 /time 改為 /pages/time:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
Router::connect ('/time', array('controller'=&gt;'pages', 'action'=&gt;'time'));
&lt;/pre&gt;&lt;p&gt;存取/users/1 改為/users/view/1:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
Router::connect ('/users/:id', array('controller'=&amp;gt;'users', 'action'=&amp;gt;'view'),array('id'=&amp;gt;'[0-9]+'));
&lt;/pre&gt;&lt;p&gt;不過也可以像正則表達式一樣複雜&lt;/p&gt;
&lt;p&gt;最後一個警告, $this-&gt;Auth-&gt;allow() 內的函數是 controllers 內的函數名,&lt;br /&gt;
而不是 router 內的 url&lt;/p&gt;
&lt;p&gt;ref: &lt;a href="http://book.cakephp.org/view/46/Routes-Configuration"&gt;http://book.cakephp.org/view/46/Routes-Configuration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/42/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/42/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/42/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/42/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/42/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/42/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/42/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/42/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/42/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/42/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D42%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/tNCPN25KlL4" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 20 Oct 2009 15:33:35 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3552 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Admin pages / Admin Routing</title>
 <link>http://mooncakephp.wordpress.com/2009/10/15/admin-pages-admin-routing/</link>
 <description>&lt;p&gt;CakePHP 在 bake controller 的時候, console 會詢問你會否使用 admin methods&lt;/p&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;而所謂的admin methods 其實是指同一個controller 之內的: admin_index(), admin_view(), admin_add(), admin_edit(), admin_delete() 五個method&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;神奇的 router 便會將這些 method route 到: http://{WEBROOT}/admin/{controller}/{index}, 而不是 http://{WEBROOT}/{controller}/{admin_index}&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;那你便可以做一些管理人員專用的method, 以方便區分管理人員的功能和一般使用者的功能&lt;/div&gt;
&lt;div style="margin-top:12px;margin-bottom:0;"&gt;但留意, 在這個預設設定之下, cakephp 沒有內建存取權限的代碼, 簡單點說, admin_index() 還是可以被一般使用者存取&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;所以, 你可能會用 app_contoller.php 內的 beforeFilter():&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;
&lt;pre class="brush: php;"&gt;
//check admin routing
if ( substr($this-&gt;action,0,5)=='admin' ) {
  if ($this-&gt;Auth-&gt;user('role')!="admin") {
    $this-&gt;redirect("/");
  }else{
    $this-&gt;layout = "admin";
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;那你的 user table 便需要一個 role 的欄位(varchar) 放 ‘admin’ 等等&lt;/div&gt;
&lt;div style="margin-top:12px;margin-bottom:0;"&gt;但到最後, 我發覺使用admin methods 本身有很多限制&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;例如admin methods 和一般methods 是使用同一個model, 同一個validation, 同一個model hooks&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;所以, 後來還是使用了另一個方法做 admin site.&lt;/div&gt;
&lt;p&gt;但admin method 介紹了 routing 的功能, 等一下再詳談 routing.&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/35/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/35/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/35/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/35/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/35/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/35/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/35/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/35/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/35/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/35/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host%3Dmooncakephp.wordpress.com%26blog%3D9765193%26post%3D35%26subd%3Dmooncakephp%26ref%3D%26feed%3D1" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/SlR4Ggvw24I" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Thu, 15 Oct 2009 14:45:47 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3553 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP – formHelper:checkbox &amp; Model:BeforeValidate()</title>
 <link>http://mooncakephp.wordpress.com/2009/10/13/cakephp-formhelpercheckbox-modelbeforevalidate/</link>
 <description>&lt;div class='snap_preview'&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;
&lt;div id="attachment_26" class="wp-caption alignnone" style="width: 510px"&gt;&lt;img class="size-full wp-image-26" title="checkbox" src="http://mooncakephp.files.wordpress.com/2009/10/checkbox.png?w=500&amp;amp;h=263" alt="checkbox" width="500" height="263" /&gt;&lt;br /&gt;
&lt;p class="wp-caption-text"&gt;checkbox&lt;/p&gt;
&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;Checkboxes 是一組表單組成的, 功能主要是提供一個使用者可多選的項目&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;用法和 multiple select dropdown 是一樣的&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;使用那一種表單元素主要是外觀設計的考量&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;在cakephp 之內, 使用 checkboxes 的code:&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$form-&gt;input('Model.field', array( 'type' =&gt; 'select', 'multiple' =&gt; 'checkbox' ,'option' =&gt; array('1'=&gt;'1','2'=&gt;'2','4'=&gt;'3','8'=&gt;'4') ));&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;從以上的例子可以看到, checkboxes 其實是 select 元素&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;第二個參數的 ‘option’ 是一個數組, 使用 array(‘值’,'名稱’) 的組合&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;例子中的值和名稱組合會在下面再詳細解釋&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;表單提交的數值實際上是一個數組 (可以在controller/views 用debug() 可以看到提交到後台的數組)&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;但數據庫中卻多數只使用一個欄位儲存 (而且多數是使用int 類)&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;所以便需要先處理, 再放到數據庫&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;因為 checkbox 的數值都需要經過 validate&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;所以需要在 validate 之前先整理 checkbox 的數值&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;在這個例子中, 數據庫使用一個 int(11) 來儲存一組checkbox 的數值&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;所以便使用 二進位 數值的表示式&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;例如, 4 個checkbox 為一組, 它們的數值分別為 2 的倍級, pow(2,0), pow(2,1), pow(2,2), pow(2,3)&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;所以4個checkbox 的數值分別為 1,2,4,8&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;如果使用者提交了 第一個和最後一個checkbox, 儲存的數值是: 1+8=9&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;使用一個 for 迴圈便可以了&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;function beforeValidate() {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;foreach ($this-&gt;data['User']['question3'] as $k =&gt; $v ) {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$question3 += $v;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;注意的是應該只有完成了整個mapping 的程序才 返回 true 或 false&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;要停止儲存, 返回 false&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;要繼續儲存, 返回 true&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;取回它們的數值則較為複雜:&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$num = 9; //value from DB&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$q = 4; //number answers&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$question3= array();&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;for ( $i=1 ; $i&amp;lt;=$q ; $i++ ) {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;if ( $num &amp; pow(2,($i-1)) ) {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$question3[] = pow(2,($i-1));&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;這個例子示範了 beforeValidate() 和 checkboxes 的組合方法, 但 beforevalidate 其實還有很多很重要的用法&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;有機會的話再深入研究&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;@cakephp 1.2.3.8166&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;BeforeValidate() and checkboxes&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;Checkboxes is a group of form element that users can select multiple values.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;It’s usage is the same as a multiple select downdown, so site owners can use one of them which fits its implementation&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;Within cakephp, the statement that generate checkboxes is:&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;span style="font-family:courier;color:#cc3300;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="margin-right:0;margin-left:0;color:#4444cc;"&gt;$form&lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;-&gt;&lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#4444cc;"&gt;input&lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;(&lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;'Model.field'&lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;, array( &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;'type' &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;=&gt; &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;'select'&lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;, &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;'multiple' &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;=&gt; &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;'checkbox' ,'option' =&gt; array('1'=&gt;'1','2'=&gt;'2','4'=&gt;'3'&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;,'8'=&gt;'4'&lt;span style="margin-right:0;margin-left:0;color:#cc3300;"&gt;) &lt;/span&gt;&lt;span style="margin-right:0;margin-left:0;color:#337733;"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;which is a select element.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;the option array is array(‘value’,'label’)&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;i will explain the meaning of numbers there in a few rows below&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;The value that being submitted after pressing submit is an array.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;so developers probably want to treak the array before store that into DB.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;we can use beforeValidate() callback here.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;function beforeValidate() {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;//code here&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;As there may be some validation rules on those checkboxes, we have to handle the values before it actually validates.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;In my case, I use a int(11) field to store it, using binary represenation.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;Example, there are 4 checboxes in the group, they will be assigned as value 1, 2, 4, 8, which is the power of 2.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;So if the user submit with first and last option checked, the value to store is 1+8=9. just a for loop will to the track&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;function beforeValidate() {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;foreach ($this-&gt;data['User']['question3'] as $k =&gt; $v ) {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$question3 += $v;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;please note that do not return unless you think the validation can exit (only when validation finished or validation is halt)&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;return false to stop save,&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;return true to continue&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;Retieve them is a little bit tricky, we have to use bit operations&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;
&lt;pre class="brush: php;"&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$num = 9; //value from DB&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$q = 4; //number answers&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$question3= array();&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;for ( $i=1 ; $i&amp;lt;=$q ; $i++ ) {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;if ( $num &amp; pow(2,($i-1)) ) {&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;$question3[] = pow(2,($i-1));&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;}&lt;/div&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 1826px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;This example demo the combination of beforeValidate() and checkboxes, but beforeValidate() actually have more important use. Let’s discuss it later.&lt;/div&gt;
&lt;div id="_mcePaste" style="position:absolute;left:-10000px;top:1826px;width:1px;height:1px;"&gt;@cakephp 1.2.3.8166&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;Checkboxes 是一組表單組成的, 功能主要是提供一個使用者可多選的項目&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;用法和 multiple select dropdown 是一樣的&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;使用那一種表單元素主要是外觀設計的考量&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;在cakephp 之內, 使用 checkboxes 的code:&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;
&lt;pre class="brush: php;"&gt;
$form-&gt;input('Model.field',
  array( 
    'type' =&gt; 'select', 
    'multiple' =&gt; 'checkbox' ,
    'option' =&gt; array('1'=&gt;'1','2'=&gt;'2','4'=&gt;'3','8'=&gt;'4')
   )
);
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;從以上的例子可以看到, checkboxes 其實是 select 元素&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;第二個參數的 ‘option’ 是一個數組, 使用 array(‘值’,'名稱’) 的組合&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;例子中的值和名稱組合會在下面再詳細解釋&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;表單提交的數值實際上是一個數組 (可以在controller/views 用debug() 可以看到提交到後台的數組)&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;但數據庫中卻多數只使用一個欄位儲存 (而且多數是使用int 類)&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;所以便需要先處理, 再放到數據庫&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;因為 checkbox 的數值都需要經過 validate&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;所以需要在 validate 之前先整理 checkbox 的數值&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;在這個例子中, 數據庫使用一個 int(11) 來儲存一組checkbox 的數值&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;所以便使用 二進位 數值的表示式&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;例如, 4 個checkbox 為一組, 它們的數值分別為 2 的倍級, pow(2,0), pow(2,1), pow(2,2), pow(2,3)&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;所以4個checkbox 的數值分別為 1,2,4,8&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;如果使用者提交了 第一個和最後一個checkbox, 儲存的數值是: 1+8=9&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;使用一個 for 迴圈便可以了&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;
&lt;pre class="brush: php;"&gt;
function beforeValidate() {
  foreach ($this-&gt;data['User']['question3'] as $k =&gt; $v ) {
    $question3 += $v;
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;注意的是應該只有完成了整個mapping 的程序才 返回 true 或 false&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;要停止儲存, 返回 false&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;要繼續儲存, 返回 true&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;取回它們的數值則較為複雜:&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;
&lt;pre class="brush: php;"&gt;
$num = 9; //value from DB
$q = 4; //number answers

$question3= array();
for ( $i=1 ; $i&amp;lt;=$q ; $i++ ) {
  if ( $num &amp; pow(2,($i-1)) ) {
    $question3[] = pow(2,($i-1));
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;這個例子示範了 beforeValidate() 和 checkboxes 的組合方法, 但 beforevalidate 其實還有很多很重要的用法&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;有機會的話再深入研究&lt;/div&gt;
&lt;div style="margin-top:0;margin-bottom:0;"&gt;@cakephp 1.2.3.8166&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/25/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/25/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/25/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/25/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/25/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/25/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/25/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/25/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/25/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/25/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mooncakephp.wordpress.com&amp;amp;blog=9765193&amp;amp;post=25&amp;amp;subd=mooncakephp&amp;amp;ref=&amp;amp;feed=1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/JRGY75nE1f8" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 13 Oct 2009 16:25:58 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3554 at http://planetcakephp.org</guid>
</item>
<item>
 <title>關於 bake..</title>
 <link>http://mooncakephp.wordpress.com/2009/10/06/%E9%97%9C%E6%96%BC-bake/</link>
 <description>&lt;div class='snap_preview'&gt;
&lt;div id="attachment_23" class="wp-caption alignnone" style="width: 505px"&gt;&lt;img class="size-full wp-image-23" title="console" src="http://mooncakephp.files.wordpress.com/2009/10/console.png?w=495&amp;amp;h=225" alt="Console" width="495" height="225" /&gt;&lt;br /&gt;
&lt;p class="wp-caption-text"&gt;Console&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;bake 就是令我覺得 cakePHP 比 其他 framework 好和快(指開發速度) 最重要的一環&lt;/p&gt;
&lt;p&gt;其實它的功能就是建立各種各樣的模版&lt;br /&gt;
最常用就是建立 controller, model, views 的模版&lt;br /&gt;
先在database 建立一個眾數為名字的 table, 例如 administrator&lt;span style="color:#ff0000;"&gt;s&lt;br /&gt;
&lt;span style="color:#000000;"&gt;建立好你想要的 fields 之後,&lt;br /&gt;
只需要 bake 一下, administrator 的 model, controller, views (add index, view, delete) 都幫你寫好了&lt;br /&gt;
其實根本不需要記得其他的 convention, 只需要記得 database table 用眾數便可以了&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;但 bake 還有很多 “模版” 的功能&lt;br /&gt;
例如開一個新的app, 可以用 bake 內的 project 建立 controller, model, webroot 等等的folder, 立即可以使用&lt;br /&gt;
又或者建立 database connection, 都要需要自己將 database.php.default 改成 database.php&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;除了基本的幾個選項之外&lt;br /&gt;
console 還提供幾個很有用的 database 模版&lt;br /&gt;
例如 i18n, ACL 的 table 等等&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;p.s. 在windows 的開發環境之下&lt;br /&gt;
你可能要將 php.exe 加到你的系統路徑以正確的執行 bake&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;ref: &lt;a href="http://book.cakephp.org/view/113/Code-Generation-with-Bake"&gt;http://book.cakephp.org/view/113/Code-Generation-with-Bake&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/22/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/22/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/22/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/22/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/22/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/22/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/22/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/22/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/22/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/22/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mooncakephp.wordpress.com&amp;amp;blog=9765193&amp;amp;post=22&amp;amp;subd=mooncakephp&amp;amp;ref=&amp;amp;feed=1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/XcOQvJ3HMs8" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Tue, 06 Oct 2009 09:07:15 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3555 at http://planetcakephp.org</guid>
</item>
<item>
 <title>一個cakePHP 核心內設定多個應用 Config multiple sites in one CakePHP core</title>
 <link>http://mooncakephp.wordpress.com/2009/10/05/%E4%B8%80%E5%80%8Bcakephp-%E6%A0%B8%E5%BF%83%E5%85%A7%E8%A8%AD%E5%AE%9A%E5%A4%9A%E5%80%8B%E6%87%89%E7%94%A8-config-multiple-sites-in-one-cakephp-core/</link>
 <description>&lt;div class='snap_preview'&gt;
&lt;div id="attachment_18" class="wp-caption alignnone" style="width: 383px"&gt;&lt;img class="size-full wp-image-18" title="tree-structure" src="http://mooncakephp.files.wordpress.com/2009/10/tree-structure.png?w=373&amp;amp;h=210" alt="tree" width="373" height="210" /&gt;&lt;br /&gt;
&lt;p class="wp-caption-text"&gt;tree&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;上一張圖解釋了大部分連官方 cookbook 都很少提及旳設定&lt;br /&gt;
只要在 app 資料夾的同層建立一個新的資料夾, 再用 bake 在資料夾之內建立project&lt;/p&gt;
&lt;p&gt;假設cake 資料夾放在webroot 之下, mooncake 的存取路徑是: &lt;a href="http://localhost/cake/mooncake" title="http://localhost/cake/mooncake"&gt;http://localhost/cake/mooncake&lt;/a&gt;&lt;br /&gt;
而 &lt;a href="http://localhost/cake" title="http://localhost/cake"&gt;http://localhost/cake&lt;/a&gt; 預設是 app 資料夾內的檔案&lt;/p&gt;
&lt;p&gt;而我通常會再做多一步, 在 apache 的vhosts 內將 &lt;a href="http://mooncake.localhost/" title="http://mooncake.localhost/"&gt;http://mooncake.localhost/&lt;/a&gt; 的 DocumentRoot 指到 WEBROOT/cake/mooncake/webroot&lt;br /&gt;
再改windows 的 host file, 以方便開發&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/17/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/17/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/17/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/17/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/17/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/17/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/17/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/17/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/17/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/17/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mooncakephp.wordpress.com&amp;amp;blog=9765193&amp;amp;post=17&amp;amp;subd=mooncakephp&amp;amp;ref=&amp;amp;feed=1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/yJ7tJD5YGOs" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Mon, 05 Oct 2009 13:17:12 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3556 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Why CakePHP</title>
 <link>http://mooncakephp.wordpress.com/2009/10/03/why-cakephp/</link>
 <description>&lt;div class='snap_preview'&gt;
&lt;div id="attachment_20" class="wp-caption alignnone" style="width: 190px"&gt;&lt;img class="size-full wp-image-20" title="cakephp-logo" src="http://mooncakephp.files.wordpress.com/2009/10/cakephp-logo.png?w=180&amp;amp;h=180" alt="CakePHP" width="180" height="180" /&gt;&lt;br /&gt;
&lt;p class="wp-caption-text"&gt;CakePHP&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;我在使用 CakePHP 之前已經有3-4 年的 PHP 經驗了&lt;/p&gt;
&lt;p&gt;近年因為 frameworks 的興起, 我也在找尋一些可以配合快速開發的 PHP框架&lt;br /&gt;
以加速我的開發周期&lt;/p&gt;
&lt;p&gt;其實只要 google 一下 PHP framework, 便有很多成熟的 framework 可以選擇&lt;br /&gt;
Zend, CodeIgniter, symfony… 而CakePHP 只是在第一頁的最尾&lt;br /&gt;
但我覺得 CakePHP是最開發快速的框架因為:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有bake (非常重要!!!)&lt;/li&gt;
&lt;li&gt;有 scaffolding&lt;/li&gt;
&lt;li&gt;用 MVC model&lt;/li&gt;
&lt;li&gt;build in test framework&lt;/li&gt;
&lt;li&gt;rails like controller hook (雖然我沒有 rails 的經驗)&lt;/li&gt;
&lt;li&gt;功能上比較完備 (當然沒有到 Zend 的程度..)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺點:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相對慢的 framework (scalability 差一點點)&lt;/li&gt;
&lt;li&gt;docs 相對少 (算還可以吧…)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因為我覺得 bake 實在太重要&lt;br /&gt;
完全 override 它的缺點, 所以便一直使用到現在了…&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/15/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/15/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/15/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/15/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/15/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/15/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/15/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/15/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/15/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/15/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mooncakephp.wordpress.com&amp;amp;blog=9765193&amp;amp;post=15&amp;amp;subd=mooncakephp&amp;amp;ref=&amp;amp;feed=1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/q8HupP0a1xY" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sat, 03 Oct 2009 11:07:00 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3557 at http://planetcakephp.org</guid>
</item>
<item>
 <title>My first post on Cakephp</title>
 <link>http://mooncakephp.wordpress.com/2009/10/03/my-first-post-on-cakephp/</link>
 <description>&lt;div class='snap_preview'&gt;
&lt;p&gt;testing, testing&lt;/p&gt;
&lt;p&gt;這會是我在使用 CakePHP 開發 web app 的時候的一些小留言, 既給自己留個底,  也希望會幫助到其他人, 回饋 CakePHP 社區.&lt;/p&gt;
&lt;p&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mooncakephp.wordpress.com/3/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mooncakephp.wordpress.com/3/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mooncakephp.wordpress.com/3/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mooncakephp.wordpress.com/3/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mooncakephp.wordpress.com/3/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mooncakephp.wordpress.com/3/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mooncakephp.wordpress.com/3/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mooncakephp.wordpress.com/3/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mooncakephp.wordpress.com/3/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mooncakephp.wordpress.com/3/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mooncakephp.wordpress.com&amp;amp;blog=9765193&amp;amp;post=3&amp;amp;subd=mooncakephp&amp;amp;ref=&amp;amp;feed=1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/8eKlTF20-3Y" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sat, 03 Oct 2009 10:35:16 +0000</pubDate>
 <dc:creator>My findings on CakePHP</dc:creator>
 <guid isPermaLink="false">3558 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Cakephp Schema命令</title>
 <link>http://www.thinkly.cn/index.php/archives/376</link>
 <description>&lt;pre class="brush: csharp;"&gt;cake schema run create &lt;schema_name&gt; &lt;table_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;/pre&gt;&lt;p&gt;独立创建一个在schema文件中存在的表&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;pre class="brush: bash;"&gt;cake schema run update &lt;schema_name&gt; &lt;table_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;/pre&gt;&lt;p&gt;独立更新一个在schema文件中定义的表&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;pre class="brush: bash;"&gt;cake schema view&lt;/pre&gt;&lt;p&gt;查看schema文件的内容&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;pre class="brush: bash;"&gt;cake schema generate &amp;lt;-f&gt;&lt;/pre&gt;&lt;p&gt;生成schema文件，-f 选项可以强制生成整个数据库表结构&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;pre class="brush: bash;"&gt;cake schema dump &lt;file_name&gt;&lt;/file_name&gt;&lt;/pre&gt;&lt;p&gt;将schema文件转储为sql文件&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/poo0ZW6vEVw" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sat, 26 Sep 2009 05:49:15 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">3221 at http://planetcakephp.org</guid>
</item>
<item>
 <title>在关系数据库中存储层次结构 – 无限分类的原理</title>
 <link>http://www.thinkly.cn/index.php/archives/354</link>
 <description>&lt;p&gt;引用&lt;/p&gt;
&lt;p&gt;&lt;a title="http://qeephp.com/bbs/viewthread.php?tid=25" href="http://qeephp.com/bbs/viewthread.php?tid%3D25"&gt;http://qeephp.com/bbs/viewthread.php?tid=25&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本文通过一个实例讲述如何使用关系数据库来存储层次数据，&lt;/p&gt;
&lt;p&gt;提供关系数据库存储结构分析图和相应的文档说明。&lt;/p&gt;
&lt;p&gt; &lt;span id="more-354"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;相关资源部分，提供本文的PDF文档下载。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/09/214f02eda16a.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="存储层次结构" border="0" alt="存储层次结构" src="http://www.thinkly.cn/wp-content/uploads/2009/09/thumb.png" width="641" height="6993" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;相关资源&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/download/docs/Storing+Hierarchical+Data+in+a+Database+(CHS).pdf" target="_blank"&gt;数据库中存储层次数据（PDF）&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/2do0MyEVEzY" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Fri, 11 Sep 2009 03:35:09 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">3089 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Cakephp的魔法函数解析,findBy…</title>
 <link>http://www.thinkly.cn/index.php/archives/341</link>
 <description>&lt;p&gt;Cakephp的一个非常有意思的特色，就是，可以通过它的Model使用类似于findBy（Fields）这样的方法直接取得数据的调用，例如，我们可以直接取得ID为5的数据，可以这样：&lt;/p&gt;
&lt;pre class="brush: php; toolbar: false;"&gt;/**
在Controller中，我们可以这样写
*/
$data = $this-&gt;ModelName-&gt;findById(5);
pr($data);&lt;/pre&gt;&lt;p&gt;就这么简单，但是，你会发现Model里面根本没有findById这个函数。：）&lt;/p&gt;
&lt;p&gt;&lt;span id="more-341"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;我翻遍了Cakephp的源代码，都没有找到相关的设置，呵呵。&lt;/p&gt;
&lt;p&gt;yoophi老师说，它使用了overload，overload是php提供的非常有魅力的功能，它可以使类执行一些自己根本没有定义的功能。&lt;/p&gt;
&lt;p&gt;在PHP5中，我们可以这样使用它&lt;/p&gt;
&lt;pre class="brush: php;"&gt;&amp;lt;?php
class OverLoadable{
	var $config;

	function __construct(){
		$this-&gt;config['val'] = array(
			'one' =&gt; '1',
			'two' =&gt; '2',
		);
	}

	function __call($method, $params){
		echo 'you called function name is: '.$method.'&lt;br /&gt;';
		echo 'you called the params is:';
		echo '&lt;pre&gt;';
		print_r($params);
		echo '&lt;/pre&gt;&lt;p&gt;';&lt;br /&gt;
	}&lt;/p&gt;
&lt;p&gt;	function __get($name){&lt;br /&gt;
		return $this-&gt;config[$name];&lt;br /&gt;
	}&lt;/p&gt;
&lt;p&gt;	function __set($name,$value){&lt;br /&gt;
		$this-&gt;config[$name] = $value;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;$oo = new OverLoadable();&lt;br /&gt;
$oo-&gt;testFunction('test',array(1,2,3));&lt;br /&gt;
$oo-&gt;theOthersSomeFunction('where','when','who','what');&lt;br /&gt;
$oo-&gt;val = 123;&lt;br /&gt;
echo $oo-&gt;val;&lt;br /&gt;
?&gt;&lt;/p&gt;
&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;overload包含三个魅力函数__call(),__get(),__set()分别是调用函数、获取属性、设置属性的回调函数，如果你在类中声明了这三个函数，那么，你对于这个类所有的函数调用、获取属性或者设置类属性，都会被相应的函数管理。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHP4的代码稍稍有些不同，PHP4需要额外执行一个overload函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre class="brush: php;"&gt;&amp;lt;?
class Foo {
   // The properties array
   var $array = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 4);

   // Getter
   function __get($n, $val = "") {
       if (phpversion() &gt;= 5) {
           return $this-&gt;array[$n];
       } else {
           $val = $this-&gt;array[$n];
           return true;
       }
   }

   // Setter
   function __set($n, $val) {
       $this-&gt;array[$n] = $val;
       if (phpversion() &amp;lt; 5) return true;
   }

   // Caller, applied when $function isn't defined
   function __call($function, $arguments) {
       // Constructor called in PHP version &amp;lt; 5
       if ($function != __CLASS__) {
           $this-&gt;$arguments[0] = $arguments[1];
       }
       if (phpversion() &amp;lt; 5) return true;
   }
}

// Call the overload() function when appropriate
if (function_exists("overload") &amp;&amp; phpversion() &amp;lt; 5) {
   overload("Foo");
}

// Create the object instance
$foo = new Foo;

// Adjust the value of $foo-&gt;array['c'] through
// method overloading
$foo-&gt;set_array('c', 3);

// Adjust the value of $foo-&gt;array['c'] through
// property overloading
$foo-&gt;c = 3;

// Print the new correct value of $foo-&gt;array['c']
echo 'The value of $foo-&gt;array["c"] is: ', $foo-&gt;c;

?&gt; &lt;/pre&gt;&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;而Cakephp本身，所有的Model都是继承自Overloadable的类，所以，它所有的Model都具有这个特性！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相关文章&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.phpe.net/manual/ref.overload.php" target="_blank"&gt;什么是PHP的Overload？&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/rvT2rI9ym6w" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Fri, 28 Aug 2009 03:12:42 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">2806 at http://planetcakephp.org</guid>
</item>
<item>
 <title>New Feed: 芋头的领域 » CakePHP</title>
 <link>http://planetcakephp.org/aggregator/sources/2709-%E8%8A%8B%E5%A4%B4%E7%9A%84%E9%A2%86%E5%9F%9F-%C2%BB-cakephp</link>
 <description>&lt;p&gt;欢迎深入狼穴···&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/Zr3d6jwUqBs" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sun, 16 Aug 2009 03:02:23 +0000</pubDate>
 <dc:creator>Derick Ng</dc:creator>
 <guid isPermaLink="false">2709 at http://planetcakephp.org</guid>
</item>
<item>
 <title>New Feed: Thinkly Blog » Cakephp</title>
 <link>http://planetcakephp.org/aggregator/sources/2698-thinkly-blog-%C2%BB-cakephp</link>
 <description>&lt;p&gt;CakePHP - Jack和David的蛋糕！&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/lX3Hc-ytZ-s" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sun, 16 Aug 2009 03:01:15 +0000</pubDate>
 <dc:creator>Derick Ng</dc:creator>
 <guid isPermaLink="false">2698 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Cakephp结合Yaml文件来构建高效网站</title>
 <link>http://www.thinkly.cn/index.php/archives/335</link>
 <description>&lt;p&gt;一点心得顺便记录一下。&lt;/p&gt;
&lt;p&gt;Cakephp本身提供了相当好而且相当简便的缓存和优化技术，通过Element技术可以缓存某个部分的代码，但是有了Yaml文件的帮助，可以说是如虎添翼！&lt;/p&gt;
&lt;p&gt;Yaml文件是一种文本的易读的文件格式。&lt;/p&gt;
&lt;p&gt;我们可以使用Yaml文件为我们的Element提供必要的数据支持，然后，通过我们的后台代码生成需要的Yaml文件，这使得Yaml文件成为了一种临时缓存文件。&lt;/p&gt;
&lt;p&gt;这有几个好处：&lt;/p&gt;
&lt;p&gt;1. 易解析，可以借助&lt;a href="http://pear.horde.org/index.php?package%3DYaml%26downloads" target="_blank"&gt;Pear的Yaml组件&lt;/a&gt;实现从PHP数据到Yaml数据的相互转换&lt;/p&gt;
&lt;p&gt;2. 高效，Yaml适用于实现数据量不是很大，但是需要频繁操作数据库的Element，这使得某些Element操作数据库的几率为0，我们所要做的就是在后台生成它。&lt;/p&gt;
&lt;p&gt;3. 便于修改，Yaml文件的最大优势就是它的易读性，我们甚至可以将网站的配置文件全部放在Yaml文件中，修改简单，我们只需要打开记事本，简单的缩进就完成了，相比XML和其他格式化符号文件，可读性非常好。&lt;/p&gt;
&lt;p&gt;总结一下：&lt;/p&gt;
&lt;p&gt;Yaml非常适合用在频繁操作数据库但是数据量不大的模块单元中，效率将会得到很大的提升。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/UVk_vKdfETQ" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Sat, 08 Aug 2009 16:26:00 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">2699 at http://planetcakephp.org</guid>
</item>
<item>
 <title>New Feed: 余心烦错 » cakephp</title>
 <link>http://planetcakephp.org/aggregator/sources/2593-%E4%BD%99%E5%BF%83%E7%83%A6%E9%94%99-%C2%BB-cakephp</link>
 <description>&lt;p&gt;穷居而野外，升高而望远&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/70AoORvrOyI" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Fri, 07 Aug 2009 14:58:11 +0000</pubDate>
 <dc:creator>Derick Ng</dc:creator>
 <guid isPermaLink="false">2593 at http://planetcakephp.org</guid>
</item>
<item>
 <title>[转载]在Cakephp中使用i18n本地化程序，并使用poedit编辑语言文件</title>
 <link>http://www.tarowolf.cn/?p=227</link>
 <description>&lt;p&gt;&lt;strong&gt;本文来自&lt;span style="color: red;"&gt;苏南的博客&lt;/span&gt;， 网址：&lt;/strong&gt;&lt;a href="http://newsn.net/" target="_blank"&gt;&lt;strong&gt;http://newsn.net&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cakephp的很强大的i18n功能就是用来实现本地化和国际化的。他通过使用语言配置文件使得程序能够很好的适应变化进行本地化。通过新建 locale/chi/LC_MESSAGES/default.po文件，并指定语言选项为“chi”实现。本文中说的就是如何实现这个本地化过程，当然本文中的poedit并不是必须的，但是他可以使得工作效率更高。&lt;/p&gt;
&lt;p&gt; &lt;span id="more-227"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;一、关于i18n和L10n&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
这2个东东其实头一次我看到的时候也是一头雾水，但是经过百度的一通搜索，得出的结论就是，不管是几个n，最终的目的就是实现程序本地化就好了，说白了，就是由很多的语言配置文件，反正我是这么理解的。大家也可以去看看，&lt;a title="http://baike.baidu.com/view/372835.htm" href="http://baike.baidu.com/view/372835.htm" target="_blank"&gt;http://baike.baidu.com/view/372835.htm&lt;/a&gt; 这里有很详细的说明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;二、在Cakephp里面，实现本地化的方法&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
目前为止，有2种配置方法。&lt;br /&gt;
&lt;strong&gt;2.1 方法一&lt;/strong&gt;&lt;br /&gt;
在config/core.php中使用configure::write来制定语言文件。&lt;br /&gt;
Configure::write(’Config.language’,”chi”);&lt;br /&gt;
&lt;strong&gt;2.2 方法二&lt;br /&gt;
&lt;/strong&gt;官方说明：&lt;a title="http://book.cakephp.org/view/162/Localizing-Your-Application" href="http://book.cakephp.org/view/162/Localizing-Your-Application" target="_blank"&gt;http://book.cakephp.org/view/162/Localizing-Your-Application&lt;/a&gt;&lt;br /&gt;
貌似很复杂的说哦。&lt;/p&gt;
&lt;div id="highlighter_738053" class="syntaxhighlighter"&gt;
&lt;div class="bar"&gt;
&lt;div class="toolbar"&gt;&lt;a class="item viewSource" style="width: 16px; height: 16px;" title="view source" href="http://newsn.net/20090525/472.html/comment-page-1#viewSource"&gt;view source&lt;/a&gt;&lt;/div&gt;
&lt;div class="item copyToClipboard"&gt;
&lt;object width="16" height="16" data="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" type="application/x-shockwave-flash"&gt;&lt;param name="id" value="highlighter_738053_clipboard" /&gt;&lt;param name="src" value="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="item printSource" style="width: 16px; height: 16px;" title="print" href="http://newsn.net/20090525/472.html/comment-page-1#printSource"&gt;print&lt;/a&gt;&lt;a class="item about" style="width: 16px; height: 16px;" title="?" href="http://newsn.net/20090525/472.html/comment-page-1#about"&gt;?&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;01.&lt;/code&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px! important;"&gt;&lt;code class="plain"&gt;App::import(&lt;/code&gt;&lt;code class="string"&gt;'Core'&lt;/code&gt;&lt;code class="plain"&gt;, &lt;/code&gt;&lt;code class="string"&gt;'l10n'&lt;/code&gt;&lt;code class="plain"&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt2"&gt;&lt;code class="number"&gt;02.&lt;/code&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px! important;"&gt;&lt;code class="keyword"&gt;class&lt;/code&gt; &lt;code class="plain"&gt;TestsController extends AppController{&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;03.&lt;/code&gt;&lt;span class="content"&gt;&lt;code class="spaces"&gt;  &lt;/code&gt;&lt;span class="block" style="margin-left: 14px! important;"&gt;&lt;code class="plain"&gt;$name=&lt;/code&gt;&lt;code class="string"&gt;"Tests"&lt;/code&gt;&lt;code class="plain"&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt2"&gt;&lt;code class="number"&gt;04.&lt;/code&gt;&lt;span class="content"&gt;&lt;code class="spaces"&gt;  &lt;/code&gt;&lt;span class="block" style="margin-left: 14px! important;"&gt;&lt;code class="plain"&gt;function test_function(){&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;05.&lt;/code&gt;&lt;span class="content"&gt;&lt;code class="spaces"&gt;    &lt;/code&gt;&lt;span class="block" style="margin-left: 28px! important;"&gt;&lt;code class="plain"&gt;$&lt;/code&gt;&lt;code class="keyword"&gt;this&lt;/code&gt;&lt;code class="plain"&gt;-&gt;L10n-&gt;&lt;/code&gt;&lt;code class="keyword"&gt;new&lt;/code&gt; &lt;code class="plain"&gt;L10n();&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt2"&gt;&lt;code class="number"&gt;06.&lt;/code&gt;&lt;span class="content"&gt;&lt;code class="spaces"&gt;    &lt;/code&gt;&lt;span class="block" style="margin-left: 28px! important;"&gt;&lt;code class="plain"&gt;$&lt;/code&gt;&lt;code class="keyword"&gt;this&lt;/code&gt;&lt;code class="plain"&gt;-&gt;L10n-&gt;&lt;/code&gt;&lt;code class="keyword"&gt;get&lt;/code&gt;&lt;code class="plain"&gt;(&lt;/code&gt;&lt;code class="string"&gt;"chi"&lt;/code&gt;&lt;code class="plain"&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;07.&lt;/code&gt;&lt;span class="content"&gt;&lt;code class="spaces"&gt;    &lt;/code&gt;&lt;span class="block" style="margin-left: 28px! important;"&gt;&lt;code class="plain"&gt;.....&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt2"&gt;&lt;code class="number"&gt;08.&lt;/code&gt;&lt;span class="content"&gt;&lt;code class="spaces"&gt;  &lt;/code&gt;&lt;span class="block" style="margin-left: 14px! important;"&gt;&lt;code class="plain"&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;09.&lt;/code&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px! important;"&gt;&lt;code class="plain"&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2.3 做上边设置改动后需要做的：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当然在上面做修改后，还需要修改对应的ctp文件等哦，&lt;/p&gt;
&lt;p&gt;所有的直接输出字符串，没有返回值的地方像这样：&lt;/p&gt;
&lt;div id="highlighter_568376" class="syntaxhighlighter"&gt;
&lt;div class="bar"&gt;
&lt;div class="toolbar"&gt;&lt;a class="item viewSource" style="width: 16px; height: 16px;" title="view source" href="http://newsn.net/20090525/472.html/comment-page-1#viewSource"&gt;view source&lt;/a&gt;&lt;/div&gt;
&lt;div class="item copyToClipboard"&gt;
&lt;object width="16" height="16" data="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" type="application/x-shockwave-flash"&gt;&lt;param name="id" value="highlighter_568376_clipboard" /&gt;&lt;param name="src" value="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="item printSource" style="width: 16px; height: 16px;" title="print" href="http://newsn.net/20090525/472.html/comment-page-1#printSource"&gt;print&lt;/a&gt;&lt;a class="item about" style="width: 16px; height: 16px;" title="?" href="http://newsn.net/20090525/472.html/comment-page-1#about"&gt;?&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;1.&lt;/code&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px! important;"&gt;&lt;code class="plain"&gt;__(&lt;/code&gt;&lt;code class="string"&gt;"english"&lt;/code&gt;&lt;code class="plain"&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;间接输出字符串，有返回的地方：&lt;/p&gt;
&lt;div id="highlighter_873099" class="syntaxhighlighter"&gt;
&lt;div class="bar"&gt;
&lt;div class="toolbar"&gt;&lt;a class="item viewSource" style="width: 16px; height: 16px;" title="view source" href="http://newsn.net/20090525/472.html/comment-page-1#viewSource"&gt;view source&lt;/a&gt;&lt;/div&gt;
&lt;div class="item copyToClipboard"&gt;
&lt;object width="16" height="16" data="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" type="application/x-shockwave-flash"&gt;&lt;param name="id" value="highlighter_873099_clipboard" /&gt;&lt;param name="src" value="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="item printSource" style="width: 16px; height: 16px;" title="print" href="http://newsn.net/20090525/472.html/comment-page-1#printSource"&gt;print&lt;/a&gt;&lt;a class="item about" style="width: 16px; height: 16px;" title="?" href="http://newsn.net/20090525/472.html/comment-page-1#about"&gt;?&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;1.&lt;/code&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px! important;"&gt;&lt;code class="plain"&gt;__(&lt;/code&gt;&lt;code class="string"&gt;"english"&lt;/code&gt;&lt;code class="plain"&gt;,&lt;/code&gt;&lt;code class="keyword"&gt;true&lt;/code&gt;&lt;code class="plain"&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;还有input要加个label来使他出现中文。&lt;/p&gt;
&lt;div id="highlighter_766792" class="syntaxhighlighter"&gt;
&lt;div class="bar"&gt;
&lt;div class="toolbar"&gt;&lt;a class="item viewSource" style="width: 16px; height: 16px;" title="view source" href="http://newsn.net/20090525/472.html/comment-page-1#viewSource"&gt;view source&lt;/a&gt;&lt;/div&gt;
&lt;div class="item copyToClipboard"&gt;
&lt;object width="16" height="16" data="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" type="application/x-shockwave-flash"&gt;&lt;param name="id" value="highlighter_766792_clipboard" /&gt;&lt;param name="src" value="http://newsn.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf" /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="item printSource" style="width: 16px; height: 16px;" title="print" href="http://newsn.net/20090525/472.html/comment-page-1#printSource"&gt;print&lt;/a&gt;&lt;a class="item about" style="width: 16px; height: 16px;" title="?" href="http://newsn.net/20090525/472.html/comment-page-1#about"&gt;?&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;&lt;code class="number"&gt;1.&lt;/code&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px! important;"&gt;&lt;code class="plain"&gt;__(&lt;/code&gt;&lt;code class="string"&gt;"english"&lt;/code&gt;&lt;code class="plain"&gt;);&lt;/code&gt;&lt;code class="functions"&gt;echo&lt;/code&gt; &lt;code class="variable"&gt;$form&lt;/code&gt;&lt;code class="plain"&gt;-&gt;input(&lt;/code&gt;&lt;code class="string"&gt;'name'&lt;/code&gt;&lt;code class="plain"&gt;,&lt;/code&gt;&lt;code class="keyword"&gt;array&lt;/code&gt;&lt;code class="plain"&gt;(&lt;/code&gt;&lt;code class="string"&gt;'label'&lt;/code&gt;&lt;code class="plain"&gt;=&gt;__(&lt;/code&gt;&lt;code class="string"&gt;'name'&lt;/code&gt;&lt;code class="plain"&gt;,true)));&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2.4 最最重要的一步&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就是要编辑这个文件了，locale/chi/LC_MESSAGES/default.po。中间的chi就是语言文件的标志位了。这个文件的格式也很简单，&lt;/p&gt;
&lt;p&gt;msgid “Chinese”&lt;/p&gt;
&lt;p&gt;msgstr “中国话”&lt;/p&gt;
&lt;p&gt;这个的简单重复就行了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;三、使用poedit&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用poedit不是必须的，但是可以使工作变得简单的多。官方网站是：&lt;a title="http://www.poedit.net/" href="http://www.poedit.net/" target="_blank"&gt;http://www.poedit.net/&lt;/a&gt; &lt;br /&gt;
他的主要功用就是使得编辑语言配置文件更加方便和快捷。下面是使用poedit的一些简单的截图和说明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.1 头一次使用需要选择界面语言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-01.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_01" src="http://newsn.net/upload/2009/05/poedit-01-thumb.png" border="0" alt="poedit_01" width="342" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-02.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_02" src="http://newsn.net/upload/2009/05/poedit-02-thumb.png" border="0" alt="poedit_02" width="279" height="130" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-03.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_03" src="http://newsn.net/upload/2009/05/poedit-03-thumb.png" border="0" alt="poedit_03" width="324" height="524" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.2 新建一个配置文件，就是我们的目的文件po文件了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-04.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_04" src="http://newsn.net/upload/2009/05/poedit-04-thumb.png" border="0" alt="poedit_04" width="213" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-05.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_05" src="http://newsn.net/upload/2009/05/poedit-05-thumb.png" border="0" alt="poedit_05" width="304" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;工程信息这里当然要选择好utf8格式了&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-06.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_06" src="http://newsn.net/upload/2009/05/poedit-06-thumb.png" border="0" alt="poedit_06" width="304" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;路径这里的基本路径填写cakephp的目录，当然这里居然没有浏览功能，真是崩溃。&lt;/p&gt;
&lt;p&gt;注意这里要通过下面的新建按钮新建一个名为“.”的路径，这样的话，以后就可以搜索基本路径下面的子目录了。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-07.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_07" src="http://newsn.net/upload/2009/05/poedit-07-thumb.png" border="0" alt="poedit_07" width="304" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键字选项卡里面要填上cakephp的标志性本地化函数“__”。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-08.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_08" src="http://newsn.net/upload/2009/05/poedit-08-thumb.png" border="0" alt="poedit_08" width="263" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;当然上面那些选项卡设置好之后，还可以通过菜单类目=》设置调出来，从新设置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3 点击那个小地球图标或者类目=》自源更新，开始自动扫描该翻译的文字了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-09.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_09" src="http://newsn.net/upload/2009/05/poedit-09-thumb.png" border="0" alt="poedit_09" width="232" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-10.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_10" src="http://newsn.net/upload/2009/05/poedit-10-thumb.png" border="0" alt="poedit_10" width="264" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-11.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_11" src="http://newsn.net/upload/2009/05/poedit-11-thumb.png" border="0" alt="poedit_11" width="255" height="123" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.4 但是这个时候，你可能会发现扫描出来的字段远远少于你需要的东东，原来这个软件不认识ctp文件。这个步骤的设置是让他能识别ctp文件设置。文件=》首选=》解析器。 &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本步骤参考了一个意大利程序员的博客文章，在此向他表示感谢先。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.luizz.it/119/cakephp/poedit-e-i-file-ctp" href="http://www.luizz.it/119/cakephp/poedit-e-i-file-ctp" target="_blank"&gt;http://www.luizz.it/119/cakephp/poedit-e-i-file-ctp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-12.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_12" src="http://newsn.net/upload/2009/05/poedit-12-thumb.png" border="0" alt="poedit_12" width="212" height="257" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-13.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_13" src="http://newsn.net/upload/2009/05/poedit-13-thumb.png" border="0" alt="poedit_13" width="324" height="192" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选中php，选择编辑，然后在第2行内输入ctp文件后缀，如下图，但是注意下图的设置是错误的!虽然上面的提示，是用逗号分隔，但是实践证明，用分号才是正确的选择。这个很令人崩溃，大概是poedit的一个小bug吧。会出现错误提示。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-14.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_14" src="http://newsn.net/upload/2009/05/poedit-14-thumb.png" border="0" alt="poedit_14" width="298" height="560" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-145.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_14.5" src="http://newsn.net/upload/2009/05/poedit-145-thumb.png" border="0" alt="poedit_14.5" width="472" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是如果用分号分隔的话，仍然会看到如下错误提示。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-15.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_15" src="http://newsn.net/upload/2009/05/poedit-15-thumb.png" border="0" alt="poedit_15" width="609" height="108" /&gt;&lt;/a&gt;  需要在下面的解析器命令下面增加个选项 –language=php，注意这里是两个中划线啊。所以这个步骤的要点就是下图所示了。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-16.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_16" src="http://newsn.net/upload/2009/05/poedit-16-thumb.png" border="0" alt="poedit_16" width="298" height="560" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.5 这里通过那个地球图标就可以找出所有需要翻译的字段了，当然这个操作的前提是你已经用__函数把所有的字段都标示好了。如果你按这个图标之前进行了部分翻译，这个操作如果发现了新字句，这个软件会根据以前的翻译自己翻译字句的，并用棕色突出显示它自动翻译的词语。当然，一般都是不准确的。所以还是需要进行修改保存操作的说。 &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-17.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_17" src="http://newsn.net/upload/2009/05/poedit-17-thumb.png" border="0" alt="poedit_17" width="258" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.6 如果这个时候你查看生成的po文件的时候，比自己手写的文件确实多些设置。&lt;/strong&gt;&lt;a href="http://newsn.net/upload/2009/05/poedit-18.png" target="_blank"&gt;&lt;img style="display: inline; border-width: 0px;" title="poedit_18" src="http://newsn.net/upload/2009/05/poedit-18-thumb.png" border="0" alt="poedit_18" width="202" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/uSW0o4z-FUQ" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Fri, 07 Aug 2009 07:30:57 +0000</pubDate>
 <dc:creator>芋头的领域 » CakePHP</dc:creator>
 <guid isPermaLink="false">2710 at http://planetcakephp.org</guid>
</item>
<item>
 <title>cakephp controller中设置viewVars时的陷阱</title>
 <link>http://blog.efrees.com/cakephp-set-data-for-view-trap.html</link>
 <description>&lt;p&gt;要从controller传递变量到view,需要使用set method。基本的用法是&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set('categories',$categories);&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
更顺手的写法是&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set(&lt;a href="http://www.php.net/compact"&gt;compact&lt;/a&gt;('categories'));&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
多个变量时可以这样写&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set('categories',$categories);&lt;br /&gt;
$this-&amp;gt;set('category',$category);&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
也可以这样写&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set(&lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('category','categories'),&lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;($category,$categories));&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
更顺手的写法是&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set(&lt;a href="http://www.php.net/compact"&gt;compact&lt;/a&gt;('category','categories'));&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
因为set会检查输入的参数来做不同的应对:&lt;/p&gt;
&lt;p&gt;function set($one, $two = null) {&lt;br /&gt;
   $data = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;();&lt;/p&gt;
&lt;p&gt;   if (&lt;a href="http://www.php.net/is_array"&gt;is_array&lt;/a&gt;($one)) {&lt;br /&gt;
      if (&lt;a href="http://www.php.net/is_array"&gt;is_array&lt;/a&gt;($two)) {&lt;br /&gt;
         $data = array_combine($one, $two);&lt;br /&gt;
      } else {&lt;br /&gt;
         $data = $one;&lt;br /&gt;
      }&lt;br /&gt;
   } else {&lt;br /&gt;
      $data = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;($one =&amp;gt; $two);&lt;br /&gt;
   }&lt;/p&gt;
&lt;p&gt;   foreach ($data as $name =&amp;gt; $value) {&lt;br /&gt;
      if ($name === 'title') {&lt;br /&gt;
         $this-&amp;gt;pageTitle = $value;&lt;br /&gt;
      } else {&lt;br /&gt;
         if ($two === null &amp;amp;&amp;amp; &lt;a href="http://www.php.net/is_array"&gt;is_array&lt;/a&gt;($one)) {&lt;br /&gt;
            $this-&amp;gt;viewVars[Inflector::variable($name)] = $value;&lt;br /&gt;
         } else {&lt;br /&gt;
            $this-&amp;gt;viewVars[$name] = $value;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
我不用framework时也会在写一个类似的method来实现这种灵活的变量传递。但需要注意的是cakephp中有这个步骤&lt;/p&gt;
&lt;p&gt;if ($two === null &amp;amp;&amp;amp; &lt;a href="http://www.php.net/is_array"&gt;is_array&lt;/a&gt;($one)) {&lt;br /&gt;
   $this-&amp;gt;viewVars[Inflector::variable($name)] = $value;&lt;br /&gt;
｝&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
陷阱就在这里。当我们使用compact来给set传递一个array参数时，将被设置的变量名会被作一些额外的处理。&lt;br /&gt;
set(compact(‘category’))是完全没问题的，在view中可以得到$category。但如果set(compact(‘category_id’))，在view中得到的变量叫做$categoryId,而非$category_id。&lt;br /&gt;
如果我们要在view中得到的变量名为$category_id,就只能老老实实的写&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set('category_id',$category_id);&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Related posts:
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://blog.efrees.com/cakephp-tutorial-no-1-categories-acts-as-tree.html" rel="bookmark" title=" Categories Acts as Tree"&gt;CakePHP 实例教程: Categories Acts as Tree&lt;/a&gt; Tree是CakePHP 1.2的核心Behaviors之一，可以用来轻易的实现无限极分类，并呈现树状列表。 图片来源:Tree traversa,WIKIPEDIA 基础实例 建立数据表 CREATE TABLE `categories` (...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.efrees.com/alpha-s-categories-widget-for-wordpress.html" rel="bookmark" title=" Alpha’s Categories Widget for wordpress"&gt;Alpha’s Categories Widget for wordpress&lt;/a&gt; 近来用WordPress做一个小站，需要象Joomla一样能按Section展示多组分类。下了一个Breukie’s Categories Widget插件达成了这一功能。但当我随后升级到WordPress 2.8的时候，这个插件却不能完好的支持。看了一下源码，原来WordPress 2.8变更了Widgets的实现方法。于是只好自己动手，写了这个增强的Categories Widget插件：Alpha’s Categories Widget。 利用Alpha’s Categories...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.efrees.com/archives/joomla-jpromoter-and-jreviews-hack" rel="bookmark" title=" Joomla JPromoter and JReviews Hack"&gt;Joomla JPromoter and JReviews Hack&lt;/a&gt; “JPromoter”:joomlaequipment.com/content/view/4/19/ 是一个Joomla的SEF entention，用于把形如 @/index.php?option=com_content&amp;amp;task=view&amp;amp;id=9&amp;amp;Itemid=75@ 这样的地址转换成 @/the-news/latest-news/curabitur-convallis-laoreet.html@ 。 就像wordpress旧时的一些版本一样，这种转换不支持中文。需要自己做一些修改。 h3. 安装JPromoter...&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/UHSynBAqndQ" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Mon, 27 Jul 2009 05:38:32 +0000</pubDate>
 <dc:creator>余心烦错 » cakephp</dc:creator>
 <guid isPermaLink="false">2594 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP 实例教程: Categories Acts as Tree</title>
 <link>http://blog.efrees.com/cakephp-tutorial-no-1-categories-acts-as-tree.html</link>
 <description>&lt;p&gt;Tree是CakePHP 1.2的核心Behaviors之一，可以用来轻易的实现无限极分类，并呈现树状列表。&lt;/p&gt;
&lt;p&gt;图片来源:&lt;a id="hvfz" title="Tree traversa" href="http://en.wikipedia.org/wiki/Tree_traversal" target="_blank"&gt;Tree traversa&lt;/a&gt;,WIKIPEDIA&lt;/p&gt;
&lt;p&gt;基础实例&lt;br /&gt;
建立数据表&lt;/p&gt;
&lt;p&gt;CREATE TABLE `categories` (&lt;br /&gt;
  `id` INT(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` VARCHAR(255) NOT NULL,&lt;br /&gt;
  `slug` VARCHAR(255) NOT NULL,&lt;br /&gt;
  `parent_id` INT(11) DEFAULT NULL,&lt;br /&gt;
  `lft` INT(11) DEFAULT NULL,&lt;br /&gt;
  `rght` INT(11) DEFAULT NULL,&lt;br /&gt;
  `link_count` INT(11) NOT NULL DEFAULT '0',&lt;br /&gt;
  PRIMARY KEY  (`id`)&lt;br /&gt;
)  DEFAULT CHARSET=utf8;&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
&lt;strong&gt;字段说明&lt;/strong&gt;：parent_id,lft,rght均为必要字段，parent_id是很常用的表层级关系的做法。但在这里,lft和rght才是重点。它们表示的是一个分类的左右边界。原理如下图所示&lt;/p&gt;
&lt;p&gt;图片来源:&lt;a id="hkhy" title="Managing Hierarchical Data in MySQL" href="http://dev.mysql.com/tech-resources/articles/hierarchical-data.html" target="_blank"&gt;Managing Hierarchical Data in MySQL&lt;/a&gt;,dev.mysql.com&lt;br /&gt;
建立Model&lt;br /&gt;
使用bake shell&lt;/p&gt;
&lt;p&gt;$ cd app&lt;br /&gt;
$ cake bake&lt;br /&gt;
 &lt;br /&gt;
Category Model：&lt;/p&gt;
&lt;p&gt;class Category extends AppModel {&lt;br /&gt;
    var $name = 'Category';&lt;br /&gt;
    var $actsAs = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('Tree');&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
Categories Controller：&lt;/p&gt;
&lt;p&gt;class CategoriesController extends AppController {&lt;br /&gt;
    var $name = 'Categories';&lt;br /&gt;
｝&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
Add Action&lt;/p&gt;
&lt;p&gt;function add() {&lt;br /&gt;
        if (!&lt;a href="http://www.php.net/empty"&gt;empty&lt;/a&gt;($this-&amp;gt;data)) {&lt;br /&gt;
            $this-&amp;gt;Category-&amp;gt;create();&lt;br /&gt;
            if ($this-&amp;gt;Category-&amp;gt;save($this-&amp;gt;data)) {&lt;br /&gt;
                $this-&amp;gt;Session-&amp;gt;setFlash(__('The Category has been saved', true));&lt;br /&gt;
                $this-&amp;gt;redirect(&lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('action'=&amp;gt;'index'));&lt;br /&gt;
            } else {&lt;br /&gt;
                $this-&amp;gt;Session-&amp;gt;setFlash(__('The Category could not be saved. Please, try again.', true));&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        $this-&amp;gt;set('categories', $this-&amp;gt;Category-&amp;gt;generatetreelist(null, null, null, '-- '));&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
add.ctp&lt;/p&gt;
&lt;p&gt;&amp;lt;?php &lt;a href="http://www.php.net/echo"&gt;echo&lt;/a&gt; $form-&amp;gt;create('Category');?&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
         &amp;lt;?php __('Add Category');?&amp;gt;&lt;br /&gt;
    &amp;lt;?php &lt;a href="http://www.php.net/echo"&gt;echo&lt;/a&gt; $form-&amp;gt;input('name');?&amp;gt;&lt;br /&gt;
    &amp;lt;?php &lt;a href="http://www.php.net/echo"&gt;echo&lt;/a&gt; $form-&amp;gt;input('slug');?&amp;gt;&lt;br /&gt;
    &amp;lt;?php &lt;a href="http://www.php.net/echo"&gt;echo&lt;/a&gt; $form-&amp;gt;select('parent_id', $categories);?&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;?php &lt;a href="http://www.php.net/echo"&gt;echo&lt;/a&gt; $form-&amp;gt;end('Submit');?&amp;gt;&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
更进一步&lt;br /&gt;
取得层级分类&lt;/p&gt;
&lt;p&gt;class Category extends AppModel ｛&lt;br /&gt;
    var $name = 'Category';&lt;br /&gt;
    var $actsAs = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('Tree');&lt;br /&gt;
    function getThreadCategories() {&lt;br /&gt;
        $this-&amp;gt;recursive=-1;&lt;br /&gt;
        return $this-&amp;gt;findAllThreaded(null,null,'lft asc');&lt;br /&gt;
    }&lt;br /&gt;
｝&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
取得下属条目&lt;br /&gt;
当给分类下添加条目，比如Links时，基本的做法是&lt;/p&gt;
&lt;p&gt;class Category extends AppModel {&lt;br /&gt;
    var $name = 'Category';&lt;br /&gt;
    var $hasMany = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;br /&gt;
            'Links' =&amp;gt; &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('className' =&amp;gt; 'Link',&lt;br /&gt;
                                'foreignKey' =&amp;gt; 'category_id',&lt;br /&gt;
            )&lt;br /&gt;
    );&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
这样就通过Link.category_id连接了Link和对应的Category。&lt;br /&gt;
包含下级分类所属条目&lt;br /&gt;
但很多时候我们需要一个分类下的条目时，是需要包含下级分类所属条目的，此时需要添加finderQuery，并去除foreignkey：&lt;/p&gt;
&lt;p&gt;class Category extends AppModel {&lt;br /&gt;
    var $name = 'Category';&lt;br /&gt;
    var $actsAs = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('Tree');&lt;br /&gt;
    var $hasMany = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;br /&gt;
            'Links' =&amp;gt; &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('className' =&amp;gt; 'Link',&lt;br /&gt;
                                'foreignKey' =&amp;gt; '',&lt;br /&gt;
                                'finderQuery' =&amp;gt; '&lt;br /&gt;
                                    SELECT&lt;br /&gt;
                                        `Links`.*&lt;br /&gt;
                                    FROM&lt;br /&gt;
                                        `links` AS `Links`&lt;br /&gt;
                                    JOIN&lt;br /&gt;
                                        categories Child ON Child.id=Links.category_id&lt;br /&gt;
                                    JOIN&lt;br /&gt;
                                        categories Category ON Category.id={$__cakeID__$}&lt;br /&gt;
                                    WHERE&lt;br /&gt;
                                        (Child.lft &amp;gt;= Category.lft)&lt;br /&gt;
                                    AND&lt;br /&gt;
                                        (Child.rght &amp;lt;= Category.rght)&lt;br /&gt;
                                    '&lt;br /&gt;
            )&lt;br /&gt;
    );&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
刷新条目计数&lt;/p&gt;
&lt;p&gt;class &lt;a href="http://www.php.net/link"&gt;Link&lt;/a&gt; extends AppModel {&lt;br /&gt;
    var $name = 'Link';&lt;br /&gt;
    var $belongsTo = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;br /&gt;
            'Category' =&amp;gt; &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('className' =&amp;gt; 'Category',&lt;br /&gt;
                                'foreignKey' =&amp;gt; 'category_id',&lt;br /&gt;
            )&lt;br /&gt;
    );&lt;br /&gt;
    function updateCounterCache ($keys = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;(), $created = false) {&lt;br /&gt;
        parent::updateCounterCache($keys, $created);&lt;/p&gt;
&lt;p&gt;        $category = $this-&amp;gt;field('category_id');&lt;br /&gt;
        if (!$category) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        $conditions = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('Category.id' =&amp;gt; $category);&lt;br /&gt;
        $fields = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('id', 'lft', 'rght');&lt;br /&gt;
        $recursive = -1;&lt;br /&gt;
        $limits = $this-&amp;gt;Category-&amp;gt;find('first', &lt;a href="http://www.php.net/compact"&gt;compact&lt;/a&gt;('conditions', 'fields', 'recursive'));&lt;br /&gt;
        $path = $this-&amp;gt;Category-&amp;gt;getPath($category, $fields);&lt;br /&gt;
        foreach ($path as $category) {&lt;br /&gt;
            &lt;a href="http://www.php.net/extract"&gt;extract&lt;/a&gt; ($category);&lt;br /&gt;
            $conditions = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;br /&gt;
                'Category.lft &amp;gt;=' . $Category['lft'],&lt;br /&gt;
                'Category.rght &amp;lt;=' . $Category['rght'],&lt;br /&gt;
                );&lt;br /&gt;
            $this-&amp;gt;Category-&amp;gt;updateAll(&lt;br /&gt;
                &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('link_count' =&amp;gt; &lt;a href="http://www.php.net/intval"&gt;intval&lt;/a&gt;($this-&amp;gt;find('count', &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('conditions' =&amp;gt; $conditions)))),&lt;br /&gt;
                &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;($this-&amp;gt;Category-&amp;gt;escapeField() =&amp;gt; $Category['id'])&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
这样每当我们新建一个Link时，其所属分类及上级分类的link_count将会被自动刷新。有缺憾的是，如果我们是把一个Link从旧分类调整到新分类，旧分类的link_count不会更新。&lt;/p&gt;
&lt;p&gt;Related posts:
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://blog.efrees.com/cakephp-set-data-for-view-trap.html" rel="bookmark" title=" cakephp controller中设置viewVars时的陷阱"&gt;cakephp controller中设置viewVars时的陷阱&lt;/a&gt; 要从controller传递变量到view,需要使用set method。基本的用法是 $this-&amp;gt;set('categories',$categories);   更顺手的写法是 $this-&amp;gt;set(compact('categories'));   多个变量时可以这样写 $this-&amp;gt;set('categories',$categories); $this-&amp;gt;set('category',$category);...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.efrees.com/alpha-s-categories-widget-for-wordpress.html" rel="bookmark" title=" Alpha’s Categories Widget for wordpress"&gt;Alpha’s Categories Widget for wordpress&lt;/a&gt; 近来用WordPress做一个小站，需要象Joomla一样能按Section展示多组分类。下了一个Breukie’s Categories Widget插件达成了这一功能。但当我随后升级到WordPress 2.8的时候，这个插件却不能完好的支持。看了一下源码，原来WordPress 2.8变更了Widgets的实现方法。于是只好自己动手，写了这个增强的Categories Widget插件：Alpha’s Categories Widget。 利用Alpha’s Categories...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.efrees.com/wordpress-theme-berita-hack.html" rel="bookmark" title=" WordPress主题berita几处修改记录"&gt;WordPress主题berita几处修改记录&lt;/a&gt; 前阵子看到这篇《使用WordPress定制企业网站》介绍的berita这个主题。界面我很喜欢，以前也确曾帮朋友用wordpress做过企业网站，于是就去下载了官方原版来用。 当然世事无完美，更没有什么主题能够完全适应各种需求。使用中发现了一些小问题，或者仅仅是不符合个人需求之处，做了一些改动，特此记录。 选择空分类作为博客页 设置面板里Blog Section Settings-&amp;gt;Pick Category for Your Blog...&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/HqjouWSjG7M" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Mon, 27 Jul 2009 04:07:43 +0000</pubDate>
 <dc:creator>余心烦错 » cakephp</dc:creator>
 <guid isPermaLink="false">2595 at http://planetcakephp.org</guid>
</item>
<item>
 <title>通过GenerateData生成Cakephp项目的模拟数据！</title>
 <link>http://www.thinkly.cn/index.php/archives/300</link>
 <description>&lt;p&gt;      项目进行中，总是离不开数据库，那么必然就要有数据！当前，我们的项目进行中要是有更新（程序以及schema.sql和测试数据的更新）见下图：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/07/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.thinkly.cn/wp-content/uploads/2009/07/image-thumb.png" width="244" height="38" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;      然后，我们会通过运行cake schema run create 或者 cake schema run update 来更新数据库结构，然后通过命令：zcat APP/config/sql/sample_data.sql.gz | mysql -u root -p [project_db] 将上图的模拟数据包中的数据填入到数据库中。&lt;/p&gt;
&lt;p&gt; &lt;span id="more-300"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;      以上就是我们在项目开发过程中，经常进行的操作：通过SVN更新项目，更新schema，重新填入模拟的数据。那么我们通过什么来生成成千上万条的数据呢？是的，通过&lt;a href="http://www.generatedata.com"&gt;GenerateData&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/07/image1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="generateData" border="0" alt="generateData" src="http://www.thinkly.cn/wp-content/uploads/2009/07/image-thumb1.png" width="484" height="238" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;      下面我给大家演示下，生成一张用户信息表的简单操作过程：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/07/image2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="generateData Form" border="0" alt="generateData Form" src="http://www.thinkly.cn/wp-content/uploads/2009/07/image-thumb2.png" width="484" height="260" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;      那么生成后，其结果是怎样的呢？&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/07/image3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="generateData result" border="0" alt="generateData result" src="http://www.thinkly.cn/wp-content/uploads/2009/07/image-thumb3.png" width="604" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/cM9OyzANEAg" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Wed, 01 Jul 2009 02:17:30 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">2700 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Cakephp1.2中JQuery和JSON的使用</title>
 <link>http://www.thinkly.cn/index.php/archives/280</link>
 <description>&lt;p&gt;文章原文来自于 &lt;strong&gt;Eelco Wiersma&lt;/strong&gt; 的文章 《Using JSON in CakePHP 1.2》&lt;/p&gt;
&lt;p&gt;参考文章&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.pagebakers.nl/2007/06/05/using-json-in-cakephp-12/" href="http://www.pagebakers.nl/2007/06/05/using-json-in-cakephp-12/" target="_blank"&gt;Using JSON in CakePHP 1.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.json.org/json-zh.html" href="http://www.json.org/json-zh.html" target="_blank"&gt;介绍 JSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/docs/jquery_1.3/" target="_blank"&gt;JQuery API 1.3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。Cakephp1.2提供了对JSON的内置支持,主要体现在两个特殊的方法:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Router::parseExtensions() &lt;/strong&gt;和 &lt;strong&gt;JavascriptHelper::object()&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们要通过JQuery的$.getJSON方法,获取Cakephp服务端的JSON数据,URL可能是这个样子&lt;/p&gt;
&lt;pre class="brush: text; toolbar: false;"&gt;http://localhost/posts/index.json&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;如何完成?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id="more-280"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先,要让Cakephp启用JSON的扩展名解析&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑/config/routes.php,添加&lt;/p&gt;
&lt;pre class="brush: php; toolbar: false;"&gt;Router::parseExtensions(’json’);&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;然后,为JSON设置Content-type&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑app_controller.php,添加&lt;/p&gt;
&lt;pre class="brush: php;"&gt;var $components = array('RequestHandler');
function beforeFilter() {
    $this-&gt;RequestHandler-&gt;setContent('json', 'text/x-json');
    parent::beforeFilter();
}&lt;/pre&gt;&lt;p&gt;RequestHandler的setContent方法,可以使json的扩展名使用特定的layout和视图,就像下面的代码&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下面,为你的JSON数据创建一个layout&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建/layouts/json/default.ctp的代码&lt;/p&gt;
&lt;pre class="brush: php;"&gt;&amp;lt;?php
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
header('Content-Type: text/x-json');
header("X-JSON: ".$content_for_layout);

echo $content_for_layout;
?&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;注意:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在使用RequestHandler的setContent方法后,Cakephp会自动解析json扩展名的访问并且会默认使用&lt;/p&gt;
&lt;p&gt;/layouts/json/default.ctp解析json,如果不存在这个layout的话,会出现 &lt;strong&gt;未找到layout错误&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;x-json头可以被prototype.js将返回的数据自动解析为JSON对象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下面创建我们的JSON视图&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建/views/posts/&lt;strong&gt;json&lt;/strong&gt;/index.ctp的代码 (&lt;strong&gt;注意加粗的部分&lt;/strong&gt;)&lt;/p&gt;
&lt;pre class="brush: php;"&gt;&amp;lt; ?php
echo $javascript-&gt;object($aPosts);
?&gt;&lt;/pre&gt;&lt;p&gt;同样的json也有自己的视图文件,简单理解就是,在你的控制器视图下的json文件夹,建立同名的视图文件.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;控制器中的代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: php;"&gt;function index() {
    $this-&gt;set('aPosts', $this-&gt;Post-&gt;findAll());
}&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;在JQuery中使用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;假如我们的返回值类似下面这样&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: text;"&gt;Array
(
    [0] =&gt; Array
        (
            [Post] =&gt; Array
                (
                    [id] =&gt; 1
                    [user_id] =&gt; 54
                    [subject] =&gt; augue scelerisque mollis.
                    [body] =&gt; tristique senectus et netus et malesuada fames ac turpis egestas. Fusce aliquet magna
                    [created] =&gt; 2009-10-29 21:15:51
                )

        )

    [1] =&gt; Array
        (
            [Post] =&gt; Array
                (
                    [id] =&gt; 2
                    [user_id] =&gt; 81
                    [subject] =&gt; purus, in molestie tortor nibh
                    [body] =&gt; elit. Nulla facilisi. Sed neque. Sed eget lacus. Mauris non dui nec urna suscipit nonummy.
                    [created] =&gt; 2009-08-01 06:57:03
                )

        )

)&lt;/pre&gt;&lt;p&gt;我们可以这样使用JSON数据 &lt;/p&gt;
&lt;pre class="brush: text;"&gt;$.getJSON("http://localhost/posts/index.json", function(json){
  alert(json[0].Post.subject);
  alert(json[1].Post.subject);
});&lt;/pre&gt;&lt;p&gt;可以看到,我们可以直接使用由json返回的数据,而不用做任何转换.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同样的解析方法也适用于xml和rss扩展,cakephp对xml和rss提供了默认支持,有兴趣的话可以研究一下.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/8zy3ZeGiifA" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Fri, 26 Jun 2009 03:59:56 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">2701 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Cakephp中使用Captcha实现更加安全的验证码</title>
 <link>http://www.thinkly.cn/index.php/archives/278</link>
 <description>&lt;p&gt;Captcha官方&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.captcha.ru/en/" href="http://www.captcha.ru/en/" target="_blank"&gt;http://www.captcha.ru/en/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Captcha下载&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.captcha.ru/en/kcaptcha/" href="http://www.captcha.ru/en/kcaptcha/" target="_blank"&gt;http://www.captcha.ru/en/kcaptcha/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thinkly.cn/download/tools/kcaptcha_1.2.6.rar" target="_blank"&gt;本地下载1.2.6版本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用Captcha可以实现安全的验证码功能,Captcha提供了多种风格和样式的风格比如&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/06/image9.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.thinkly.cn/wp-content/uploads/2009/06/image-thumb9.png" width="121" height="61" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;使用方法超级简单&lt;/p&gt;
&lt;p&gt; &lt;span id="more-278"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;getImage.php&lt;/p&gt;
&lt;pre class="brush: php;"&gt;&amp;lt;?php
session_start();
include('kcaptcha.php');
$captcha = new KCAPTCHA();
?&gt;&lt;/pre&gt;&lt;p&gt;index.php&lt;/p&gt;
&lt;pre class="brush: csharp; toolbar: false;"&gt;&lt;html&gt;
&lt;body&gt;
&lt;img src="getImage.php" /&gt;
&lt;/body&gt;
&lt;/html&gt;&lt;/pre&gt;&lt;p&gt;Captcha会自动在Session中设置一个值来保存已经生成的验证码,要判断验证码是否正确,可以这样做:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;//Captche会自动在Session中存储一个名为captcha_keystring的字符串
//只要验证一下提交的验证码是否和它相等就OK了

if(isset($_SESSION['captcha_keystring']) &amp;&amp; $_SESSION['captcha_keystring'] == $_POST['keystring']){
    echo "Correct";
}else{
    echo "Wrong";
}&lt;/pre&gt;&lt;p&gt;那么,如何在Cakephp中使用Captcha呢? &lt;/p&gt;
&lt;p&gt;介绍一下, &lt;strong&gt;Yoophi &lt;/strong&gt;在Cakephp通过组件方式使用Captcha的方法&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;将kcaptcha文件夹拷贝到vendors目录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/06/image10.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.thinkly.cn/wp-content/uploads/2009/06/image-thumb10.png" width="244" height="121" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在components中写一个新的组件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thinkly.cn/wp-content/uploads/2009/06/image11.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.thinkly.cn/wp-content/uploads/2009/06/image-thumb11.png" width="206" height="80" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;代码如下:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;&amp;lt;?php
class CaptchaComponent extends Object {
	var $Controller = null;

	function startup(&amp;$controller)
	{
		$this-&gt;Controller = $controller;
	}

	function render()
	{
		App::import('vendor', 'kcaptcha/kcaptcha');
		$kcaptcha = new KCAPTCHA();
		$this-&gt;Controller-&gt;Session-&gt;write('captcha', $kcaptcha-&gt;getKeyString());
		exit;
	}

}
?&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;然后,写一个生成验证码的方法,比如&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: php;"&gt;class UsersController extends AppController {

    var $name        = 'Users';
    var $components  = array('Captcha');

    function captcha() {
        Configure::write('debug', '0');
        $this-&gt;autoRender = false;
        $this-&gt;Captcha-&gt;render();
    }

}&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;视图中的调用&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: php; toolbar: false;"&gt;echo $html-&gt;image(array('controller' =&gt; 'Users','action'=&gt;'captcha'));&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;验证提交的验证码是否正确&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: php;"&gt;function _checkCaptcha($model) {
    if ($this-&gt;Session-&gt;check('captcha')) {
        $s_captcha = $this-&gt;Session-&gt;read('captcha');

        if (!empty($this-&gt;data[$model]['captcha']) &amp;&amp; $this-&gt;data[$model]['captcha'] == $s_captcha) {
            return true;
        }
    }

    return false;
}&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Captcha是一个免费的验证码文件,使用方法超级简单,但是安全性很高,配置方法简单,可以应用于多种开发程序框架&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Captcha的配置文件为kcaptcha_config.php&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通过它可以变更生成的图片大小,样式等内容,有兴趣的话自己可以看看!&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-chinese/~4/4Vbz3u0FWoE" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/chinese">中文</category>
 <pubDate>Thu, 25 Jun 2009 08:19:27 +0000</pubDate>
 <dc:creator>Thinkly Blog » Cakephp</dc:creator>
 <guid isPermaLink="false">2702 at http://planetcakephp.org</guid>
</item>
</channel>
</rss>
