<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.log2e.com &#187; Cairngorm</title>
	<atom:link href="http://blog.log2e.com/tag/cairngorm/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.log2e.com</link>
	<description>Tutorials and Code Snippets</description>
	<lastBuildDate>Mon, 01 Jun 2009 13:05:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Getting Started with the PureMVC Startup Manager &#8211; Part 1</title>
		<link>http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/</link>
		<comments>http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/#comments</comments>
		<pubDate>Fri, 16 May 2008 14:04:50 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashDevelop]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PureMVC]]></category>
		<category><![CDATA[Cairngorm]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=19</guid>
		<description><![CDATA[Coming from a Flex/Cairngorm background, I&#8217;ve always missed a utility that takes care of the asynchronous loading of resources during application startup. Being too lazy to write one myself, I usually chain together several Cairngorm commands for loading configuration settings, stylesheets, language resources and initial data from a database. Each command is only executed if [...]]]></description>
			<content:encoded><![CDATA[<p>Coming from a Flex/Cairngorm background, I&#8217;ve always missed a utility that takes care of the asynchronous loading of resources during application startup. Being too lazy to write one myself, I usually chain together several Cairngorm commands for loading configuration settings, stylesheets, language resources and initial data from a database. Each command is only executed if the predecessor task has been finished successfully. The user interface isn&#8217;t initialized until the whole chain is completed, otherwise an error message is generated and the application won&#8217;t start. It&#8217;s not elegant but it works.</p>
<p>When I started to learn <a title="PureMVC" onclick="pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/edit.php');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.puremvc.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');" href="http://www.puremvc.org/" target="_blank">PureMVC</a> (and I&#8217;m still learning), I was happy to discover that the AS3 version is accompanied by a <a title="PureMVC Startup Manager" onclick="pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');" href="http://trac.puremvc.org/Utility_AS3_StartupManager" target="_blank">Startup Manager</a>. This utility isn&#8217;t part of the core PureMVC framework and has to be downloaded and installed separately, but it nicely integrates with the &#8220;PureMVC way of things&#8221;.<br />
<span id="more-19"></span><br />
There&#8217;s a very well-documented sample project (<a title="Startup as Ordered" onclick="pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19');" href="http://trac.puremvc.org/Demo_AS3_Flex_StartupAsOrdered" target="_blank">Startup as Ordered</a>) from the author of the utility, Philip Sexton. After exploring the source code of this project, I thought I give it a try and set up my own little startup sequence. Philip&#8217;s sample just simulates the asynchronous loading with the help of another utility he wrote (<a title="Asynchronous Stub" onclick="pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_AsyncStub?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19');" href="http://trac.puremvc.org/Utility_AS3_AsyncStub" target="_blank">Asynchronous Stub</a>), so I decided to take a more real-world scenario where an external stylesheet and an XML file are loaded before the user interface is created. Once you have understood the basic setup, it&#8217;s no big deal to extend the startup sequence by, for example, making asynchronous calls to remote services.</p>
<h3>Preparing the Project Space</h3>
<p>Loading a stylesheet and some initial data is a common task in both Flash and Flex projects. So my approach in this tutorial is to set up a pure AS3 project that can easily be adjusted to work in both worlds. This also means that you can use whatever IDE you prefer for ActionScript coding. I&#8217;m using <a title="FlashDevelop" onclick="pageTracker._trackPageview('/outgoing/www.flashdevelop.org/?referer=');pageTracker._trackPageview('/outgoing/www.flashdevelop.org/?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/www.flashdevelop.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.flashdevelop.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/www.flashdevelop.org/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');" href="http://www.flashdevelop.org/" target="_blank">FlashDevelop</a> along with the Flex 3 SDK but the project space would look very similar in FlexBuilder.</p>
<p>If you haven&#8217;t already done so, download the <a title="PureMVC Download Page" onclick="pageTracker._trackPageview('/outgoing/trac.puremvc.org/PureMVC_AS3/wiki/Downloads?referer=');pageTracker._trackPageview('/outgoing/trac.puremvc.org/PureMVC_AS3/wiki/Downloads?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/trac.puremvc.org/PureMVC_AS3/wiki/Downloads?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/PureMVC_AS3/wiki/Downloads?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');" href="http://trac.puremvc.org/PureMVC_AS3/wiki/Downloads" target="_blank">PureMVC framework</a> and the <a title="Startup Manager Download Page" onclick="pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager/wiki/Downloads?referer=');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager/wiki/Downloads?referer=http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager/wiki/Downloads?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');pageTracker._trackPageview('/outgoing/trac.puremvc.org/Utility_AS3_StartupManager/wiki/Downloads?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=19&amp;message=4');" href="http://trac.puremvc.org/Utility_AS3_StartupManager/wiki/Downloads" target="_blank">Startup Manager</a>. Make sure that both libraries are available to your project. Either copy the SWC files in your project space or add their locations to the classpath. On the top level, your project should contain the three folders <em>bin</em>, <em>lib</em> and <em>src</em>. For my purposes, I placed copies of the SWC files in the <em>lib</em> folder so that I can provide a working FlashDevelop project for download that includes all resources.</p>
<p>Choose a package name (I&#8217;m going to use <em>com.log2e.puremvcdemo</em>) and create the usual <em>model</em>, <em>view</em>, <em>controller</em> folders.  Also, in addtion to your document class (<em>Main.as</em>) create an empty file with the name <em>ApplicationFacade.as</em> in the <em>puremvcdemo</em> folder. You project panel should look similar to this now:</p>
<p><img style="border: 0pt none; margin: 0px;" src="http://blog.log2e.com/wp-content/uploads/2008/05/startup_manager_project_space_1.gif" alt="Project Panel" width="426" height="292" /></p>
<h3>The Resource Files: <em>styles.css</em> and <em>data.xml</em></h3>
<p>Inside the <em>bin</em> folder create two text files with the names <em>styles.css</em> and <em>data.xml</em>. These are the resources that we will be loading during startup. The stylesheet is pretty simple:</p>
<div class="geshi no css">
<ol>
<li class="li1">
<div class="de1"><span class="re1">.title</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-size<span class="re2">:<span class="re3">16px</span></span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-family<span class="re2">:Arial</span>,Helvetica,<span class="kw2">sans-serif</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-weight<span class="re2">:bold</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">color</span><span class="sy0">:</span><span class="re0">#<span class="nu0">990000</span></span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">.label</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-size<span class="re2">:<span class="re3">14px</span></span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-family<span class="re2">:Arial</span>,Helvetica,<span class="kw2">sans-serif</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-weight<span class="re2">:bold</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">color</span><span class="sy0">:</span><span class="re0">#<span class="nu0">999999</span></span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">p <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-size<span class="re2">:<span class="re3">12px</span></span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;font-family<span class="re2">:Arial</span>,Helvetica,<span class="kw2">sans-serif</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">color</span><span class="sy0">:</span><span class="re0">#<span class="nu0">333333</span></span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The XML file contains some sample content:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;site<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Welcome to the PureMVC Startup Manager Demo!<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;sections<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;section</span> <span class="re0">id</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">label</span>=<span class="st0">&quot;Home&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;content<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&lt;![CDATA[&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque consequat. Nam ut leo &lt;i&gt;vitae metus vehicula&lt;/i&gt; posuere. Nullam nunc. Vivamus nec ligula vel tortor molestie elementum. Integer faucibus elementum dolor. Nulla lorem. Quisque varius sodales mi. Nam tincidunt pede. Nam scelerisque nulla a nisl.&lt;/p&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&lt;p&gt;Vivamus nec ligula vel tortor molestie elementum. Nam ut leo vitae metus vehicula posuere. Nullam nunc. Vivamus nec ligula vel &lt;b&gt;tortor molestie elementum&lt;/b&gt;. Integer faucibus elementum dolor. Nulla lorem. Quisque varius sodales mi. Nam tincidunt pede. Nam scelerisque nulla a nisl. Quisque consequat.&lt;/p&gt;]]&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/content<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/section<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/sections<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/site<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Important note: Make sure that the HTML-coded content inside the CDATA block is only composed of HTML tags that can be interpreted by HTML-enabled textfields in Flash/Flex.</p>
<p>In the <a title="Part 2" href="http://blog.log2e.com/2008/05/17/getting-started-with-the-puremvc-startup-manager-part-2/" target="_self">next part</a> of this tutorial we will be taking a closer look at the inner working of the Startup Manager.</p>
<hr />
<em>You can download the sample files <a href="http://blog.log2e.com/wp-content/uploads/2008/05/puremvc_startup_manager_demo.zip">from here</a> (the ZIP archive includes a FlashDevelop project file). If you want to comment on this tutorial please post in the comments section at the end of the <a href="http://blog.log2e.com/2008/05/19/getting-started-with-the-puremvc-startup-manager-introduction/" target="_self">introductory post</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/05/16/getting-started-with-the-puremvc-startup-manager-part-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Using AMFPHP with ADOdb</title>
		<link>http://blog.log2e.com/2008/05/05/using-amfphp-with-adodb/</link>
		<comments>http://blog.log2e.com/2008/05/05/using-amfphp-with-adodb/#comments</comments>
		<pubDate>Mon, 05 May 2008 11:15:09 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[ADOdb]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Remoting]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=1</guid>
		<description><![CDATA[Very often you want to add functionality from a PHP library to your AMFPHP service classes. This short tutorial shows the use of ADOdb as database abstraction layer and may be especially helpful for beginners with AMFPHP. ADOdb is a widely used database abstraction library that supports a lot of databases. If you want to [...]]]></description>
			<content:encoded><![CDATA[<p>Very often you want to add functionality from a PHP library to your <a title="AMFPHP" href="http://www.amfphp.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.amfphp.org?referer=');">AMFPHP</a> service classes. This short tutorial shows the use of <a title="ADOdb" href="http://adodb.sourceforge.net/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/adodb.sourceforge.net/?referer=');">ADOdb</a> as database abstraction layer and may be especially helpful for beginners with AMFPHP.<br />
<span id="more-1"></span><br />
ADOdb is a widely used database abstraction library that supports a lot of databases. If you want to add cross-database support to your Flex application, ADOdb is an excellent choice. But even if you only use MySQL as your bread-and-butter database, ADOdb will greatly help you to simplify your database operations.</p>
<h3>Folder Structure</h3>
<p>First, let&#8217;s take a look at the folder structure on the server. I usually organize my server directories like this:</p>
<p><img style="border: 0pt none; margin: 0px;" src="http://blog.log2e.com/wp-content/uploads/2008/05/amfphp_include_folder.gif" alt="" width="240" height="110" /></p>
<p>There is an <em>includes</em> folder on the same level as the <em>amfphp</em> installation folder. The <em>includes</em> folder contains other folders, one for each PHP library (in this case <a title="ADOdb" href="http://adodb.sourceforge.net/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/adodb.sourceforge.net/?referer=');">ADOdb</a>, <a title="PHPMailer" href="http://phpmailer.codeworxtech.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/phpmailer.codeworxtech.com/?referer=');">PHPMailer</a> and <a title="TCPDF" href="http://www.tcpdf.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.tcpdf.com?referer=');">TCPDF</a>). Download the ADOdb library <a title="Download ADOdb" href="http://adodb.sourceforge.net/#download" target="_blank" onclick="pageTracker._trackPageview('/outgoing/adodb.sourceforge.net/_download?referer=');">from here</a> and upload the files to the <em>includes/adodb</em> folder.</p>
<h3>globals.php</h3>
<p>It is recommended that you add globally used variables to AMFPHP&#8217;s <em>globals.php</em> file. Since most of your service classes probably need access to the database this file is the best place for configuring your database settings and the path to your external PHP libraries. So let&#8217;s add these lines to the <em>globals.php</em> file:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;DB_HOST&#39;</span><span class="sy0">,</span> <span class="st0">&#39;localhost&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;DB_USER&#39;</span><span class="sy0">,</span> <span class="st0">&#39;dbuser&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;DB_PASSWORD&#39;</span><span class="sy0">,</span> <span class="st0">&#39;dbpassword&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;DB_NAME&#39;</span><span class="sy0">,</span> <span class="st0">&#39;dbname&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;INCLUDES_PATH&#39;</span><span class="sy0">,</span> <span class="st0">&#39;/base/server/path/includes/&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Of course, you have to adjust the database and path settings to your needs. The <code>INCLUDES_PATH</code> constant should hold the absolute path to your <em>includes</em> directory on the server.</p>
<h3>Sample Classes</h3>
<p>Let&#8217;s say you have a MySQL database that holds a table with product data. For the sake of simplicity, we assume that there are only two fields in this table, <em>product_id</em> and <em>product_name</em>. </p>
<p>If you use the <a title="Cairngorm" href="http://labs.adobe.com/wiki/index.php/Cairngorm" target="_blank" onclick="pageTracker._trackPageview('/outgoing/labs.adobe.com/wiki/index.php/Cairngorm?referer=');">Cairngorm</a> framework for your Flex application you are familiar with the concept of Value Objects (VOs). Instead of using XML or simple arrays, VOs allow for sending back and forth typed objects between Flex and AMFPHP. We define a simple ProductVO class and place the <em>ProductVO.php</em> file in AMFPHP&#8217;s <em>services</em> folder.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ProductVO</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> <span class="re1">$_explicitType</span> <span class="sy0">=</span> <span class="st0">&#39;ProductVO&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> <span class="re1">$productId</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> <span class="re1">$productName</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Now we add a service class (<em>ProductsService.php</em>) to the <em>services</em> folder. The <em>ProductsService.php</em> file includes the ProductVO class and the ADOdb library. The constructor establishes the database connection (for the syntax take a look at the ADOdb documentation), and the <code>getProducts()</code> mehod retrieves all products from the database, wraps them into ProductVO objects and sends them back to your Flex application.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span>INCLUDES_PATH<span class="sy0">.</span><span class="st0">&#39;adodb/adodb.inc.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&#39;ProductVO.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ProductsService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> <span class="re1">$db</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; * Constructor</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">function</span> ProductsService<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">db</span> <span class="sy0">=</span> NewADOConnection<span class="br0">&#40;</span><span class="st0">&#39;mysql&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">db</span><span class="sy0">-&gt;</span><span class="me1">Connect</span><span class="br0">&#40;</span>DB_HOST<span class="sy0">,</span> DB_USER<span class="sy0">,</span> DB_PASSWORD<span class="sy0">,</span> DB_NAME<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">db</span><span class="br0">&#41;</span> <span class="kw3">die</span><span class="br0">&#40;</span><span class="st0">&#39;Connection failed&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">db</span><span class="sy0">-&gt;</span><span class="me1">SetFetchMode</span><span class="br0">&#40;</span>ADODB_FETCH_ASSOC<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; * This method retrieves all products from the database</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">function</span> getProducts<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$products</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$sql</span> <span class="sy0">=</span> <span class="st0">&#39;SELECT product_id, product_name FROM products&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">db</span><span class="sy0">-&gt;</span><span class="me1">Execute</span><span class="br0">&#40;</span><span class="re1">$sql</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$result</span><span class="sy0">-&gt;</span><span class="me1">EOF</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$productVO</span> <span class="sy0">=</span> <span class="kw2">new</span> ProductVO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$productVO</span><span class="sy0">-&gt;</span><span class="me1">productId</span> <span class="sy0">=</span> <span class="re1">$result</span><span class="sy0">-&gt;</span><span class="me1">fields</span><span class="br0">&#91;</span><span class="st0">&#39;product_id&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$productVO</span><span class="sy0">-&gt;</span><span class="me1">productName</span> <span class="sy0">=</span> <span class="re1">$result</span><span class="sy0">-&gt;</span><span class="me1">fields</span><span class="br0">&#91;</span><span class="st0">&#39;product_name&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array_push</span><span class="br0">&#40;</span><span class="re1">$products</span><span class="sy0">,</span> <span class="re1">$productVO</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$result</span><span class="sy0">-&gt;</span><span class="me1">MoveNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$products</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>In a similar way you can add other PHP libraries to your AMFPHP classes (like the above mentioned PHPMailer and TCPDF libraries). I hope this example helps you to utilize the power of some of the most popular PHP libraries for your Flex applications. If you have suggestions or requests please comment or get in touch with me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/05/05/using-amfphp-with-adodb/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
