<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>WebTechNick Blogs</title><link>http://www.webtechnick.com/</link><description>Most recent WebTechNick articles.</description><language>en-us</language><item><title>New Home - All Plugins Upgraded to 2.x</title><link>http://www.webtechnick.com/blogs/view/249/New_Home_All_Plugins_Upgraded_to_2_x</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/249/New_Home_All_Plugins_Upgraded_to_2_x</guid><description>&lt;h1&gt;Has it really been a year?!&lt;/h1&gt;
It's been a long time coming, but I've had some free time recently and have decided to dedicate that time to go through all my old plugins and upgrade them all to CakePHP 2.x if they weren't already.&lt;br /&gt;
&lt;br /&gt;
All of my plugins now have a cakephp1.3 branch (for those still on 1.3) and master as the new CakePHP 2.x compliant branch.  Each tested against the latest CakePHP version (when writing this, CakePHP 2.4.2).&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;New Home For WebTechNick&lt;/h2&gt;
In other news, I've also upgraded my website to the latest CakePHP version as well as change to newer, faster, baddassier servers.  I'm sad to say goodbye to Downtownhost, they were great to me, but I've outgrown what they can offer. I've been slowly migrating all my clients to the new Digital Ocean cloud and last week I've made the dive (pun intended) myself.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;More to come soon.&lt;/h2&gt;
I have a lot of works worth writing about and will hopefully find time soon to post some of the newer and nicer techniques I've picked up as well as a few nice additions to plugins.</description><dc:creator>nick</dc:creator><pubDate>Sat, 02 Nov 2013 05:48:13 -0600</pubDate></item><item><title>CakePHP Icing Plugin -- Versioning</title><link>http://www.webtechnick.com/blogs/view/248/CakePHP_Icing_Plugin_Versioning</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/248/CakePHP_Icing_Plugin_Versioning</guid><description>&lt;span style="font-style:italic;"&gt;Hi all, I've been working on a catch-all CakePHP Plugin for my company with a number of coligues and I think we've developed enough to blog about some of the cooler features it offers.  I'm going to go through them one at a time and post in depth on each one.&lt;/span&gt;
&lt;br /&gt;
The first one I want to talk about is Versioning.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Model Versioning -- The Ability to UNDO&lt;/h1&gt;
&lt;br /&gt;
Have you ever wanted to go back in time with content of a record? Do you have multiple users who can make changes on your data and you'd like a way to track who did what, when and a way to revert to a previous version?  How about being able to snapshot your record and include other model associations in your version of that snapshot?  VersionableBehavior to the rescue!&lt;br /&gt;
&lt;br /&gt;
Attach to any model to creating versions of current state on save for later restoration.&lt;br /&gt;
Uses the AuthComponent to log the user doing the save by default.&lt;br /&gt;
&lt;br /&gt;
The plugin requires a single table icing_versions to be installed in your application. This is the core table that will handle any model's current version data and allow for you to not only go back and time and see what was changed, but who changed it, when, and what other models were affected by the change.  You can also restore from previous version by either knowing the version id, or by simply saying "go back 2 revisions" and the plugin handles the rest.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Install Versionable&lt;/h1&gt;
Run the schema into your database to create icing_versions table. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;cake schema create &lt;span class="re5"&gt;-p&lt;/span&gt; Icing&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
You should see &lt;strong&gt;icing_versions&lt;/strong&gt; in your database&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Usage Examples&lt;/h1&gt;
Bind to model you want to auto-version on save&lt;br /&gt;
Default Settings:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&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="st_h"&gt;'contain'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&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="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//only version the current model&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="st_h"&gt;'versions'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;false&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//unlimited versions&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="st_h"&gt;'minor_timeframe'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;false&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//do not mark for minor versions&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="st_h"&gt;'bind'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;false&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//don't bind versions on find&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;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="re0"&gt;$actsAs&lt;/span&gt; &lt;span class="sy0"&gt;=&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="st_h"&gt;'Icing.Versionable'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//default settings&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="re0"&gt;$actsAs&lt;/span&gt; &lt;span class="sy0"&gt;=&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="st_h"&gt;'Icing.Versionable'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&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; &amp;nbsp; &lt;span class="st_h"&gt;'contain'&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&amp;gt;&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="st_h"&gt;'Hour'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//contains for relative model to be included in the version.&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="st_h"&gt;'versions'&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'5'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;//how many version to save at any given time (false by default unlimited)&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="st_h"&gt;'minor_timeframe'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'10'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;//Mark all previous versions if saved within 10 seconds of current version. &amp;nbsp;Easily cleanup minor_versions&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="st_h"&gt;'bind'&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;true&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;//attach IcingVersion as HasMany relationship for you on find and if contained&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;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Settings Explained&lt;/h2&gt;
&lt;br /&gt;
&lt;strong&gt;contain&lt;/strong&gt; : Containable array of other associated models to also version along with each version.  If your model's snapshot also depends on other tables and models, simply add them to the &lt;strong&gt;contain&lt;/strong&gt; option so it's included in the versioning (and restorable)&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;versions&lt;/strong&gt; : Number of versions to allow on any paticular record (default unlimited).  This is essentially the "undo" limit on your model your versioning.  If it's a rather active record and you have unlimited versions the versions table will eventually get very large and slow, consider using an versions limit that will automatically clean up after itself.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;minor_timeframe&lt;/strong&gt; : Seconds between saves to mark previous as a minor version.  Minor versions are then cleaned off periodically on demand by the user.  The idea is if you make 10 saves within a minute, 9 of those saves are minor versions and really shouldn't be kept as major changes, whereas the last save includes all the changes and is the major version. Default false (minor versions are not kept track of)&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;bind&lt;/strong&gt; : Default False. If true on non-contained retrevals of data on the versioned model, all related versions for each record will also be returned to the user.  This is a dynamic bind.  You can turn this feature off completely and just use it by containing on the model.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'first'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'conditions'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&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; &lt;span class="st_h"&gt;'Model.id'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="re0"&gt;$id&lt;/span&gt;&lt;span class="sy0"&gt;,&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;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st_h"&gt;'contain'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&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; &amp;nbsp; &lt;span class="st_h"&gt;'IcingVersion'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&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="st_h"&gt;'order'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'IcingVersion.created DESC'&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;#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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
The dynamic bind will happen for you automatically, you don't have to define your custom bind on the Model.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Restoring from a version&lt;/h1&gt;
&lt;br /&gt;
Restore version id.&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;restoreVersion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'50537471-ba08-44ae-a606-24e5e017215a'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//restores version id 50537471-ba08-44ae-a606-24e5e017215a&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Restore from a version id and don't create a new version before restoring by passing boolean false in restoreVersion&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;restoreVersion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'50537471-ba08-44ae-a606-24e5e017215a'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw4"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//restores version id 50537471-ba08-44ae-a606-24e5e017215a and won't create a new version before restoring.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h4&gt;Restore by just iterating back in time on a record. No need to remember the version ID.&lt;/h4&gt;
&lt;br /&gt;
Restore second version back from most recent on Model with the record id of 3&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;restoreVersion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//restores the second version back from most recent on Model id 3&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Restore the second version back from the most recent Mode with record id of 3 and don't create a new version before restoring.&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;restoreVersion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw4"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//restores the second version back from most recent on Model id 3 and doesn't create a new version before saving&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Seeing the difference between versions&lt;/h1&gt;
&lt;br /&gt;
You can easily see the difference between two different versions (or the current version HEAD) of the current record at any time.&lt;br /&gt;
&lt;br /&gt;
Get the difference between a specific version and the current state of the record the version is of.&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;diffVersion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'50537471-ba08-44ae-a606-24e5e017215a'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//Gets the diff between version id and the curent state of the record.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Get the difference between two specific versions.&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$result&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;diffVersion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'50537471-ba08-44ae-a606-24e5e017215a'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'501234121-ba08-44ae-a606-2asdf767a'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//Gets the diff between two different versions.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
	&lt;br /&gt;
