<?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; PHP</title>
	<atom:link href="http://blog.log2e.com/tag/php/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>Creating a Custom Resource Plugin in Zend Framework 1.8</title>
		<link>http://blog.log2e.com/2009/06/01/creating-a-custom-resource-plugin-in-zend-framework-18/</link>
		<comments>http://blog.log2e.com/2009/06/01/creating-a-custom-resource-plugin-in-zend-framework-18/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 13:05:31 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=245</guid>
		<description><![CDATA[Version 1.8 of the Zend Framework introduced a whole new concept of bootstrapping an application. The core functionality is contained in the Zend_Application component which supports a strictly object-oriented approach to bootstrapping. Although the new concept is fairly straightforward, it does take a little time to get used to it if you are used to the [...]]]></description>
			<content:encoded><![CDATA[<p>Version 1.8 of the Zend Framework introduced a whole new concept of bootstrapping an application. The core functionality is contained in the <code>Zend_Application</code> component which supports a strictly object-oriented approach to bootstrapping. Although the new concept is fairly straightforward, it does take a little time to get used to it if you are used to the bootstrapping process in earlier versions of ZF. </p>
<p>One of the many interesting features of <code>Zend_Application</code> is the ability to push resources into resource plugin classes which can be utilized simply via configuration. In this tutorial we will be looking at creating a custom resource plugin. The plugin is quite simple, it creates a &#8220;value object&#8221; with the name, author and version of the application, and stores it in the Zend registry.<br />
<span id="more-245"></span></p>
<h3>Standard Resource Plugins</h3>
<p>Version 1.8 ships with a set of standard resource plugins that can be found in the <em>library/Zend/Application/Resource</em> folder:</p>
<p><img class="size-full wp-image-252" title="zend_standard_resource_plugins" src="http://blog.log2e.com/wp-content/uploads/2009/05/zend_standard_resource_plugins.gif" alt="Zend Standard Resource Plugins" width="272" height="428" /></p>
<p>It&#8217;s worthwhile to take a look at the source code of these classes. The use of the available resource plugins <a title="Available Resource Plugins" href="http://zendframework.com/manual/en/zend.application.available-resources.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/zendframework.com/manual/en/zend.application.available-resources.html?referer=');">is described in the Reference Guide</a>. The idea behind the resource plugins is to encapsulate common bootstrapping tasks like setting up a default database adapter, configuring the view, etc. </p>
<p>What makes the resource plugins etremely useful is the fact that the Zend Framework automatically initializes the plugins according to the options set in the application&#8217;s configuration file. You only have to make sure that you provide the proper combination of keys in the configuration file. The first key has to be &#8220;resources&#8221;, the second key has to be the name of the resource plugin, and any further keys should reflect the names of the required options. This way you can even add new resources without needing to touch the bootstrap class itself. (We will look at a sample configuration file shortly.)</p>
<h3>The <i>AppInfo</i> Resource Plugin</h3>
<p>The need to display the application name, version number or author name in different places of the UI (including the browser title) is quite common. There are several ways of doing this in ZF, but for the purpose of this tutorial we will be using a resource plugin which makes it easy to re-use this functionality between applications. Our sample <code>Appinfo</code> resource plugin works very similar to the <code>Locale</code> and <code>Translate</code> plugins. It collects information from the configuration file, instantiates an object and stores it in the Zend registry so that the information later can be retrieved from anywhere in the application.</p>
<p>Let&#8217;s take a look at the folder structure and the configuration file first:</p>
<p><img src="http://blog.log2e.com/wp-content/uploads/2009/05/zend_resource_plugin_setup.gif" alt="Zend Resource Plugin Setup" title="zend_resource_plugin_setup" width="240" height="179" class="size-full wp-image-244" /></p>
<p>Please note the different upper and lower case writing (<i>Appinfo</i> vs. <i>AppInfo</i>) which is due to ZF naming conventions. </p>
<p>In order to make this all work we need to provide some settings in the configuration file. Here&#8217;s an excerpt from the <i>application.ini</i> inside the <i>application/configs</i> folder (the project setup follows the default folder structure as it is created by <code>Zend_Tool_Project</code>).</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co2"># Plugin Paths</span></div>
</li>
<li class="li1">
<div class="de1">pluginpaths<span class="sy0">.</span>MyApp_Resource <span class="sy0">=</span> APPLICATION_PATH <span class="st0">&quot;/../library/MyApp/Resource&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Resource Plugins</span></div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo<span class="sy0">.</span>name <span class="sy0">=</span> My Application</div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo<span class="sy0">.</span>author <span class="sy0">=</span> Stefan Schmalhaus</div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo<span class="sy0">.</span>version <span class="sy0">=</span> <span class="nu0">1.0</span><span class="nu0">.0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Autoloader Namespaces</span></div>
</li>
<li class="li1">
<div class="de1">autoloadernamespaces<span class="nu0">.0</span> <span class="sy0">=</span> <span class="st0">&quot;MyApp&quot;</span></div>
</li>
</ol>
</div>
<p>As already <a href="http://akrabat.com/2009/03/25/initial-notes-on-zend_application/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/akrabat.com/2009/03/25/initial-notes-on-zend_application/?referer=');">criticized by Rob Allen</a>, we have to use the key &#8220;pluginpaths&#8221; to define the directory where the plugin is stored, but use the key &#8220;resources&#8221; to configure it! (Please refer to the <a href="http://zendframework.com/manual/en/zend.application.core-functionality.html#zend.application.core-functionality.bootstrap-bootstrapabstract" target="_blank" onclick="pageTracker._trackPageview('/outgoing/zendframework.com/manual/en/zend.application.core-functionality.html_zend.application.core-functionality.bootstrap-bootstrapabstract?referer=');">online documentation</a> for more information on these two keys.) I also added the namespace &#8220;MyApp&#8221; to the Zend autoloader for all classes below the <i>MyApp</i> folder.</p>
<h3>The <i>AppInfo</i> Helper Class</h3>
<p>The class <code>MyApp_AppInfo</code> in the <i>library/MyApp</i> folder is a helper class which simply holds the information we want to make available via the Zend registry.</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MyApp_AppInfo</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_name</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_author</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_version</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="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re1">$name</span><span class="sy0">,</span> <span class="re1">$author</span><span class="sy0">,</span> <span class="re1">$version</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">setName</span><span class="br0">&#40;</span><span class="re1">$name</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">setAuthor</span><span class="br0">&#40;</span><span class="re1">$author</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">setVersion</span><span class="br0">&#40;</span><span class="re1">$version</span><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="kw2">public</span> <span class="kw2">function</span> setName<span class="br0">&#40;</span><span class="re1">$name</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>_name <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$name</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</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="kw2">public</span> <span class="kw2">function</span> getName<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="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_name<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; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> setAuthor<span class="br0">&#40;</span><span class="re1">$author</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>_author <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$author</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</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="kw2">public</span> <span class="kw2">function</span> getAuthor<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="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_author<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; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> setVersion<span class="br0">&#40;</span><span class="re1">$version</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>_version <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$version</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</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="kw2">public</span> <span class="kw2">function</span> getVersion<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="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_version<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"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>The Plugin Class</h3>
<p>The actual resource plugin class is <code>MyApp_Resource_Appinfo</code>, and like any other resource plugin class, it extends <code>Zend_Application_Resource_ResourceAbstract</code>. Here&#8217;s the complete code:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MyApp_Resource_Appinfo <span class="kw2">extends</span> Zend_Application_Resource_ResourceAbstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;const DEFAULT_REGISTRY_KEY <span class="sy0">=</span> <span class="st0">&#39;AppInfo&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_appInfo</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="kw2">public</span> <span class="kw2">function</span> init<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="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getAppInfo</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;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getAppInfo<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> &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">null</span> <span class="sy0">===</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$options</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getOptions</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; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$name</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$author</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;author&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;author&#39;</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$version</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;version&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;version&#39;</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo <span class="sy0">=</span> <span class="kw2">new</span> MyApp_AppInfo<span class="br0">&#40;</span><span class="re1">$name</span><span class="sy0">,</span> <span class="re1">$author</span><span class="sy0">,</span> <span class="re1">$version</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$key</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;registry_key&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="kw3">is_numeric</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;registry_key&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;registry_key&#39;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span> self<span class="sy0">::</span><span class="me2">DEFAULT_REGISTRY_KEY</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Zend_Registry<span class="sy0">::</span><span class="me2">set</span><span class="br0">&#40;</span><span class="re1">$key</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo<span class="br0">&#41;</span><span class="sy0">;</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo<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"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>When the resource plugin is initialized during bootstrapping, a new <code>MyApp_AppInfo</code> object is created if it doesn&#8217;t exist. This object gets populated with the data from the configuration file. (The inherited method <code>getOptions()</code> provides an array with the options that were defined in the <i>application.ini</i> file.) Finally, the object is stored in the Zend registry. All this is done automatically, we do not need to do anything &#8220;manually&#8221; in the bootstrap class or anywhere else. </p>
<h3>Usage</h3>
<p>Since the <code>MyApp_AppInfo</code> instance is stored in the Zend registry, we can retrieve the information from there. For example, in a controller we can assign the author name to a view variable like this:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Some_IndexController <span class="kw2">extends</span> Zend_Controller_Action</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">public</span> <span class="kw2">function</span> indexAction<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">view</span><span class="sy0">-&gt;</span><span class="me1">author</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;AppInfo&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getAuthor</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;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Or if we wanted to display the application&#8217;s name inside the title tag of our web pages we could utilize the resource from within another resource plugin class. In this case a custom view resource plugin is the most appropriate place to do this:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MyApp_Resource_View <span class="kw2">extends</span> Zend_Application_Resource_ResourceAbstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_view</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="kw2">public</span> <span class="kw2">function</span> init<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="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getView</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;<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="kw2">public</span> <span class="kw2">function</span> getView<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="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">null</span> <span class="sy0">===</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_view<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$options</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getOptions</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; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getBootstrap</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">bootstrap</span><span class="br0">&#40;</span><span class="st0">&#39;appinfo&#39;</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="re1">$title</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;AppInfo&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_View<span class="br0">&#40;</span><span class="re1">$options</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="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">doctype</span><span class="br0">&#40;</span><span class="st0">&#39;XHTML1_STRICT&#39;</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="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">headTitle</span><span class="br0">&#40;</span><span class="re1">$title</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$viewRenderer</span> <span class="sy0">=</span> Zend_Controller_Action_HelperBroker<span class="sy0">::</span><span class="me2">getStaticHelper</span><span class="br0">&#40;</span><span class="st0">&#39;ViewRenderer&#39;</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="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">setView</span><span class="br0">&#40;</span><span class="re1">$view</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_view <span class="sy0">=</span> <span class="re1">$view</span><span class="sy0">;</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">$this</span><span class="sy0">-&gt;</span>_view<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"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The important thing here is to enforce the initialization of the <i>AppInfo</i> resource: </p>
<p><code>$this->getBootstrap()-&gt;bootstrap('appinfo');</code></p>
<p>Finally, there is a possible pitfall that you should be aware of. Even if your plugins do not read any options from the configuration file, you still have to provide the key in the configuration file, otherwise the plugins won&#8217;t get initialized. For example:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co2"># Resource Plugins</span></div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo <span class="sy0">=</span> </div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>view <span class="sy0">=</span></div>
</li>
</ol>
</div>
<p>If you want to learn more on resource plugins, I recommend to take a look at the source code of the standard plugins that ship with the Zend framework. I&#8217;m sure you will come up with your own ideas quickly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2009/06/01/creating-a-custom-resource-plugin-in-zend-framework-18/feed/</wfw:commentRss>
		<slash:comments>11</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>
