<?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>Daniel Eneström &#187; Remoting</title>
	<atom:link href="http://blog.enestrom.com/tag/remoting/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.enestrom.com</link>
	<description>Ramblings of a web developer</description>
	<lastBuildDate>Wed, 27 Jan 2010 19:49:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Maintaining state on Tree Component while updating remote data</title>
		<link>http://blog.enestrom.com/20090312/maintaining-state-on-tree-component-while-updating-remote-data/</link>
		<comments>http://blog.enestrom.com/20090312/maintaining-state-on-tree-component-while-updating-remote-data/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 15:29:01 +0000</pubDate>
		<dc:creator>Daniel Eneström</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Remoting]]></category>

		<guid isPermaLink="false">http://blog.enestrom.com/?p=80</guid>
		<description><![CDATA[I suppose I&#8217;m not the only one who&#8217;s had problems with maintaining the state of a flex tree component upon updating the data. Recently I encountered the problem again and decided to crack this nut once and for all. As it turned out it was a lot easier than I had anticipated.
The Scenario
In this particular [...]]]></description>
			<content:encoded><![CDATA[<p>I suppose I&#8217;m not the only one who&#8217;s had problems with maintaining the state of a flex tree component upon updating the data. Recently I encountered the problem again and decided to crack this nut once and for all. As it turned out it was a lot easier than I had anticipated.</p>
<p><strong>The Scenario<br />
</strong>In this particular case I had a tree component displaying a hierarchical view of the pages of a web site. Upon making some certain changes, like dragging and dropping pages to reorder them I felt the need to change the order server-side and reload the data, rather than changing the order inside the dataProvider. I just like it that way better.</p>
<p><strong>The Problem<br />
</strong>So before I reloaded the data I saved the tree&#8217;s open items in a variable called openTreeItems and when I received the new data I tried to reset it by using <em>tree.openItems = openTreeItems</em>.<br />
Nothing happened.</p>
<p><strong>The Research<br />
</strong>So I started doing some research and quickly discovered that to make this work the component uses the <strong>uid</strong> property and on updating the data for the dataProvider Flex reassigns new uid&#8217;s to the items in the collection. So, in short, Flex doesn&#8217;t recognize the items as the same items after the reload, because of the new uid values.</p>
<p>I encountered <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_6.html" target="_blank">this article in the Flex 3 Help pages</a> and started experimenting with creating custom classes that implemented the IUID interface and soon discovered that this was way to complicated for the (actually) quite simple problem I had. The pages in my database had unique ID&#8217;s! Why the h*ll couldn&#8217;t I use these values as the uid values instead of the built-in values?</p>
<p><strong>The Solution</strong><br />
I suddenly had an idea: what if I simply add the uid property to my data serverside by using the id value I already had? This could be done in many ways but I chose to alter my SQL query like so: <em><br />
&#8220;SELECT pages.id, <strong>pages.id uid</strong>, &#8230; FROM pages&#8230;&#8221;</em>. This way the value would be passed on into Flex the same way as all the other values.</p>
<p>And, voilà, it worked!<br />
After this tiny alteration of my SQL query Flex recognized my items as the ones saved in the openTreeItems variable and when using <em>tree.invalidateList()</em> before the update and <em>tree.validateNow()</em> after the update there isn&#8217;t even a flicker upon updating the data. Sweetness!</p>
<p>Hope this helps anyone that has had the same problem.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.enestrom.com%2F20090312%2Fmaintaining-state-on-tree-component-while-updating-remote-data%2F&amp;linkname=Maintaining%20state%20on%20Tree%20Component%20while%20updating%20remote%20data"><img src="http://blog.enestrom.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://blog.enestrom.com/20090312/maintaining-state-on-tree-component-while-updating-remote-data/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AMFPHP and Flex</title>
		<link>http://blog.enestrom.com/20080808/amfphp-and-flex/</link>
		<comments>http://blog.enestrom.com/20080808/amfphp-and-flex/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 13:44:45 +0000</pubDate>
		<dc:creator>Daniel Eneström</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Remoting]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.enestrom.com/?p=13</guid>
		<description><![CDATA[Being a LAMP (Linux Apache MySQL PHP) guy as well as a Flex developer it didn&#8217;t take me long to discover AMFPHP. If you haven&#8217;t heard of it I can tell you in short it&#8217;s a framework for sending and receiving data between Actionscript and PHP, without having to use an XML layer or similar [...]]]></description>
			<content:encoded><![CDATA[<p>Being a LAMP <em>(Linux Apache MySQL PHP)</em> guy as well as a Flex developer it didn&#8217;t take me long to discover <a href="http://www.amfphp.org/" target="_blank">AMFPHP</a>. If you haven&#8217;t heard of it I can tell you in short it&#8217;s a framework for sending and receiving data between Actionscript and PHP, without having to use an XML layer or similar in between, so to speak. It&#8217;s really neat, because lets say you extract an array of rows from your MySQL database, then you can just pass the entire array back to Actionscript and it will be received as an Actionscript array in the other end.</p>
<p>Would you like to try it? This is how to do it:</p>
<p>1. Download the latest AMFPHP package from <a href="http://www.amfphp.org/" target="_blank">www.amfphp.org</a></p>
<p>2. Unpack and (preferably) place the folder called <em>amfphp</em> in the document root on your web server.</p>
<p>3. By default the AMFPHP gateway is set to converting all UTF-8 data to Latin 1. Big NO NO for &#8220;international&#8221; developers like me, so you should open the <em>gateway.php</em> file in the <em>amfphp</em> folder for editing and change the following line (it should be around line 127):</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$gateway</span><span class="sy0">-&gt;</span><span class="me1">setCharsetHandler</span><span class="br0">&#40;</span><span class="st0">&quot;utf8_decode&quot;</span><span class="sy0">,</span> <span class="st0">&quot;ISO-8859-1&quot;</span><span class="sy0">,</span> <span class="st0">&quot;ISO-8859-1&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>to </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$gateway</span><span class="sy0">-&gt;</span><span class="me1">setCharsetHandler</span><span class="br0">&#40;</span><span class="st0">&quot;iconv&quot;</span><span class="sy0">,</span><span class="st0">&quot;UTF-8&quot;</span><span class="sy0">,</span><span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>If you don&#8217;t do this all UTF-8 special characters from the database will be distorted on arriving at the Flex application.</p>
<p>4. Now create a simple PHP class file, call it <em>HelloWorld.php</em>, and place it in the <em>/amfphp/services</em> folder. You should use a commenting pattern like that of PHPDoc. Here is a simple HelloWorld example:</p>
<div class="geshi no php">
<div class="head">/**</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">*</span> A simple amfphp service<span class="sy0">.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> HelloWorld</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * A simple HelloWorld function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @returns A string containing the phrase &#39;Hello World!&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> SayHello<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="st0">&quot;Hello World!&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * A simple HelloWorld function that bounces back the given string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @returns A string containing the supplied string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> SayWhat<span class="br0">&#40;</span><span class="re1">$string</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="re1">$string</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In this class I&#8217;ve put two functions; one that returns the string &#8216;Hello World!&#8217; and another that returns whatever string you send to it. Okay, so let&#8217;s get on with the show&#8230;</p>
<p>5. Now you can test your service by browsing to the <em>browser</em> folder. It should have a URL similar to this: <em>yourserver.com/amfphp/browser</em>. In the service browser you can test whether your class is working as it should.</p>
<p>6. <strong>Flex<br />
</strong>To simplify things I&#8217;ve created a small class for the implementation of this in Flex. There is a number of ways of doing this, but I&#8217;ve chosen the one way that I am most comfortable with.</p>
<p>For ease of use, create an actionscript document in your Flex Projects root directory called <em>AMFPHP.as</em> and past the following code into the file:</p>
<div class="geshi no actionscript">
<div class="head">package {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">import</span> flash.<span class="me1">net</span>.<span class="kw3">NetConnection</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">import</span> flash.<span class="me1">net</span>.<span class="me1">Responder</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">class</span> AMFPHP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> gateway:<span class="kw3">String</span> = <span class="st0">&quot;http://www.yourserver.com/amfphp/gateway.php&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> connection:<span class="kw3">NetConnection</span> = <span class="kw2">new</span> <span class="kw3">NetConnection</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; connection.<span class="kw3">connect</span><span class="br0">&#40;</span>gateway<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> AMFPHP<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Static class</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> <span class="kw3">send</span><span class="br0">&#40;</span>serviceFunction:<span class="kw3">String</span>, resultHandler:<span class="kw2">Function</span>, faultHandler:<span class="kw2">Function</span>, &#8230; <span class="me1">args</span>:<span class="sy0">*</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">trace</span><span class="br0">&#40;</span><span class="st0">&quot;AMFPHP(&quot;</span>+serviceFunction+<span class="st0">&quot;)&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Create responder</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> responder:Responder = <span class="kw2">new</span> Responder<span class="br0">&#40;</span>resultHandler, faultHandler<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Create an array that will temporarily store all the arguments</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> collectArgs:<span class="kw3">Array</span> = <span class="kw2">new</span> <span class="kw3">Array</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Add the fixed arguments</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;collectArgs.<span class="kw3">push</span><span class="br0">&#40;</span>serviceFunction<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;collectArgs.<span class="kw3">push</span><span class="br0">&#40;</span>responder<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Loop through the optional arguments and add them too</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i:uint=<span class="nu0">0</span>; i<span class="sy0">&lt;</span>args.<span class="kw3">length</span>; i++<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; collectArgs.<span class="kw3">push</span><span class="br0">&#40;</span>args<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</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;<span class="co1">// Create a reference to the function we will call</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> callFunction:<span class="kw2">Function</span> = connection.<span class="kw3">call</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Call the function using the arguments</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;callFunction.<span class="kw3">apply</span><span class="br0">&#40;</span>connection,collectArgs<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&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 only thing you have to change here is the URL to the <em>gateway.php </em>file on your server at line 7 in the file.</p>
<p>7. Usage</p>
<p>To use this in your code you will need three things:</p>
<p>• Calling the service using the static AMFPHP.send() function<br />
• A function that handles the result coming from amfphp<br />
• A function that handles errors</p>
<p>This is the first HelloWorld example (without the argument). The first argument for the send() function is a string describing the path to the function, with this structure: <em>[directory.]class.function</em>, within the services folder. A directory is not necessary, but can be convenient if you have packages of many classes.</p>
<div class="geshi no actionscript">
<div class="head">private function helloWorld() : void</div>
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;AMFPHP.<span class="kw3">send</span><span class="br0">&#40;</span><span class="st0">&quot;HelloWorld.SayHello&quot;</span>,onResult,onFault<span class="br0">&#41;</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="kw3">private</span> <span class="kw2">function</span> onResult<span class="br0">&#40;</span>result:<span class="kw3">String</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">trace</span><span class="br0">&#40;</span>result<span class="br0">&#41;</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="kw3">private</span> <span class="kw2">function</span> onFault<span class="br0">&#40;</span>result:<span class="kw3">Object</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">trace</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span>result.<span class="me1">description</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Easy huh!?</p>
<p>And the example with the argument is pretty much the same, but with an argument added to the end of the function call. Like this:</p>
<div class="geshi no actionscript">
<div class="head">private function helloWorld() : void</div>
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;AMFPHP.<span class="kw3">send</span><span class="br0">&#40;</span><span class="st0">&quot;HelloWorld.SayWhat&quot;</span>, onResult, onFault, <span class="st0">&quot;Hello to you!&quot;</span><span class="br0">&#41;</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="kw3">private</span> <span class="kw2">function</span> onResult<span class="br0">&#40;</span>result:<span class="kw3">String</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">trace</span><span class="br0">&#40;</span>result<span class="br0">&#41;</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="kw3">private</span> <span class="kw2">function</span> onFault<span class="br0">&#40;</span>result:<span class="kw3">Object</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">trace</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span>result.<span class="me1">description</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Note that I changed the path to the function from <em>HelloWorld.SayHello</em> to <em>HelloWorld.SayWhat</em> to use the other function in the class.</p>
<p>Well, that&#8217;s it. Hope it was of some use. Good luck!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.enestrom.com%2F20080808%2Famfphp-and-flex%2F&amp;linkname=AMFPHP%20and%20Flex"><img src="http://blog.enestrom.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://blog.enestrom.com/20080808/amfphp-and-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