&lt;h1&gt;Save without creating a version&lt;/h1&gt;
&lt;br /&gt;
You can make a save on your versionable model without creating a new version by passing 'create_version' =&gt; false as an option to the Model save or saveAll options.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Model&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;save&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$data&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'create_version'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;false&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="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Enjoy&lt;/h1&gt;
As always, enjoy and comment!&lt;br /&gt;
</description><dc:creator>nick</dc:creator><pubDate>Thu, 18 Oct 2012 15:14:00 -0600</pubDate></item><item><title>Fixing PHPUnit for CakePHP 2.x testing on Mac OSX</title><link>http://www.webtechnick.com/blogs/view/247/Fixing_PHPUnit_for_CakePHP_2_x_testing_on_Mac_OSX</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/247/Fixing_PHPUnit_for_CakePHP_2_x_testing_on_Mac_OSX</guid><description>I ran into a very peculiar problem when trying to run my CakePHP tests on my mac the other day.  I would go to run my cake test command and it would just exit immediately -- no errors, no output, nothing.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;nwb&lt;span class="sy0"&gt;@&lt;/span&gt;cap:~&lt;span class="sy0"&gt;/&lt;/span&gt;Websites&lt;span class="sy0"&gt;/&lt;/span&gt;HH&lt;span class="sy0"&gt;/&lt;/span&gt;app &#x2192; dev&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;$ cake &lt;span class="kw3"&gt;test&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;#91;&lt;/span&gt;nwb&lt;span class="sy0"&gt;@&lt;/span&gt;cap:~&lt;span class="sy0"&gt;/&lt;/span&gt;Websites&lt;span class="sy0"&gt;/&lt;/span&gt;HH&lt;span class="sy0"&gt;/&lt;/span&gt;app &#x2192; dev&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;$&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Odd, the rest of my shell commands worked perfectly.  I know I had PHPUnit installed via mac ports so what was the deal?&lt;br /&gt;
&lt;br /&gt;
So I started digging into the core with &lt;strong&gt;die()&lt;/strong&gt; commands to narrow down the problem, turnes out it was in the CakeTestSuiteDispatcher class when trying to run the loadTestFramework() function.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//lib/Cake/TestSuite/CakeTestSuiteDispatcher.php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; loadTestFramework&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; &lt;span class="re0"&gt;$found&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$path&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw4"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;;&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="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy0"&gt;@&lt;/span&gt;&lt;span class="kw1"&gt;include&lt;/span&gt; &lt;span class="st_h"&gt;'PHPUnit'&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; DS &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st_h"&gt;'Autoload.php'&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;$found&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw4"&gt;true&lt;/span&gt;&lt;span class="sy0"&gt;;&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;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy0"&gt;!&lt;/span&gt;&lt;span class="re0"&gt;$found&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;foreach&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;App&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;path&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'vendors'&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;$vendor&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; &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_dir"&gt;&lt;span class="kw3"&gt;is_dir&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$vendor&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st_h"&gt;'PHPUnit'&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; &lt;span class="re0"&gt;$path&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$vendor&lt;/span&gt;&lt;span class="sy0"&gt;;&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="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="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="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$path&lt;/span&gt; &lt;span class="sy0"&gt;&amp;amp;amp;&amp;amp;amp;&lt;/span&gt; &lt;a href="http://www.php.net/ini_set"&gt;&lt;span class="kw3"&gt;ini_set&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'include_path'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$path&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; PATH_SEPARATOR &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;a href="http://www.php.net/ini_get"&gt;&lt;span class="kw3"&gt;ini_get&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'include_path'&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;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; &lt;span class="re0"&gt;$found&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw1"&gt;include&lt;/span&gt; &lt;span class="st_h"&gt;'PHPUnit'&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; DS &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st_h"&gt;'Autoload.php'&lt;/span&gt;&lt;span class="sy0"&gt;;&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; &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="kw1"&gt;return&lt;/span&gt; &lt;span class="re0"&gt;$found&lt;/span&gt;&lt;span class="sy0"&gt;;&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;br /&gt;
The issue is on line 141:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy0"&gt;@&lt;/span&gt;&lt;span class="kw1"&gt;include&lt;/span&gt; &lt;span class="st_h"&gt;'PHPUnit'&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; DS &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st_h"&gt;'Autoload.php'&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; &lt;span class="re0"&gt;$found&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw4"&gt;true&lt;/span&gt;&lt;span class="sy0"&gt;;&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;br /&gt;
CakePHP tries to include PHPUnit/Autoload.php which is there, but Autoload.php requires_once() on PHP/CodeCoverage/Filter.php (which wasn't installed).  For some stupid reason CakePHP decided to suppresses this error message, which is just wrong.  I understand they want to also allow you to install PHPUnit in your vendors path, but then update the paths before the include instead of trying it out first and suppressing the error message.  I'd prefer the extra bloat to loading tests than to have it break without any error message.  Suppression doesn't save a fatal_error it just leaves the user guessing as to why nothing happened.&lt;br /&gt;
&lt;br /&gt;
Once I understood the problem the fix was simple, install php5-code-coverage and add the include_path to php.ini&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co4"&gt;$ &lt;/span&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; port &lt;span class="kw2"&gt;install&lt;/span&gt; php5-code-coverage&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;;php.ini &lt;span class="kw2"&gt;file&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;include_path = &lt;span class="st0"&gt;&amp;quot;.:/opt/local/lib/php/&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Stop and start PHP (apache, or fpm) and tried again. I'm back to testing in CakePHP.&lt;br /&gt;
&lt;br /&gt;
Hope that helps someone else,&lt;br /&gt;
Nick</description><dc:creator>nick</dc:creator><pubDate>Sat, 09 Jun 2012 02:47:54 -0600</pubDate></item><item><title>CakePHP CloudFiles Plugin for Rackspace CDN</title><link>http://www.webtechnick.com/blogs/view/246/CakePHP_CloudFiles_Plugin_for_Rackspace_CDN</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/246/CakePHP_CloudFiles_Plugin_for_Rackspace_CDN</guid><description>&lt;span style="font-style:italic;"&gt;Easy interaction, file uploading/downloading/management of Rackspace's CDN service.&lt;/span&gt;
&lt;br /&gt;
&lt;h1&gt;CakePHP, CloudFiles, and You -- The Perfect Threesome&lt;/h1&gt;
I've had the fun task of creating an interface to the popular Rackspace Cloud Files service. If you don't know what that is, its a service that allows you to store unlimited amounts of data remotely and serve them on the fly. You only pay for what storage you use and how much bandwidth you use.  It's extremely affordable and a great way to speed up your application by off-hosting your assets (browsers can only download 2 concurrent assets per domain). To read more about the service visit here: &lt;a href="http://www.rackspace.com/cloud/cloud_hosting_products/files/"&gt;http://www.rackspace.com/cloud/cloud_hosting_products/files/&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
This plugin utilizes the php-cloudfiles class created by Rackspace.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Requirements&lt;/h1&gt;
This plugin required CakePHP 2.x, PHP 5.x, and because it utilizes php-opencloud, any requirements defined by that package &lt;a href="https://github.com/rackspace/php-opencloud"&gt;https://github.com/rackspace/php-opencloud&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Install&lt;/h1&gt;
Now that your sold on the service, You can install this plugin to help jump start your CDN management system.  There are two ways to install the plugin:&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Git Installation&lt;/h2&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;git clone&lt;/span&gt; git:&lt;span class="sy0"&gt;//&lt;/span&gt;github.com&lt;span class="sy0"&gt;/&lt;/span&gt;webtechnick&lt;span class="sy0"&gt;/&lt;/span&gt;CakePHP-CloudFiles-Plugin.git app&lt;span class="sy0"&gt;/&lt;/span&gt;Plugin&lt;span class="sy0"&gt;/&lt;/span&gt;CloudFiles&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw3"&gt;cd&lt;/span&gt; app&lt;span class="sy0"&gt;/&lt;/span&gt;Plugin&lt;span class="sy0"&gt;/&lt;/span&gt;CloudFiles&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;git submodule&lt;/span&gt; init&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;git submodule&lt;/span&gt; update&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Manual Installation&lt;/h2&gt;
Download &lt;a href="https://github.com/webtechnick/CakePHP-CloudFiles-Plugin"&gt;https://github.com/webtechnick/CakePHP-CloudFiles-Plugin&lt;/a&gt; plugin into &lt;span style="font-style:italic;"&gt;app/Plugin/CloudFiles&lt;/span&gt;
Download &lt;a href="https://github.com/rackspace/php-opencloud"&gt;https://github.com/rackspace/php-opencloud&lt;/a&gt; into &lt;span style="font-style:italic;"&gt;app/Plugin/CloudFiles/Vendor/php-opencloud&lt;/span&gt;
&lt;br /&gt;
&lt;h1&gt;Configuration&lt;/h1&gt;
Ensure the plugin is loaded in &lt;span style="font-style:italic;"&gt;app/Config/bootstrap.php&lt;/span&gt; by calling &lt;span style="font-style:italic;"&gt;CakePlugin::load('CloudFiles');&lt;/span&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//app/Config/bootstrap.php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;CakePlugin&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;load&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'CloudFiles'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Create a file &lt;span style="font-style:italic;"&gt;app/Config/cloud_files.php&lt;/span&gt; with the following:&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//app/Config/cloud_files.php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$config&lt;/span&gt; &lt;span class="sy0"&gt;=&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="st_h"&gt;'CloudFiles'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&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; &amp;nbsp; &lt;span class="st_h"&gt;'server'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'US'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//UK&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="st_h"&gt;'username'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'your_username'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//your username&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="st_h"&gt;'api_key'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'API_KEY'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="co1"&gt;//your api key&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="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Example of this configuration file is in &lt;span style="font-style:italic;"&gt;app/Plugin/CloudFiles/Config/cloud_files.php.default&lt;/span&gt;
&lt;br /&gt;
&lt;h1&gt;Usage Examples&lt;/h1&gt;
The majority of the plugin is in a static library called CloudFiles, some of you purists would say "Hey Nick, you're interacting with a remote service, this should be in a datasource!"  And normally I would say you're correct, although a little rude. ;-) However, a datasource is normally coupled with a model and I wanted a simple class to be called statically and preform the REST functions I required.  If I created a datasource I couldn't make it static, and it wasn't as portable as I wanted the class to be.  Plus, in CakePHP 2.x a lot of the core classes are moving to Libraries instead for easy portability across your application -- I'm following the suit.&lt;br /&gt;
&lt;br /&gt;
You must first App::uses the library in whatever file you want near the top.&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;App&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;uses&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'CloudFiles'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'CloudFiles.Lib'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Upload a file to Rackspace&lt;/h2&gt;
Uploads a local file to the specified container in Rackspace&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$cdn_url&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;upload&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'/path/to/image.jpg'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Download a file from Rackspace&lt;/h2&gt;
Download a remote file on Rackspace in a specific container to a local file&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;download&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'image.jpg'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'/local/path/to/image.jpg'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Delete a file from Rackspace&lt;/h2&gt;
Delete a file from a specific container on Rackspace&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;delete&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'image.jpg'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
	&lt;br /&gt;
&lt;h2&gt;List files on Rackspace&lt;/h2&gt;
List files in a specified container on Rackspace&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;App&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;uses&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'CloudFiles'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'CloudFiles.Lib'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co1"&gt;//Get all files in container&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$files&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ls&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;&lt;span class="co1"&gt;//Get files in subfolder&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$files&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ls&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'path'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'pictures/animals'&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;&lt;span class="co1"&gt;//Get files starting with a prefix&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$files&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ls&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'prefix'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'cake'&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;&lt;span class="co1"&gt;//Limit the files returned&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$files&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ls&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'limit'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nu0"&gt;10&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;&lt;span class="co1"&gt;//Limit the files returned, starting at marker&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$files&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ls&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'limit'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st_h"&gt;'marker'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nu0"&gt;30&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Public or Streaming URL of a file on Rackspace&lt;/h2&gt;
Get the URL of an object in Rackspace (streaming or public)&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$url&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;url&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'image.jpg'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$stream&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;stream&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'movie.mov'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
	&lt;br /&gt;
There is also a helper class to assist image and streaming retrieval&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Some Controller&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="re0"&gt;$helpers&lt;/span&gt; &lt;span class="sy0"&gt;=&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="st_h"&gt;'CloudFiles.CloudFiles'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Some View&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw1"&gt;echo&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;CloudFiles&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'image.jpg'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw1"&gt;echo&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;CloudFiles&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;stream&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'movie.mov'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw1"&gt;echo&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;CloudFiles&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;url&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'some_file.txt'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;List containers on Rackspace&lt;/h2&gt;
List all containers on Rackspace&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Get all containers&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$containers&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;listContainers&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="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Limit the containers returned&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$containers&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;listContainers&lt;/span&gt;&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; &lt;span class="st_h"&gt;'limit'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nu0"&gt;2&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Show only public containers&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$containers&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;listContainers&lt;/span&gt;&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; &lt;span class="st_h"&gt;'only_public'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;true&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Create container on Rackspace&lt;/h2&gt;
Created a container on Rackspace, defaults to public container (CDN)&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$Container&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;createContainer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'css'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;&lt;span class="co1"&gt;//Create a non-public container&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$Container&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;createContainer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'no_public'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw4"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;Delete a container on Rackspace&lt;/h2&gt;
&lt;br /&gt;
Delete a container on Rackspace, notice container must be empty.&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;CloudFiles&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;deleteContainer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'container_name'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Enjoy!&lt;/h1&gt;
As always, comments are appreciated. I hope you enjoy the plugin.</description><dc:creator>nick</dc:creator><pubDate>Fri, 30 Mar 2012 02:28:08 -0600</pubDate></item><item><title>Converting Comments to Disqus</title><link>http://www.webtechnick.com/blogs/view/245/Converting_Comments_to_Disqus</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/245/Converting_Comments_to_Disqus</guid><description>Due to all the spam I've archived the current comment system and am starting to use disqus. There are a few good reasons for this.  One, I can now easily monitor and approve comments.  Two, you can subscribe to just the blog comments you want, and you don't have to post to subscribe to the blog comments.  Three, you can actually use your favorite RSS reader to follow the comments.  Finally, we can now rank comments up and down.&lt;br /&gt;
&lt;br /&gt;
Hopefully this will solve the spam problems and add a few extra features as well.  This comments module is actually apart of the WebTechNick plugin package if you're interested in using it yourself.&lt;br /&gt;
&lt;br /&gt;
Enjoy!</description><dc:creator>nick</dc:creator><pubDate>Tue, 31 Jan 2012 22:52:40 -0700</pubDate></item><item><title>CakePHP 2.0 + Nginx + PHP-CGI + phpMyAdmin on Mac OS X 10.7 Lion</title><link>http://www.webtechnick.com/blogs/view/244/CakePHP_2_0_Nginx_PHP_CGI_phpMyAdmin_on_Mac_OS_X_10_7_Lion</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/244/CakePHP_2_0_Nginx_PHP_CGI_phpMyAdmin_on_Mac_OS_X_10_7_Lion</guid><description>&lt;span style="font-style:italic;"&gt;Setup CakePHP 2.0 nginx + php-cgi + mysql + phpmyadmin on OS X Lion&lt;br /&gt;
&lt;br /&gt;
My company just bought me a new macbook and while it shouldn't have taken me as long as it did to setup my development environment for CakePHP, there were a few gotchas that I thought maybe you could learn from my mistake or perhaps correct my wrongs.  So without futher adue, lets jump right in.&lt;/span&gt;
&lt;br /&gt;
&lt;h1&gt;Mac Ports is our friend!&lt;/h1&gt;
&lt;br /&gt;
Coming to mac from Ubuntu, I'm really (read extremely) thankful macports exists. Apple's App Store is nice, but as of now I couldn't find any decent development tools in the app store to easily download and setup.  I'm comfortable with the command line so as soon as I discovered macports I was right at home. &lt;br /&gt;
&lt;br /&gt;
To install macports you'll first need to install xcode from the Apple App Store.  Once you've installed xcode, simply hop over to &lt;a href="http://www.macports.org/install.php"&gt;http://www.macports.org/install.php&lt;/a&gt; to download the latest dmg for lion.&lt;br /&gt;
&lt;br /&gt;
Once you've successfully installed macports you're ready to rock and roll.  I then install nginx, php-cgi, php5, php5-gd, php5-mysql, php5-mcrypt using the command line.&lt;br /&gt;
&lt;br /&gt;
Mac comes with PHP installed already, but instead of trying to get that version to work with everything I instead just used macports to install a clean version of PHP for me to configure to how I like things to run completely separate from the mac's default setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Nginx Install&lt;/h1&gt;
&lt;br /&gt;
Enough foreplay, lets get to it, install nginx first.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; port &lt;span class="kw2"&gt;install&lt;/span&gt; nginx&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Copy working configuration default into its own configuration&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="kw2"&gt;cp&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;opt&lt;span class="sy0"&gt;/&lt;/span&gt;local&lt;span class="sy0"&gt;/&lt;/span&gt;etc&lt;span class="sy0"&gt;/&lt;/span&gt;nginx&lt;span class="sy0"&gt;/&lt;/span&gt;nginx.conf.default &lt;span class="sy0"&gt;/&lt;/span&gt;opt&lt;span class="sy0"&gt;/&lt;/span&gt;local&lt;span class="sy0"&gt;/&lt;/span&gt;etc&lt;span class="sy0"&gt;/&lt;/span&gt;nginx&lt;span class="sy0"&gt;/&lt;/span&gt;nginx.conf&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
If you want to launch nginx on system startup simply run the plist insalled by the port:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; launchctl load &lt;span class="re5"&gt;-w&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;Library&lt;span class="sy0"&gt;/&lt;/span&gt;LaunchDaemons&lt;span class="sy0"&gt;/&lt;/span&gt;org.mackports.nginx.plist&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
TIP: start and stop nginx on demand from the command line, but don't do it yet!  We have to configure it more first.&lt;br /&gt;
Start Nginx on demand:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; nginx&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
Stop Nginx on demand:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; nginx &lt;span class="re5"&gt;-s&lt;/span&gt; stop&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Installing MySQL&lt;/h1&gt;
&lt;strong&gt;EDIT:&lt;/strong&gt; I've gone back and re-installed mysql via macports for easy package management.  Skip to the next section to install that way, or continue reading on how to install MySQL from the official package from dev.mysql.com&lt;br /&gt;
&lt;br /&gt;
I could have gone with macports, and in retrospect, perhaps I should have, but I actually went ahead and installed the official package from dev.mysql.com here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://dev.mysql.com/downloads/mysql/"&gt;http://dev.mysql.com/downloads/mysql/&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
I selected the 64bit arch Mac OS ver 10.6, which works fine under Lion (10.7).  This version comes with a nice little system preferences pane so you can stop and start it directly from your mac system preferences -- slick.  Once you've installed that lets move onto the rest.&lt;br /&gt;
&lt;br /&gt;
The default install of mysql doesn't include a password for your root login, this won't play nice with phpMyAdmin when we finally install it, so go ahead and add a root password by running this command:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; mysqladmin &lt;span class="re5"&gt;-u&lt;/span&gt; root password NEWPASSWORD&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
If you get a mysqladmin command not found, make sure to add /usr/local/mysql/bin  path in your ~/.profile and try again.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co0"&gt;# .profile&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw3"&gt;export&lt;/span&gt; &lt;span class="re2"&gt;PATH&lt;/span&gt;=&lt;span class="sy0"&gt;/&lt;/span&gt;opt&lt;span class="sy0"&gt;/&lt;/span&gt;local&lt;span class="sy0"&gt;/&lt;/span&gt;bin:&lt;span class="sy0"&gt;/&lt;/span&gt;opt&lt;span class="sy0"&gt;/&lt;/span&gt;local&lt;span class="sy0"&gt;/&lt;/span&gt;sbin:&lt;span class="sy0"&gt;/&lt;/span&gt;usr&lt;span class="sy0"&gt;/&lt;/span&gt;local&lt;span class="sy0"&gt;/&lt;/span&gt;mysql&lt;span class="sy0"&gt;/&lt;/span&gt;bin:&lt;span class="re1"&gt;$PATH&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
To reload your profile type:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;. .profile&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Installing MySQL via MacPorts&lt;/h1&gt;
I had a change of heart and decided to install mysql5 via MacPorts to keep it all under one package manager.  If you've already installed MySQL using the package provided by dev.mysql.com then just skip ahead to Installing PHP with PHP-CGI.  Otherwise keep reading.&lt;br /&gt;
&lt;br /&gt;
Install MySQL via macports&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; port &lt;span class="kw2"&gt;install&lt;/span&gt; mysql5-server&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Once complete you'll need to start the mysql daemon and set a root password&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co0"&gt;#start mysql daemon&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; mysqld_safe5 &lt;span class="sy0"&gt;&amp;amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; mysqladmin5 &lt;span class="re5"&gt;-u&lt;/span&gt; root password NEWPASSWORD&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
You will need to start mysql daemon whenever you wish to use it.  I'd sugget making a shell command or an alias in your &lt;span style="font-style:italic;"&gt;~/.profile&lt;/span&gt; file.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co0"&gt;#~/.profile&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw3"&gt;alias&lt;/span&gt; &lt;span class="re2"&gt;mysql&lt;/span&gt;=&lt;span class="st_h"&gt;'/opt/local/bin/mysql5'&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw3"&gt;alias&lt;/span&gt; &lt;span class="re2"&gt;start_mysql&lt;/span&gt;=&lt;span class="st_h"&gt;'sudo mysqld_safe5 &amp;amp;amp;'&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw3"&gt;alias&lt;/span&gt; &lt;span class="re2"&gt;stop_mysql&lt;/span&gt;=&lt;span class="st_h"&gt;'mysqladmin5 --user=root --password=NEWPASSWORD shutdown'&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Now you're all set with MySQL from MacPorts.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Installing PHP with PHP-CGI (FastCGI)&lt;/h1&gt;
&lt;br /&gt;
Like I said before, Lion comes with its own PHP install, but I much prefer to work with the package manager whenever possible, so I'm installing a fresh copy of PHP in /opt/local.  Let's also install php5 with fastcgi (we need for nginx to talk to PHP) along with some of the nicer libraries we want access to for phpMyAdmin and mysql.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; port &lt;span class="kw2"&gt;install&lt;/span&gt; php5 +fastcgi fcgi php5-gd php5-mysql php5-mcrypt&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Starting php-cgi:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;php-cgi &lt;span class="re5"&gt;-q&lt;/span&gt; &lt;span class="re5"&gt;-b&lt;/span&gt; 127.0.0.1:&lt;span class="nu0"&gt;9000&lt;/span&gt; &lt;span class="sy0"&gt;&amp;amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Stopping PHP-CGI:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="kw2"&gt;killall&lt;/span&gt; php-cgi&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
You'll need to start the php-cgi whenever you want nginx to talk to PHP via CGI daemon.  I ended up writting a little bash to start this for me with a simple command and saved it to ~/bin/start_php_cgi.sh&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co0"&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;php-cgi &lt;span class="re5"&gt;-q&lt;/span&gt; &lt;span class="re5"&gt;-b&lt;/span&gt; 127.0.0.1:&lt;span class="nu0"&gt;9000&lt;/span&gt; &lt;span class="sy0"&gt;&amp;amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Configure Nginx&lt;/h1&gt;
&lt;br /&gt;
Open up /opt/local/etc/nginx/nginx.conf in your favorite editor and configure it:&lt;br /&gt;
&lt;br /&gt;
[geshi=code]
#user  nobody;&lt;br /&gt;
worker_processes  1;&lt;br /&gt;
&lt;br /&gt;
error_log  /opt/local/logs/error.log;&lt;br /&gt;
pid        /opt/local/logs/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections  1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    access_log  /opt/local/logs/access.log  main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    #tcp_nopush     on;&lt;br /&gt;
&lt;br /&gt;
    #keepalive_timeout  0;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
    gzip  on;&lt;br /&gt;
&lt;br /&gt;
    server {&lt;br /&gt;
        listen       80;&lt;br /&gt;
        server_name  localhost;&lt;br /&gt;
        root				 /var/www;&lt;br /&gt;
        index  index.html index.htm index.php;&lt;br /&gt;
&lt;br /&gt;
        # redirect server error pages to the static page /50x.html&lt;br /&gt;
        #&lt;br /&gt;
        error_page   500 502 503 504  /50x.html;&lt;br /&gt;
        location = /50x.html {&lt;br /&gt;
            root   /var/www;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
            #root           /var/www;&lt;br /&gt;
            fastcgi_pass   127.0.0.1:9000;&lt;br /&gt;
            fastcgi_index  index.php;&lt;br /&gt;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;&lt;br /&gt;
            include        fastcgi_params;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
This is a basic nginx setup to run with PHP-CGI nicely.  You'll have to add a little more to get it to work nicely with a CakePHP install, but we'll get to that soon enough.  As you can see, I like to root things in /var/www, make sure this directory exists for you&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="kw2"&gt;mkdir&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;var&lt;span class="sy0"&gt;/&lt;/span&gt;www&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Lets write a testfile to see what we've got so far!&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;&amp;amp;lt;?php echo phpinfo(); ?&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;var&lt;span class="sy0"&gt;/&lt;/span&gt;www&lt;span class="sy0"&gt;/&lt;/span&gt;index.php&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Start nginx, php-cgi and then navigate to localhost/index.php to see your hard work in all its glory.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Installing phpMyAdmin&lt;/h1&gt;
&lt;br /&gt;
Grab the latest version of phpMyAdmin from: &lt;a href="http://www.phpmyadmin.net/home_page/downloads.php"&gt;http://www.phpmyadmin.net/home_page/downloads.php&lt;/a&gt; (version 3.4.7 when writing) and unpack it wherever you'd like (I put mine in /opt/local/phpMyAdmin).&lt;br /&gt;
&lt;br /&gt;
Since I like to keep my route in /var/www as my default for nginx, I then created a symlink between where I installed phpMyAdmin and /var/www/phpMyAdmin&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="kw2"&gt;ln&lt;/span&gt; &lt;span class="re5"&gt;-s&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;opt&lt;span class="sy0"&gt;/&lt;/span&gt;local&lt;span class="sy0"&gt;/&lt;/span&gt;phpMyAdmin &lt;span class="sy0"&gt;/&lt;/span&gt;var&lt;span class="sy0"&gt;/&lt;/span&gt;www&lt;span class="sy0"&gt;/&lt;/span&gt;phpMyAdmin&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Now navigate to http://localhost/phpMyAdmin and you should be greeted with a nice phpMyAdmin screen.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Install CakePHP 2.0&lt;/h1&gt;
&lt;br /&gt;
If you've gotten this far, GOOD JOB!  To get to this point it took me nearly an entire day.  We're on the home stretch, just a few more things to get CakePHP 2.0 to bake and work on your new sparkly mac!&lt;br /&gt;
&lt;br /&gt;
Grab the latest version of CakePHP from github, you may first have to install git.  I grabbed a copy from &lt;a href="http://git-scm.com/"&gt;http://git-scm.com&lt;/a&gt; but you could install it using macports if you want.  After you have git up and running run:&lt;br /&gt;
&lt;br /&gt;
[geshi=code]
git clone &lt;a href="https://github.com/cakephp/cakephp.git"&gt;https://github.com/cakephp/cakephp.git&lt;/a&gt; &lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
Once you've cloned the repository note the location where you cloned it and update your .profile with an alias so you can run cake commands from anywhere&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co0"&gt;# .profile&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw3"&gt;alias&lt;/span&gt; &lt;span class="re2"&gt;cake&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;/path/to/cakephp/lib/Cake/Console/cake&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Reload your profile&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;. .profile&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Now lets bake our first app!&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw3"&gt;cd&lt;/span&gt; path&lt;span class="sy0"&gt;/&lt;/span&gt;to&lt;span class="sy0"&gt;/&lt;/span&gt;where&lt;span class="sy0"&gt;/&lt;/span&gt;you&lt;span class="sy0"&gt;/&lt;/span&gt;want&lt;span class="sy0"&gt;/&lt;/span&gt;app&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;cake bake app&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Now you'll need to configure a new nginx virtual host for your cakePHP app. I personally like to create new site files and name them for each virtual site I want to run.  &lt;br /&gt;
&lt;br /&gt;
For this example I would save a site in /opt/local/etc/nginx/testapp.conf with the following:&lt;br /&gt;
[geshi=code]
server {&lt;br /&gt;
	listen          80;&lt;br /&gt;
	server_name     dev.testapp.devlocal;&lt;br /&gt;
	access_log      /var/log/nginx/dev.testapp.devlocal.access.log;&lt;br /&gt;
	error_log       /var/log/nginx/dev.testapp.devlocal.error.log;&lt;br /&gt;
	rewrite_log     on;&lt;br /&gt;
	root            /path/to/cakephp/app/testapp/app/webroot;&lt;br /&gt;
	index           index.php;&lt;br /&gt;
&lt;br /&gt;
	# Not found this on disk?&lt;br /&gt;
	# Feed to CakePHP for further processing!&lt;br /&gt;
	if (!-e $request_filename) {&lt;br /&gt;
		rewrite ^/(.+)$ /index.php?url=$1 last;&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Pass the PHP scripts to FastCGI server&lt;br /&gt;
	# listening on 127.0.0.1:9000&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		fastcgi_pass   127.0.0.1:9000;&lt;br /&gt;
		fastcgi_index  index.php;&lt;br /&gt;
		fastcgi_intercept_errors on; # to support 404s for PHP files no$&lt;br /&gt;
		fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;
		include	fastcgi_params;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Deny access to .htaccess files,&lt;br /&gt;
	# git &amp; svn repositories, etc&lt;br /&gt;
	location ~ /(\.ht|\.git|\.svn) {&lt;br /&gt;
		deny  all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
Then I would add a single line to the nginx.conf file right before the http enclosure&lt;br /&gt;
[geshi=code]
include testapp.conf;&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
Stop and start nginx:&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; nginx &lt;span class="re5"&gt;-s&lt;/span&gt; stop&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;sudo&lt;/span&gt; nginx&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Add your new server_name to your /private/etc/hosts file&lt;br /&gt;
[geshi=code]
127.0.0.1 localhost dev.testapp.devlocal&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
Now navigate to &lt;a href="http://dev.testapp.devlocal/"&gt;http://dev.testapp.devlocal&lt;/a&gt; on your machine and you should see your brand new baked CakePHP 2.0 app!  Congratulations, happy baking!&lt;br /&gt;
&lt;br /&gt;
I hope this tutorial helped, comments are appreciated.</description><dc:creator>nick</dc:creator><pubDate>Mon, 07 Nov 2011 15:34:37 -0700</pubDate></item><item><title>CakePHP 2.0 Facebook Plugin [BETA]</title><link>http://www.webtechnick.com/blogs/view/243/CakePHP_2_0_Facebook_Plugin_BETA</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/243/CakePHP_2_0_Facebook_Plugin_BETA</guid><description>&lt;span style="font-style:italic;"&gt;With the help of stefan-zh &lt;a href="https://github.com/stefan-zh"&gt;https://github.com/stefan-zh&lt;/a&gt; I've released a beta version of the Facebook Plugin for CakePHP 2.0.  This version utilizes the latest version of FacebookSDK and is lightly tested.  It's currently in its own branch.  Once I've updated all my apps to 2.0 and have thoroughly tested this version I will then kick the master branch to its own 1.3 branch and move the cakephp2.0 branch into master.&lt;/span&gt;
&lt;br /&gt;
&lt;h1&gt;Christmas Comes Early&lt;/h1&gt;
&lt;br /&gt;
If you can't wait any longer and you want to help test it out.  Please checkout the cakephp2.0 branch on github.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/webtechnick/CakePHP-Facebook-Plugin/tree/cakephp2.0"&gt;https://github.com/webtechnick/CakePHP-Facebook-Plugin/tree/cakephp2.0&lt;/a&gt; </description><dc:creator>nick</dc:creator><pubDate>Sat, 05 Nov 2011 23:17:05 -0600</pubDate></item><item><title>CakePHP Facebook Plugin -- v3.0 OAuth and Registration</title><link>http://www.webtechnick.com/blogs/view/242/CakePHP_Facebook_Plugin_v3_0_OAuth_and_Registration</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/242/CakePHP_Facebook_Plugin_v3_0_OAuth_and_Registration</guid><description>&lt;h1&gt;UPDATE 3&lt;/h1&gt;
&lt;br /&gt;
This update is now complete, all changes have been merged into master and you should update your plugins accordingly.  The newest version is v3.1.1.   Thank you all for your patience and continued support of the plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;UPDATE 2&lt;/h1&gt;
I've forced the master branch of the plugin to be version v2.5.0 (the stable version).  You can simply checkout the plugin normally to see the currently stable and functional version v2.5.0.  All the 3.0 changes have been merged into a new branch called php_sdk_3.  I will be updating and testing this branch and will not release it back to master until all features are working 100%.  I will keep you updated as I make progress.&lt;br /&gt;
&lt;br /&gt;
For now, simply checkout the master version of the plugin for the latest stable release.&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;$ &lt;span class="kw3"&gt;cd&lt;/span&gt; path&lt;span class="sy0"&gt;/&lt;/span&gt;to&lt;span class="sy0"&gt;/&lt;/span&gt;plugin&lt;span class="sy0"&gt;/&lt;/span&gt;repository&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;$ &lt;span class="kw2"&gt;git checkout&lt;/span&gt; master&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Thanks,&lt;br /&gt;
Nick&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;UPDATE&lt;/h1&gt;
It appears I've jumped the gun a bit on the upgrade to v3.0. Looks like the good folks at Facebook still haven't linked up the fbxml and the PHP SDK entirely, leaving some features to partially work and others to be flat out broken.  Until these issue are resolved please use the v2.5.0 version of the plugin.&lt;br /&gt;
&lt;br /&gt;
For the time being please use the tagged version v2.5.0 of the plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;$ &lt;span class="kw3"&gt;cd&lt;/span&gt; path&lt;span class="sy0"&gt;/&lt;/span&gt;to&lt;span class="sy0"&gt;/&lt;/span&gt;plugin&lt;span class="sy0"&gt;/&lt;/span&gt;repository&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;$ &lt;span class="kw2"&gt;git checkout&lt;/span&gt; v2.5.0&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Or you can simply download it directly from here:&lt;br /&gt;
&lt;a href="https://github.com/webtechnick/CakePHP-Facebook-Plugin/zipball/v2.5.0"&gt;https://github.com/webtechnick/CakePHP-Facebook-Plugin/zipball/v2.5.0&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
I will be keeping a close eye on this and be update this blog post as well as the plugin as soon as I iron out all the issues the upgrade to 3.0 has caused.&lt;br /&gt;
&lt;br /&gt;
Thanks for your understanding.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Original Post...&lt;/h1&gt;
&lt;br /&gt;
Two blog posts in one week! You're in for a special treat!  Facebook finally updated their PHP SDK v3 to talk to their Javascript SDK which was holding the plugin back from updating along with the Facebook OAuth system.  Now that Facebook has updated their PHP SDK, The plugin has been updated accordingly.  &lt;strong&gt;By updated your plugin you won't be affected by the October 1st OAuth only deadline.&lt;/strong&gt;  Please update your plugin to be sure your app wont be locked out on October 1st 2011.&lt;br /&gt;
&lt;br /&gt;
In addition to utilizing OAuth, there are two new features in version 3.0.&lt;br /&gt;
&lt;br /&gt;
1) Send Button -- easily send the current page to a friend via email&lt;br /&gt;
&lt;br /&gt;
2) Facebook Pre Populated Registration forms.&lt;br /&gt;
&lt;br /&gt;
So without further adieu, lets get into it.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Send Button&lt;/h1&gt;
Send buttons are new social media plugins to easily share a page via email (no facebook credentials required).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Show a send button default to current page.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Facebook&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;sendButton&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="sy0"&gt;;&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;&lt;span class="co1"&gt;//Show a send button to a custom page&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;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Facebook&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;sendButton&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'http://www.webtechnick.com'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;&lt;span class="co1"&gt;//Show a send button with custom options&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Facebook&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;sendButton&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'http://www.webtechnick.com'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'colorscheme'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'dark'&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Facebook Registration&lt;/h1&gt;
New social media registration plugin allows a user to fill out a registration form auto-populated by their information in their Facebook profile.  The setup is simple. Use the FacebookHelper::registration() to show the registration form in an iframe.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Show registration form with default fields&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Facebook&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;registration&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="sy0"&gt;;&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;&lt;span class="co1"&gt;//Show registration form with custom fields and width&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;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Facebook&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;registration&lt;/span&gt;&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="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span class="st_h"&gt;'fields'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'name,email,location,gender,favorite_team'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span class="st_h"&gt;'width'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'500'&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
By default, once the user clicks "Register" the post is sent back to the same page the registration form was shown on.  In your controller action simply check for registrationData and do with the data what you will (create/update a user etc...)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;function&lt;/span&gt; registration&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; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$user&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Connect&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;registrationData&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; &lt;span class="co1"&gt;//We have a registered user, look at it and do something with it.&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/print_r"&gt;&lt;span class="kw3"&gt;print_r&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$user&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&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;br /&gt;
You can change where you want the user to post to by setting 'redirect-uri' in the registration helper method.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//Show registration form with custom url&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;Facebook&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;registration&lt;/span&gt;&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; &lt;span class="st_h"&gt;'redirect-uri'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'http://www.example.com/facebook_registration'&lt;/span&gt;&lt;span class="sy0"&gt;,&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;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Hope you enjoy!  As always, donations are appreciated.</description><dc:creator>nick</dc:creator><pubDate>Mon, 15 Aug 2011 12:40:07 -0600</pubDate></item><item><title>CakePHP Database Logger Plugin</title><link>http://www.webtechnick.com/blogs/view/241/CakePHP_Database_Logger_Plugin</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/241/CakePHP_Database_Logger_Plugin</guid><description>It's been a while since I've posted, I've been doing a lot of work on various fun projects and just haven't had the time to formally post about all the cool things I've been doing.   I figured with a new plugin deserves a new blog post.  So, here I am -- lets talk log files and how they suck.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Log files.. more like lame files&lt;/h1&gt;
Log files can be handy, they can serve as a barometer for how well your app is operating, and give you some clue as to how your users are using your app (or more importantly -- breaking your app).  The default CakeLog settings writes log entries to a file in your &lt;span style="font-style:italic;"&gt;/tmp/logs/&lt;/span&gt; directory under the type of log you're specifying. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;CakeLog&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;write&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'error'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'This will be a new entry in the /tmp/logs/error.log file'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;br /&gt;
Will write to &lt;span style="font-style:italic;"&gt;/tmp/logs/error.log&lt;/span&gt;
&lt;br /&gt;
This is all well and good if you're running your application on a single server, and you're a masochist who likes to copy over large log files, and open them up in an editor to actually search through it.  &lt;br /&gt;
&lt;br /&gt;
However, even though I'm a web developer, I'm not a masochist -- despite popular opinion.  So I've developed a super simple plugin to take all those handy dandy log messages scattered around an application and save them to a database logs table instead.  The benefit of this strategy is three fold.&lt;br /&gt;
&lt;br /&gt;
1) Scale-ability -- as you add more app servers to handle traffic you're logs will still all be consolidated in one place.&lt;br /&gt;
&lt;br /&gt;
2) Easier searches, with the built in admin interface searching through logs can be done directly in the app.&lt;br /&gt;
&lt;br /&gt;
3) Free extra information with each log entry.  With each log entry the requesting url, hostname, ip, and referrer is automatically logged along side it.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Setup&lt;/h1&gt;
Setup is simple.  Like any other plugin you'll need to clone the repository into your &lt;span style="font-style:italic;"&gt;&lt;strong&gt;app/plugins/database_logger&lt;/strong&gt;&lt;/span&gt; directory, and run the schema into the database to create the required logs table.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="bash"&gt;&lt;ol class="bash"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co0"&gt;# clone plugin&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;git clone&lt;/span&gt; git:&lt;span class="sy0"&gt;//&lt;/span&gt;github.com&lt;span class="sy0"&gt;/&lt;/span&gt;webtechnick&lt;span class="sy0"&gt;/&lt;/span&gt;CakePHP-DatabaseLogger-Plugin.git app&lt;span class="sy0"&gt;/&lt;/span&gt;plugins&lt;span class="sy0"&gt;/&lt;/span&gt;database_logger&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="co0"&gt;# run schema into database to create logs table.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;cake schema create database_logger &lt;span class="re5"&gt;-plugin&lt;/span&gt; database_logger&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Next, you'll need to add two lines to your &lt;span style="font-style:italic;"&gt;&lt;strong&gt;app/config/bootstrap.php&lt;/strong&gt;&lt;/span&gt; file to configure your CakeLog to log to the new database logger instead of the default FileLog.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//app/config/bootstrap.php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;App&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;import&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'Core'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'CakeLog'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li1"&gt;&lt;div class="de1"&gt;CakeLog&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;config&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'default'&lt;/span&gt;&lt;span class="sy0"&gt;,&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="st_h"&gt;'engine'&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="st_h"&gt;'DatabaseLogger.DatabaseLogger'&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="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h1&gt;Usage&lt;/h1&gt;
Anywhere in your app where you call $this-&gt;log() or CakeLog::write the database logger will be used.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code" lang="php"&gt;&lt;ol class="php"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;a href="http://www.php.net/log"&gt;&lt;span class="kw3"&gt;log&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'This is a detailed message logged to the database'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st_h"&gt;'error'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class="li2"&gt;&lt;div class="de2"&gt;CakeLog&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;write&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'error'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'This is a detailed message logged to the database'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;br /&gt;
Navigate to &lt;a href="http://www.example.com/admin/database_logger/logs"&gt;http://www.example.com/admin/database_logger/logs&lt;/a&gt; to view/search/delete your logs.&lt;br /&gt;
&lt;br /&gt;
Enjoy!</description><dc:creator>nick</dc:creator><pubDate>Sat, 13 Aug 2011 15:02:45 -0600</pubDate></item><item><title>CakePHP Facebook Screencast</title><link>http://www.webtechnick.com/blogs/view/240/CakePHP_Facebook_Screencast</link><guid isPermaLink="true">http://www.webtechnick.com/blogs/view/240/CakePHP_Facebook_Screencast</guid><description>I've recently made and submitted a screencast to &lt;a href="http://tv.cakephp.org/"&gt;http://tv.cakephp.org&lt;/a&gt; on how to integrate Facebook into your CakePHP application.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="center"&gt;&lt;a href="http://tv.cakephp.org/video/webtechnick/2011/01/12/nick_baker_--_facebook_integration_with_cakephp"&gt;&lt;img src="/img/screencast.jpg" alt="Facebook Integration with CakePHP Screencast" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href="http://tv.cakephp.org/video/webtechnick/2011/01/12/nick_baker_--_facebook_integration_with_cakephp"&gt;http://tv.cakephp.org/video/webtechnick/2011/01/12/nick_baker_--_facebook_integration_with_cakephp&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Integrating Facebook into your CakePHP application. Complete step by step from bake, Facebook application creation, Facebook configuration, to Facebook Connect. Learn how to easily add comments to any page and allow your users to register with their Facebook credentials.&lt;br /&gt;
&lt;br /&gt;
If you like the screencast I encourage you to post a comment and/or thumbs up.</description><dc:creator>nick</dc:creator><pubDate>Thu, 13 Jan 2011 14:47:41 -0700</pubDate></item></channel></rss>