<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Debuggable Blog</title><link>http://www.debuggable.com/</link><description /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/debuggable" type="application/rss+xml" /><item><title>Programming Psychology II: Private methods </title><link>http://feeds.feedburner.com/~r/debuggable/~3/328851523/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;my previous posts about &lt;a href="http://debuggable.com/posts/programming-psychology-return-home-early:4811de9f-ae28-49c2-a7dc-2f154834cda3"&gt;code that is easy to write vs code that is easy to read&lt;/a&gt; and why &lt;a href="http://debuggable.com/posts/xhtml-is-a-joke:4819bf98-4978-4027-896e-2ea44834cda3"&gt;XHTML is a joke&lt;/a&gt; spawned a fair amount of criticism. This time I am afraid very few people are going to agree with me at all:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Private / protected methods and properties are one of the most stupid concepts of OOP.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is a thought I first shared at &lt;a href="http://debuggable.com/posts/cakefest-orlando-2008-summary:480f4dd6-6404-4774-a771-4e8fcbdd56cb"&gt;CakeFest Orlando&lt;/a&gt; this year, but could not explain properly at the time.&lt;/p&gt;
&lt;p&gt;Here is the typical excuse for why any language should implement such a terrible concept:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; BankAccount&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="re0"&gt;$balance&lt;/span&gt; = &lt;span class="nu0"&gt;0.00&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; set&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$newBalance&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!&lt;a href="http://www.php.net/is_numeric"&gt;&lt;span class="kw3"&gt;is_numeric&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$newBalance&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;error&lt;/span&gt; = &lt;span class="st0"&gt;'And I will strike down upon thee with great vengeance&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="st0"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and furious anger those who would attempt to poison and&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="st0"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; destroy my bank account. [...]'&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;balance&lt;/span&gt; = &lt;span class="re0"&gt;$newBalance&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;true&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; get&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;balance&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; save&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Great, I can now always blindly trust the value of $this-&amp;gt;balance!&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; file_put_contents&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'balance'&lt;/span&gt;, &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;balance&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Awesome! Now nobody can mess with the balance of this account class and you don't even have to communicate the rules for using it to other programmers!&lt;br /&gt;
&lt;blockquote&gt;If you think you can manage programmers or enforce API policies with a few keywords of your programming language ... think again!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If somebody does not understand why he is not supposed to modify the balance property - he will find ways around it. And it won't be pretty, trust me. He'll directly write his values to the database and reload the object. He'll simply change your source code without warning. He'll extend the class and overwrite the set method.&lt;br /&gt;
&lt;blockquote&gt;Programmers will do just about anything to restore power you are trying to take away from them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now you might think: &lt;strong&gt;"But it really makes sense to use a private property here, nobody would ever want to work around this?"&lt;/strong&gt;. Well maybe. And thats a big maybe. Predicting what other programmers will want to do with your code is like &lt;a href="http://en.wikipedia.org/wiki/UUID#Random_UUID_probability_of_duplicates"&gt;playing number guessing with uuids&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So why not try to make the other programmers your allies? Show them what you are trying to accomplish in a semantic fashion:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; BankAccount&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="re0"&gt;$balance&lt;/span&gt; = &lt;span class="nu0"&gt;0.00&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; validates&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!&lt;a href="http://www.php.net/is_numeric"&gt;&lt;span class="kw3"&gt;is_numeric&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;balance&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;error&lt;/span&gt; = &lt;span class="st0"&gt;'And I will strike down upon thee with great vengeance&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="st0"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and furious anger those who would attempt to poison and&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="st0"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; destroy my bank account. [...]'&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;true&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; save&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Lets just make sure that nothing has gone wrong before saving&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;validates&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; file_put_contents&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'balance'&lt;/span&gt;, &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;balance&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;This approach has many advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It gets rid of the useless overhead from setter / getter functions.&lt;/li&gt;
&lt;li&gt;It communicates that you need to validate certain things before saving a record.&lt;/li&gt;
&lt;li&gt;It embraces open architectures and others can work with it right away.&lt;/li&gt;
&lt;li&gt;It makes your class more flexible since you can temporarily feed it with invalid values.&lt;/li&gt;
&lt;li&gt;It exposes a new useful method.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Is that it?&lt;/h3&gt;
&lt;p&gt;Despite the fact that I think that private / protected are a stupid idea to begin with, I have an even bigger issue with them:&lt;br /&gt;
&lt;blockquote&gt;The concept of private / protected properties and methods seems to be the most popular recipe for producing crappy code.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I think it's safe to say that all of us were following at least one of the patterns listed below at one point:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Not sure where this code goes - I'll put it in a private method for now.&lt;/li&gt;
&lt;li&gt;Oh, I will refactor this later, so I temporarely put it in a private method.&lt;/li&gt;
&lt;li&gt;This is just a helper function, no need to clutter the API with it.&lt;/li&gt;
&lt;li&gt;I am sure no other class will need to access this property ... lets make it private.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now ask yourself how many times those decisions have lead to code you are proud of? I cannot recall a single occasion in my work as a programmer where using private / protected has helped me to write better code. In fact, these days I even judge other peoples code by it:&lt;br /&gt;
&lt;blockquote&gt;When I see more than 2-3 private / protected methods in a class I know the code I'm looking at is in poor shape.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This may sound like a big simplification, but it holds true. I've almost never seen people use private / protected in the proper (yet stupid) way they are supposed to be used.&lt;/p&gt;
&lt;p&gt;The psychology behind this is simple. Give people a way to ignore things they don't want to deal with and they will. Private / protected were not meant for that purpose, but unfortunately they encourage the worst habits in us programmers and I therefor highly recommend against using them.&lt;/p&gt;
&lt;p&gt;-- Felix Geisendörfer aka the_undefined&lt;/p&gt;
&lt;p&gt;PS: Even if you "just" use the CakePHP convention of prefixing functions with one or two underscores to indicate scope visibility you'll end up writing messy code.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/328851523" height="1" width="1"/&gt;</description><author>felix@debuggable.com</author><pubDate>Mon, 07 Jul 2008 12:49:05 +0000</pubDate><comments>http://www.debuggable.com/posts/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3</feedburner:origLink></item><item><title>CakePHP RC2 Released!</title><link>http://feeds.feedburner.com/~r/debuggable/~3/323121115/cakephp-rc2-released!:486746fc-65d8-4fba-98b9-1edd4834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/cakephp-rc2-released!:486746fc-65d8-4fba-98b9-1edd4834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;in case you haven't noticed yet, Cake has gone into RC2 phase. Please &lt;a href="http://cakephp.org"&gt;check it out&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think extra kudos go this time to gwoo for putting up countless hours to get many tickets fixed during the last two weeks. Cheers mate. :]&lt;/p&gt;
&lt;p&gt;Here are some links that might interest you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://bakery.cakephp.org/articles/view/release-some-rc2-sweetness"&gt;RC2 Release Annoncement&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trac.cakephp.org/wiki/changelog/1.2.x.x"&gt;The complete changelog for this release&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cakephp.org/pages/features"&gt;The hot features of cake&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- Tim Koschuetzki aka DarkAngelBGE&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/323121115" height="1" width="1"/&gt;</description><author>tim@debuggable.com</author><pubDate>Mon, 30 Jun 2008 09:25:39 +0000</pubDate><comments>http://www.debuggable.com/posts/cakephp-rc2-released!:486746fc-65d8-4fba-98b9-1edd4834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/cakephp-rc2-released!:486746fc-65d8-4fba-98b9-1edd4834cda3</feedburner:origLink></item><item><title>Working with databases on OSX will soon be as awesome as everything else on OSX</title><link>http://feeds.feedburner.com/~r/debuggable/~3/319013443/Working-with-databases-on-OSX:48612139-d180-4403-b1b7-46614834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/Working-with-databases-on-OSX:48612139-d180-4403-b1b7-46614834cda3</guid><description>&lt;p&gt;Howdy people (ha! there's a new one),&lt;/p&gt;
&lt;p&gt;As we all know, database apps on most platforms... well, suck... even on OSX.  The best we have is CocoaMySQL, which, while &lt;em&gt;okay&lt;/em&gt;, could certainly not be called great.  This shouldn't be the case.  We have higher standards.  We can do better.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="http://blog.shiftosx.com/"&gt;Shift&lt;/a&gt;.  Shift started life as a direct port of the apparently-no-longer-maintained CocoaMySQL, and indeed, much of the code and interface is still the same.  However, the &lt;a href="http://blog.shiftosx.com/2008/06/05/shift-05-in-development/"&gt;interface mockups&lt;/a&gt; of the upcoming 0.5 release make this a project worth keeping a close eye on.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/319013443" height="1" width="1"/&gt;</description><author>nate@cakephp.org</author><pubDate>Tue, 24 Jun 2008 16:33:23 +0000</pubDate><comments>http://www.debuggable.com/posts/Working-with-databases-on-OSX:48612139-d180-4403-b1b7-46614834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/Working-with-databases-on-OSX:48612139-d180-4403-b1b7-46614834cda3</feedburner:origLink></item><item><title>How to bend Cake's Model::find() method to your needs</title><link>http://feeds.feedburner.com/~r/debuggable/~3/316883756/implementing-different-types-for-cake's-model::find()-method:485030de-4778-456e-8400-44d84834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/implementing-different-types-for-cake's-model::find()-method:485030de-4778-456e-8400-44d84834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;CakePHP allows you to use your own "find-types" for the Model::find() methodology. Those of your who are familiar with the find() method know that there are currently four types in the core: 'list', 'all', 'first' and 'count'. However, sometimes it is nice to specify your own type so you can have a call like this:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;Comment&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'pending'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;So how would you go about implementing this? Correct, you would overwrite the find() method in your model and provide the default functionality if there is one of the default types used. Let's have a look at how you could implement this pending find from above:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; Comment &lt;span class="kw2"&gt;extends&lt;/span&gt; AppModel &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; &lt;span class="re0"&gt;$belongsTo&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; find&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; &lt;span class="st0"&gt;'pending'&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'fields'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User.email'&lt;/span&gt;, &lt;span class="st0"&gt;'User.first_name'&lt;/span&gt;, &lt;span class="st0"&gt;'User.last_name'&lt;/span&gt;, &lt;span class="st0"&gt;'Comment.name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'Comment.active'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'Comment.blocked'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'contain'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;default&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; parent::&lt;span class="me2"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;So this is actually not very difficult code, but it is very powerful. You could specify different sets of conditions, fields, orders, groups by's and containments just by adding a new entry to the switch statement. Please note that there is no break needed within the switch as we &lt;a href=""&gt;return home&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let's add some code for finding pending users that were invited by the currently logged-in user. This is what we could use in the controller:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;Comment&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'pending'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'created_by_id'&lt;/span&gt; =&amp;gt; User::&lt;span class="me2"&gt;get&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Now for the model we would need to add some code that tracks if $queryData['conditions'] is set, and use that as well in conjunction with the conditions specified in our find type. While we are at it, let's also add some code that would handle fields, order, group, recursive and contain statements:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; Comment &lt;span class="kw2"&gt;extends&lt;/span&gt; AppModel &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; &lt;span class="re0"&gt;$belongsTo&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; find&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$defaults&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'fields'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'order'&lt;/span&gt; =&amp;gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'recursive'&lt;/span&gt; =&amp;gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'contain'&lt;/span&gt; =&amp;gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$queryData&lt;/span&gt; = am&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$defaults&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; &lt;span class="st0"&gt;'pending'&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'fields'&lt;/span&gt; =&amp;gt; am&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User.email'&lt;/span&gt;, &lt;span class="st0"&gt;'User.first_name'&lt;/span&gt;, &lt;span class="st0"&gt;'User.last_name'&lt;/span&gt;, &lt;span class="st0"&gt;'Comment.name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'fields'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; am&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'Comment.active'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'Comment.blocked'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'conditions'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'contain'&lt;/span&gt; =&amp;gt; am&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'contain'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;default&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; parent::&lt;span class="me2"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;With some default values we can happily use our custom find type alongside dynamic conditions inserted by our controllers. If you think this am() stuff is overkill, you could as well just provide another find type:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;Comment&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'pending-created-by-logged-in-user'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; Comment &lt;span class="kw2"&gt;extends&lt;/span&gt; AppModel &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; &lt;span class="re0"&gt;$belongsTo&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; find&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; &lt;span class="st0"&gt;'pending'&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'fields'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User.email'&lt;/span&gt;, &lt;span class="st0"&gt;'User.first_name'&lt;/span&gt;, &lt;span class="st0"&gt;'User.last_name'&lt;/span&gt;, &lt;span class="st0"&gt;'Comment.name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'Comment.active'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'Comment.blocked'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'contain'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; &lt;span class="st0"&gt;'pending-created-by-logged-in-user'&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'fields'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User.email'&lt;/span&gt;, &lt;span class="st0"&gt;'User.first_name'&lt;/span&gt;, &lt;span class="st0"&gt;'User.last_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'Comment.active'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'Comment.blocked'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'Comment.created_by_id'&lt;/span&gt; =&amp;gt; User::&lt;span class="me2"&gt;get&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;span class="st0"&gt;'contain'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'User'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;default&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; parent::&lt;span class="me2"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$type&lt;/span&gt;, &lt;span class="re0"&gt;$queryData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;... well you get the idea. By the way, do you notice how useful using a static functions like this User::get() methods are for fetching properties and data from the currently logged in user? More on that later.&lt;/p&gt;
&lt;p&gt;Anybody willing to share some dough on this one?&lt;/p&gt;
&lt;p&gt;-- Tim Koschuetzki aka DarkAngelBGE&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/316883756" height="1" width="1"/&gt;</description><author>tim@debuggable.com</author><pubDate>Sat, 21 Jun 2008 13:14:59 +0000</pubDate><comments>http://www.debuggable.com/posts/implementing-different-types-for-cake's-model::find()-method:485030de-4778-456e-8400-44d84834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/implementing-different-types-for-cake's-model::find()-method:485030de-4778-456e-8400-44d84834cda3</feedburner:origLink></item><item><title>How To Execute Only Specific Test Methods in CakePHP Unit Tests</title><link>http://feeds.feedburner.com/~r/debuggable/~3/315275102/how-to-execute-only-specific-test-methods-in-cakephp-unit-tests:4858fa7b-7194-4652-9c7f-47784834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/how-to-execute-only-specific-test-methods-in-cakephp-unit-tests:4858fa7b-7194-4652-9c7f-47784834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;most of us familiar with unit testing with &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt; and &lt;a href="http://simpletest.org"&gt;SimpleTest&lt;/a&gt; know that&lt;br /&gt;
SimpleTest always executes all methods starting with the string "test". &lt;/p&gt;
&lt;p&gt;This can be problematic sometimes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;As you unit test your application you realize that the same test fails again and again and you cannot make it work and therefore want to tackle it in isolation from the other tests.&lt;/li&gt;
&lt;li&gt;Many tests fail and you want to tackle them one at a time without getting distracted by the failure messages of the others.&lt;/li&gt;
&lt;li&gt;Say you debug a model class of yours and have many tests for the same model function. Now, in order to get the one failing test working, you want to output some debug information within that model method. However, as there are many tests for that method, the debug information will always show for every test and your screen is full of debug information and you spend five or more seconds searching for the correct one.&lt;/li&gt;
&lt;li&gt;Executing all test functions takes a tremendous amount of time and you just need to get one test to work. You obviously don't want to spend 30 seconds waiting just to get the same failure message again and again. ; )&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point you have two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a new testcase, copy all the code that is needed to setUp() it properly, copy the test function over and observe and debug it there. Then copy back when you are done and then for every test method. This isn't very fast.&lt;/li&gt;
&lt;li&gt;Put an 'x' before every test method name except before the one you want to debug. This really slows you down if there are many test functions.&lt;/li&gt;
&lt;li&gt;Read the following tip and make your life a lot easier. ; )&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As the CakeTestCase class extends SimpleTest's UnitTestCase class, it inherits all their functionality. Fortunately, SimpleTest internally has a useful mechanism to choose which functions to execute in the test class.&lt;/p&gt;
&lt;p&gt;The name of this method is getTests(), which returns an array of methods that it shall execute. By default it looks like this:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;function&lt;/span&gt; getTests&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$methods&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;foreach&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/get_class_methods"&gt;&lt;span class="kw3"&gt;get_class_methods&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/get_class"&gt;&lt;span class="kw3"&gt;get_class&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="kw1"&gt;as&lt;/span&gt; &lt;span class="re0"&gt;$method&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;_isTest&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$method&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$methods&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; = &lt;span class="re0"&gt;$method&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$methods&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;function&lt;/span&gt; _isTest&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$method&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/strtolower"&gt;&lt;span class="kw3"&gt;strtolower&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/substr"&gt;&lt;span class="kw3"&gt;substr&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$method&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; == &lt;span class="st0"&gt;'test'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; ! SimpleTestCompatibility::&lt;span class="me2"&gt;isA&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;, &lt;a href="http://www.php.net/strtolower"&gt;&lt;span class="kw3"&gt;strtolower&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$method&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Pretty straightforward. Fetches all method names from the current class and tests if they start with 'test' (and looks if they are tests). So we see all that getTests() really does is return an array of test methods.&lt;/p&gt;
&lt;p&gt;Let's look at an example on how to put this to use. Say you have the following tests (which absolutely make no sense whatsoever) in your custom CakePHP Test class:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; MyHumbleTest &lt;span class="kw2"&gt;extends&lt;/span&gt; CakeTestCase &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; setUp&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; testOfIdenticalClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertIdentical&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'class'&lt;/span&gt;, &lt;span class="st0"&gt;'class'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; testOfIdenticalName&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertIdentical&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'name'&lt;/span&gt;, &lt;span class="st0"&gt;'name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; tearDown&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;.. and then some. Now you want to check the testOfIdenticalName method alone. You would add a getTests() implementation:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; MuHumbleTest &lt;span class="kw2"&gt;extends&lt;/span&gt; CakeTestCase &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; setUp&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; testOfIdenticalClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertIdentical&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'class'&lt;/span&gt;, &lt;span class="st0"&gt;'class'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; testOfIdenticalName&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertIdentical&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'name'&lt;/span&gt;, &lt;span class="st0"&gt;'name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; getTests&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'testOfIdenticalName'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; tearDown&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Very cool and handy, yes? Life is getting easier with such things, especially with many test functions.&lt;/p&gt;
&lt;p&gt;One thing to note is that if you want to keep fixtures working, you have to tell it to still execute the start(), startCase(), endCase() an end() callbacks:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; MuHumbleTest &lt;span class="kw2"&gt;extends&lt;/span&gt; CakeTestCase &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; setUp&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; testOfIdenticalClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertIdentical&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'class'&lt;/span&gt;, &lt;span class="st0"&gt;'class'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; testOfIdenticalName&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertIdentical&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'name'&lt;/span&gt;, &lt;span class="st0"&gt;'name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; getTests&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$methods&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'testOfIdenticalName'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; am&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;a&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'start'&lt;/span&gt;, &lt;span class="st0"&gt;'startCase'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="re0"&gt;$methods&lt;/span&gt;, a&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'endCase'&lt;/span&gt;, &lt;span class="st0"&gt;'end'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; tearDown&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;-- Tim Koschuetzki aka DarkAngelBGE&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/315275102" height="1" width="1"/&gt;</description><author>tim@debuggable.com</author><pubDate>Thu, 19 Jun 2008 08:41:11 +0000</pubDate><comments>http://www.debuggable.com/posts/how-to-execute-only-specific-test-methods-in-cakephp-unit-tests:4858fa7b-7194-4652-9c7f-47784834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/how-to-execute-only-specific-test-methods-in-cakephp-unit-tests:4858fa7b-7194-4652-9c7f-47784834cda3</feedburner:origLink></item><item><title>How to Group By in CakePHP's new release Part 2</title><link>http://feeds.feedburner.com/~r/debuggable/~3/313001988/how-to-group-by-in-cakephp's-new-release-part-2:4850d2c9-edbc-4f0e-9e0e-07d64834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/how-to-group-by-in-cakephp's-new-release-part-2:4850d2c9-edbc-4f0e-9e0e-07d64834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;having promised it in &lt;a href="http://debuggable.com/posts/how-to-do-group-by-conditions-in-model-find()-calls:483fdc1c-8454-4593-a55e-37244834cda3"&gt;the first post on how to do Group By in CakePHP&lt;/a&gt; I worked on an array() version for the group statement in Model::find() calls. So I implemented it. This is what can be accomplished now:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; = &lt;span class="re0"&gt;$Thread&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'group'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;'Thread.project_id, Project.id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertEqual&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$result&lt;/span&gt;, &lt;span class="re0"&gt;$expected&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; = &lt;span class="re0"&gt;$Thread&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="st0"&gt;'group'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;'project_id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertEqual&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$result&lt;/span&gt;, &lt;span class="re0"&gt;$expected&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; = &lt;span class="re0"&gt;$Thread&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'group'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'project_id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertEqual&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$result&lt;/span&gt;, &lt;span class="re0"&gt;$expected&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; = &lt;span class="re0"&gt;$Thread&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'group'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'project_id'&lt;/span&gt;, &lt;span class="st0"&gt;'Project.id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertEqual&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$result&lt;/span&gt;, &lt;span class="re0"&gt;$expected&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; = &lt;span class="re0"&gt;$Thread&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'group'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt;, &lt;span class="st0"&gt;'Project.id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;assertEqual&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$result&lt;/span&gt;, &lt;span class="re0"&gt;$expected&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;As you can see you can still group via the former string method. In addition to that any combination of available fields can be used in an array to form a GROUP BY statement with values separated by comma. &lt;/p&gt;
&lt;p&gt;So this code here:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; = &lt;span class="re0"&gt;$Thread&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'all'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'conditions'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'group'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Thread.project_id'&lt;/span&gt;, &lt;span class="st0"&gt;'Project.id'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;would result in a GROUP BY statement that looks like:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;GROUP BY `Thread`.`project_id`, `Project`.`id`&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;You can leave out the alias of the  model the find is invoked on as long as your columns aren't ambigous.&lt;/p&gt;
&lt;p&gt;Happy baking all! Oh and for those who are interested in the code, &lt;a href="https://trac.cakephp.org/changeset/7192"&gt;have a look at the changeset&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;-- Tim Koschuetzki aka DarkAngelBGE&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/313001988" height="1" width="1"/&gt;</description><author>tim@debuggable.com</author><pubDate>Mon, 16 Jun 2008 12:23:23 +0000</pubDate><comments>http://www.debuggable.com/posts/how-to-group-by-in-cakephp's-new-release-part-2:4850d2c9-edbc-4f0e-9e0e-07d64834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/how-to-group-by-in-cakephp's-new-release-part-2:4850d2c9-edbc-4f0e-9e0e-07d64834cda3</feedburner:origLink></item><item><title>3 Jobs for skilled Bakers</title><link>http://feeds.feedburner.com/~r/debuggable/~3/310401757/3-jobs-for-skilled-bakers:484fa544-0758-48d0-82a7-6fe44834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/3-jobs-for-skilled-bakers:484fa544-0758-48d0-82a7-6fe44834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;it's only been a short while since the launch of the new &lt;a href="http://www.eliteopensourcejobs.com/jobs/index/48075b46-da18-4009-a658-83a14dddecbf"&gt;job board for the CakePHP community&lt;/a&gt; and there are already 3 jobs posted. If you are currently seeking employment, you should consider the following opportunities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.qriu.com/"&gt;QRIU&lt;/a&gt; is seeking bakers to &lt;a href="http://www.eliteopensourcejobs.com/jobs/view/48494e73-b608-4ef2-bd6b-1d5545591f8c"&gt;work on cutting edge CakePHP technology&lt;/a&gt; with them.
&lt;li&gt;&lt;a href="http://www.doubledotmedia.com/"&gt;Doubledot Media Limited&lt;/a&gt; has opportunities to &lt;a href="http://www.eliteopensourcejobs.com/jobs/view/484dfef4-742c-4746-b3be-2f0545591f8c"&gt;play with MySql clustering and web APIs&lt;/a&gt; in their Christchurch (New Zeland) kitchen.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://netro42.com/"&gt;Netro42 Ltd&lt;/a&gt; wants to hire &lt;a href="http://www.eliteopensourcejobs.com/jobs/view/484e97fa-9328-4ac8-9b28-556345591f8c"&gt;passionate bakers that are good at communication&lt;/a&gt; in London (UK).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those jobs sound interesting to you, &lt;a href="http://www.eliteopensourcejobs.com/jobs/index/48075b46-da18-4009-a658-83a14dddecbf"&gt;go ahead and apply&lt;/a&gt;. If you are looking for skilled bakers yourself, consider &lt;a href="http://www.eliteopensourcejobs.com/jobs/add/community_id:48075b46-da18-4009-a658-83a14dddecbf"&gt;posting on the job board&lt;/a&gt;. It is $300 / post of which 50% are donated to the &lt;a href="http://cakefoundation.org/"&gt;Cake Software Foundation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All jobs posted within the next month&lt;/strong&gt; are also going to be &lt;strong&gt;featured on debuggable.com&lt;/strong&gt; including a back link to the company website.&lt;/p&gt;
&lt;p&gt;-- Felix Geisendörfer aka the_undefined&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/310401757" height="1" width="1"/&gt;</description><author>felix@debuggable.com</author><pubDate>Thu, 12 Jun 2008 13:02:53 +0000</pubDate><comments>http://www.debuggable.com/posts/3-jobs-for-skilled-bakers:484fa544-0758-48d0-82a7-6fe44834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/3-jobs-for-skilled-bakers:484fa544-0758-48d0-82a7-6fe44834cda3</feedburner:origLink></item><item><title>How to do Group By conditions in Model find() calls in the CakePHP RC1</title><link>http://feeds.feedburner.com/~r/debuggable/~3/309507111/how-to-do-group-by-conditions-in-model-find()-calls:483fdc1c-8454-4593-a55e-37244834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/how-to-do-group-by-conditions-in-model-find()-calls:483fdc1c-8454-4593-a55e-37244834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;we have to thank &lt;a href="http://mark-story.com/"&gt;Mark Story&lt;/a&gt; and wluigi for working on group by conditions for Cake's Model::find() method. Up until now, you would have to add your GROUP BY stuff to string'ed conditions in order to support a group by statement, which could be very ugly.&lt;/p&gt;
&lt;p&gt;Have a look at the following:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$query&lt;/span&gt; = &lt;a href="http://www.php.net/trim"&gt;&lt;span class="kw3"&gt;trim&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;low&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$query&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$conditions&lt;/span&gt; = &lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;&amp;quot;Product.active = '1' AND (LOWER(Product.name) LIKE '%{$query}%' &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="st0"&gt;&amp;nbsp; &amp;nbsp; OR LOWER(Product.description) LIKE '%{$query}%' &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="st0"&gt;&amp;nbsp; &amp;nbsp; OR LOWER(Product.sku) LIKE '%{$query}%') GROUP BY Product.name&amp;quot;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;paginate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'Product'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'conditions'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; = &lt;span class="re0"&gt;$conditions&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$products&lt;/span&gt; = &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;paginate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Product'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Now with the new worked in group key you would just do:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$query&lt;/span&gt; = &lt;a href="http://www.php.net/trim"&gt;&lt;span class="kw3"&gt;trim&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;low&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$query&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$conditions&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'or'&lt;/span&gt; =&amp;gt; &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'LOWER(Product.name) LIKE'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;&amp;quot;%{$query}%&amp;quot;&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'LOWER(Product.description) LIKE'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;&amp;quot;%{$query}%&amp;quot;&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'LOWER(Product.sku) LIKE'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;&amp;quot;%{$query}%&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st0"&gt;'active'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;paginate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'Product'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'conditions'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; = &lt;span class="re0"&gt;$conditions&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;paginate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'Product'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'group'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; = &lt;span class="st0"&gt;'Product.name'&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$products&lt;/span&gt; = &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;paginate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Product'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Much cleaner! Cool! Now let's see what we'd do if we wanted to group by over several columns:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$order&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'created'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;'desc'&lt;/span&gt;, &lt;span class="st0"&gt;'name'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;'asc'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$group&lt;/span&gt; = &lt;span class="st0"&gt;'name, created'&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$products&lt;/span&gt; = &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;paginate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Product'&lt;/span&gt;, &lt;a href="http://www.php.net/compact"&gt;&lt;span class="kw3"&gt;compact&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'order'&lt;/span&gt;, &lt;span class="st0"&gt;'group'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;The group statement currently works as a string. So you would have to separate multiple group by fields by a comma.&lt;/p&gt;
&lt;p&gt;Kudos to wluigi and mark_story. Checkout the &lt;a href="https://trac.cakephp.org/changeset/7057"&gt;Changeset&lt;/a&gt; if you are interested in the underlying implementation.&lt;/p&gt;
&lt;p&gt;Now who is not excited about the new release?&lt;/p&gt;
&lt;p&gt;-- Tim Koschuetzki aka DarkAngelBGE&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/309507111" height="1" width="1"/&gt;</description><author>tim@debuggable.com</author><pubDate>Wed, 11 Jun 2008 09:30:15 +0000</pubDate><comments>http://www.debuggable.com/posts/how-to-do-group-by-conditions-in-model-find()-calls:483fdc1c-8454-4593-a55e-37244834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/how-to-do-group-by-conditions-in-model-find()-calls:483fdc1c-8454-4593-a55e-37244834cda3</feedburner:origLink></item><item><title>Crawl Google, they do the same to you ; )</title><link>http://feeds.feedburner.com/~r/debuggable/~3/309021978/crawl-google-they-do-the-same-to-you:484ebdeb-bbe8-45fa-ad0f-26b14834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/crawl-google-they-do-the-same-to-you:484ebdeb-bbe8-45fa-ad0f-26b14834cda3</guid><description>&lt;p&gt;Hey folks,&lt;/p&gt;
&lt;p&gt;&lt;a href="http://marcgrabanski.com/"&gt;Marc Grabanski&lt;/a&gt; just had the great idea of using google to help with the migration of your site to a new domain / url schema. Just get a list of all pages google has indexed from your site and then use that as your basis for checking if your migration worked or not. This is very convenient because you do not have to know all your own urls yourself, and you'll only get the relevant ones (if they are not in google they are unlikely to have traffic).&lt;/p&gt;
&lt;p&gt;So here is some quick code for crawling Google instead of being crawled by them in CakePHP:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; GoogleIndexShell &lt;span class="kw2"&gt;extends&lt;/span&gt; Shell &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt; main&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; App::&lt;span class="me2"&gt;import&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'HttpSocket'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;a href="http://www.php.net/list"&gt;&lt;span class="kw3"&gt;list&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$site&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; = &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;args&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$Socket&lt;/span&gt; = &lt;span class="kw2"&gt;new&lt;/span&gt; HttpSocket&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$links&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$start&lt;/span&gt; = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$num&lt;/span&gt; = &lt;span class="nu0"&gt;100&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;do&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$r&lt;/span&gt; = &lt;span class="re0"&gt;$Socket&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;get&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'http://www.google.com/search'&lt;/span&gt;, &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'hl'&lt;/span&gt; =&amp;gt; &lt;span class="st0"&gt;'en'&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'as_sitesearch'&lt;/span&gt; =&amp;gt; &lt;span class="re0"&gt;$site&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'num'&lt;/span&gt; =&amp;gt; &lt;span class="re0"&gt;$num&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'filter'&lt;/span&gt; =&amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'start'&lt;/span&gt; =&amp;gt; &lt;span class="re0"&gt;$start&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!&lt;a href="http://www.php.net/preg_match_all"&gt;&lt;span class="kw3"&gt;preg_match_all&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'/href=&amp;quot;([^&amp;quot;]+)&amp;quot; class=&amp;quot;?l&amp;quot;?/is'&lt;/span&gt;, &lt;span class="re0"&gt;$r&lt;/span&gt;, &lt;span class="re0"&gt;$matches&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.php.net/die"&gt;&lt;span class="kw3"&gt;die&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;out&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Error: Could not parse google results'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$links&lt;/span&gt; = &lt;a href="http://www.php.net/array_merge"&gt;&lt;span class="kw3"&gt;array_merge&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$links&lt;/span&gt;, &lt;span class="re0"&gt;$matches&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$start&lt;/span&gt; = &lt;span class="re0"&gt;$start&lt;/span&gt; + &lt;span class="re0"&gt;$num&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="kw1"&gt;while&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/count"&gt;&lt;span class="kw3"&gt;count&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$matches&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &amp;gt;= &lt;span class="re0"&gt;$num&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$links&lt;/span&gt; = &lt;a href="http://www.php.net/array_unique"&gt;&lt;span class="kw3"&gt;array_unique&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$links&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;out&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/sprintf"&gt;&lt;span class="kw3"&gt;sprintf&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'-&amp;gt; Found %d links on google:'&lt;/span&gt;, &lt;a href="http://www.php.net/count"&gt;&lt;span class="kw3"&gt;count&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$links&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;hr&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class="me1"&gt;out&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/join"&gt;&lt;span class="kw3"&gt;join&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;&lt;span class="es0"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span class="re0"&gt;$links&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li2"&gt;
&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Usage is as simple as running:&lt;/p&gt;
&lt;pre class="terminal"&gt;./cake google_index debuggable.com&lt;/pre&gt;
&lt;p&gt;Which should produce an output like this:&lt;/p&gt;
&lt;pre class="terminal"&gt;Welcome to CakePHP v1.2.0.7125 beta Console
---------------------------------------------------------------
App : app
Path: /Users/felix/dev/www/php5/debuggable/app
---------------------------------------------------------------
-&gt; Found 293 links on google:
---------------------------------------------------------------
&lt;a href="http://debuggable.com/"&gt;http://debuggable.com/&lt;/a&gt;
&lt;a href="http://debuggable.com/contracting"&gt;http://debuggable.com/contracting&lt;/a&gt;
&lt;a href="http://debuggable.com/contact"&gt;http://debuggable.com/contact&lt;/a&gt;
&lt;a href="http://debuggable.com/workshops"&gt;http://debuggable.com/workshops&lt;/a&gt;
&lt;a href="http://debuggable.com/open-source/fixtures-shell"&gt;http://debuggable.com/open-source/fixtures-shell&lt;/a&gt;
&lt;a href="http://debuggable.com/open-source/google-analytics-api"&gt;http://debuggable.com/open-source/google-analytics-api&lt;/a&gt;
&lt;a href="http://debuggable.com/posts/thinking-what:480f4dd5-5f1c-4d37-99b0-4768cbdd56cb"&gt;http://debuggable.com/posts/thinking-what:480f4dd5-5f1c-4d37-99b0-4768cbdd56cb&lt;/a&gt;
&lt;a href="http://debuggable.com/posts/jquerycamp07:480f4dd6-8d40-44e1-8551-4a58cbdd56cb"&gt;http://debuggable.com/posts/jquerycamp07:480f4dd6-8d40-44e1-8551-4a58cbdd56cb&lt;/a&gt;
...
&lt;/pre&gt;
&lt;p&gt;Oh and if you want to see more shell sample code, also check out our &lt;a href="http://debuggable.com/open-source/fixtures-shell"&gt;FixtureShell&lt;/a&gt; and the &lt;a href="http://debuggable.com/posts/fixturesshell-share-your-test-data:481c6041-392c-4757-85c1-7cc74834cda3"&gt;blog post for it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;-- Felix Geisendörfer aka the_undefined&lt;/p&gt;
&lt;p&gt;PS: Please note that this is a quick hack, and any non-trivial change in the markup google uses will break. This is only meant for temporary usage.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/309021978" height="1" width="1"/&gt;</description><author>felix@debuggable.com</author><pubDate>Tue, 10 Jun 2008 18:07:26 +0000</pubDate><comments>http://www.debuggable.com/posts/crawl-google-they-do-the-same-to-you:484ebdeb-bbe8-45fa-ad0f-26b14834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/crawl-google-they-do-the-same-to-you:484ebdeb-bbe8-45fa-ad0f-26b14834cda3</feedburner:origLink></item><item><title>Better array syntax for PHP: Here's your chance to weigh in</title><link>http://feeds.feedburner.com/~r/debuggable/~3/308193462/better-array-syntax-for-php:484d6517-a700-4af3-a62f-64544834cda3</link><guid isPermaLink="false">http://www.debuggable.com/posts/better-array-syntax-for-php:484d6517-a700-4af3-a62f-64544834cda3</guid><description>&lt;p&gt;Hi folks.&lt;/p&gt;
&lt;p&gt;Recently there's been some discussion on the PHP internals mailing list about providing an alternate array declaration syntax for PHP.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$fields&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span class="kw3"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'id'&lt;/span&gt;, &lt;span class="st0"&gt;'name'&lt;/span&gt;, &lt;span class="st0"&gt;'created'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;it would be possible to do&lt;/p&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;div class="lang_box"&gt;php&lt;/div&gt;
&lt;div class="code debuggable_sh_php" style="white-space: wrap;white-space: nowrap;"&gt;
&lt;ol&gt;
&lt;li class="li1"&gt;
&lt;div class="de1"&gt;&lt;span class="re0"&gt;$fields&lt;/span&gt; = &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'id'&lt;/span&gt;, &lt;span class="st0"&gt;'name'&lt;/span&gt;, &lt;span class="st0"&gt;'created'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Simpler, cleaner and very familiar to anyone who has done development in almost any other modern web language, especially JavaScript.&lt;/p&gt;
&lt;p&gt;Well, there's a patch available, but 2/3 of the active PHP committers (who participated in the vote) voted against its inclusion.  However, of the end-users participating in the discussion, 17 out of 20 voted in favor.  Shortly before the voting was concluded, there was a call for some user-land input, so I decided to &lt;a href="http://news.php.net/php.internals/38120"&gt;humbly submit my two pennies&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
This fact has been pointed out previously, but it bears repeating: the&lt;br /&gt;
divide between users and committers on this issue is stark: only 1/3&lt;br /&gt;
of committers are in favor, but almost all users who have voiced&lt;br /&gt;
opinions on the issue are in favor.  The people actually using the&lt;br /&gt;
language want something new, because in this case something new is&lt;br /&gt;
better.  Come on guys, arrays are our bread and butter.  PHP has more&lt;br /&gt;
support for working with arrays than it does for doing pretty much&lt;br /&gt;
anything else.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I can't imagine I'll be taken very seriously.  I also find it hard to believe that many actual users of PHP would be against this, a fact which is all the more tragic given the rhetoric of the core committers who are against it (a full summary of the discussion can be seen at &lt;a href="http://markmail.org/message/rsi4welftwou24p3"&gt;http://markmail.org/message/rsi4welftwou24p3&lt;/a&gt;, please note that this is not updated in real-time).&lt;/p&gt;
&lt;p&gt;Fortunately PHP, like Cake, is an Open Source project, and even I've been known to implement and support features which I personally don't like or have no use for, if the community support behind the idea is strong enough.  The same goes for PHP, so here's your chance to make your voice heard.  Blog, leave comments, post to the internals list, lobby your local PHP core committer (remember to &lt;em&gt;be nice&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Obviously a feature like this, even though we wouldn't be able to directly take advantage of it anytime soon, would be a great help in pushing all PHP projects, especially ours, forward to the future.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/debuggable/~4/308193462" height="1" width="1"/&gt;</description><author>nate@cakephp.org</author><pubDate>Mon, 09 Jun 2008 17:55:26 +0000</pubDate><comments>http://www.debuggable.com/posts/better-array-syntax-for-php:484d6517-a700-4af3-a62f-64544834cda3</comments><feedburner:origLink>http://www.debuggable.com/posts/better-array-syntax-for-php:484d6517-a700-4af3-a62f-64544834cda3</feedburner:origLink></item><link rel="stylesheet" type="text/css" href="/css/syntax_hilite.css" /><script type="text/javascript">
//<![CDATA[
			$('div.code')
				.each(function(i) {
					var $this = $(this), text = $this.text().substr(1), replace = /\n{2}/i;
					while (replace.test(text)) {
						text = text.replace(replace, '');
					}
					$this.data('plain', $('<pre class="code" />').text(text));
					$this.data('hilited', $this.children('ol'));
				})
				.hover(function() {
					if ($(this).children('ol').length) {
						$(this).data('hilited').replaceWith($(this).data('plain'));
					}
				}, function() {
					if (!$(this).children('ol').length) {
						$(this).data('plain').replaceWith($(this).data('hilited'));
					}
				});
//]]>
</script></channel></rss>
