<?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>Flexmaniak.pl &#187; Flex</title>
	<atom:link href="http://blog.flexmaniak.pl/tag/flex/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.flexmaniak.pl</link>
	<description>Flex, Papervision3D, PHP, Symfony</description>
	<lastBuildDate>Sat, 07 Aug 2010 11:49:36 +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>[Zend_Amf + Symfony + Flex] Server with Logger</title>
		<link>http://blog.flexmaniak.pl/flex_i_php/zend_amf-symfony-flex-server-with-logger</link>
		<comments>http://blog.flexmaniak.pl/flex_i_php/zend_amf-symfony-flex-server-with-logger#comments</comments>
		<pubDate>Sun, 18 Jul 2010 19:50:57 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex i PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[amf server]]></category>
		<category><![CDATA[logger]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Zend_Amf]]></category>
		<category><![CDATA[zend_amf_server]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=878</guid>
		<description><![CDATA[After integrating Symfony with Flex through Zend_Amf, I had to debug it and I needed some logs on server side. Below I present my LoggedAmfServer extending Zend_Amf_Server, which logs all methods called by Flex and its&#8217; responses. You need to pass instance of sfLogger (ie. sfFileLogger) in the constructor. logger = $l; parent::__construct&#40;&#41;; &#125; protected [...]]]></description>
			<content:encoded><![CDATA[<p>After integrating Symfony with Flex through Zend_Amf, I had to debug it and I needed some logs on server side.<br />
Below I present my <strong>LoggedAmfServer</strong> extending Zend_Amf_Server, which logs all methods called by Flex and its&#8217; responses. You need to pass instance of sfLogger (ie. sfFileLogger) in the constructor.</p>
<p><span id="more-878"></span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:100%;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">logger <span style="color: #339933;">=</span> <span style="color: #000088;">$l</span><span style="color: #339933;">;</span><br />
parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _handle<span style="color: #009900;">&#40;</span>Zend_Amf_Request <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$responseBody</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAmfBodies</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$body</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/current"><span style="color: #990000;">current</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$responseBody</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$body</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$body</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span> instanceof Zend_Amf_Value_Messaging_RemotingMessage<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logger</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/sprintf"><span style="color: #990000;">sprintf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[Amf Request] CLIENT: [<span style="color: #009933; font-weight: bold;">%s</span>] OPERATION: [<span style="color: #009933; font-weight: bold;">%s</span>]. PARAMETERS: [<span style="color: #009933; font-weight: bold;">%s</span>].&quot;</span><span style="color: #339933;">,</span><br />
<span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clientId</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">operation</span><span style="color: #339933;">,</span> <a href="http://www.php.net/var_export"><span style="color: #990000;">var_export</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
parent<span style="color: #339933;">::</span>_handle<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> handle<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$body</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/current"><span style="color: #990000;">current</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAmfBodies</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$body</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$body</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logger</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/sprintf"><span style="color: #990000;">sprintf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[Amf Response] CLIENT: [<span style="color: #009933; font-weight: bold;">%s</span>] RESPONSE: [<span style="color: #009933; font-weight: bold;">%s</span>]&quot;</span><span style="color: #339933;">,</span><br />
<span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clientId</span><span style="color: #339933;">,</span> <a href="http://www.php.net/var_export"><span style="color: #990000;">var_export</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$response</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex_i_php/zend_amf-symfony-flex-server-with-logger/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fabrication wchłania Tequile</title>
		<link>http://blog.flexmaniak.pl/flex/fabrication-wchlania-tequile</link>
		<comments>http://blog.flexmaniak.pl/flex/fabrication-wchlania-tequile#comments</comments>
		<pubDate>Wed, 07 Jul 2010 12:48:56 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[fabrication]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[tequila]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=874</guid>
		<description><![CDATA[Ostatnio pisałem o nowym ciekawym frameworku Tequila w tym poście. Jednakże jak się okazuje, jego autor (Rafał Szemraj) przejął pełną kontrolę (=)) nad projektem Fabrication. Od tej pory Fabrication będzie wchłaniało funkcjonalności Tequili, dlatego też praca nad Tequilą została zawieszona (komentarz Rafała w poście). Dodam tylko, że zauważyłem, że 2 dni temu została opublikowana najnowsza [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio pisałem o nowym ciekawym frameworku Tequila w <a href="http://blog.flexmaniak.pl/aktualnosci/tequila-framework">tym</a> poście.</p>
<p>Jednakże jak się okazuje, jego autor (Rafał Szemraj) przejął pełną kontrolę (=)) nad projektem <strong>Fabrication</strong>.<br />
Od tej pory Fabrication będzie wchłaniało funkcjonalności Tequili, dlatego też praca nad Tequilą została zawieszona (komentarz Rafała w <a href="http://blog.flexmaniak.pl/aktualnosci/tequila-framework" title="Tequila framework">poście</a>).</p>
<p>Dodam tylko, że zauważyłem, że 2 dni temu została opublikowana najnowsza wersja Fabrication <strong>0.7.1</strong>.</p>
<p>Przydatke linki:<br />
<a href="http://code.google.com/p/fabrication/">http://code.google.com/p/fabrication/</a> &#8211; oficjalna stronka Fabrication<br />
<a href="http://blog.szemraj.eu">http://blog.szemraj.eu</a> &#8211; blog Rafała</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/fabrication-wchlania-tequile/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony i Flex przez Zend_Amf</title>
		<link>http://blog.flexmaniak.pl/flex_i_php/symfony-i-flex-przez-zend_amf</link>
		<comments>http://blog.flexmaniak.pl/flex_i_php/symfony-i-flex-przez-zend_amf#comments</comments>
		<pubDate>Mon, 31 May 2010 12:05:27 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex i PHP]]></category>
		<category><![CDATA[Amf]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Zend_Amf]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=389</guid>
		<description><![CDATA[Szeroki wybór możliwości połączenia PHP i Flexa możemy uważać za coś pozytywnego, ponieważ każdy może sobie odnaleźć swój sposób integracji server-side z client-side. Jednakże na długą metę okazuje się to zmorą, bo człowiek (przynajmniej ja tak mam) zaczyna się zastanawiać, czy to drugie rozwiązanie nie jest lepsze. Dlatego postanowiłem znaleźć jakiś sposób integracji, który będzie [...]]]></description>
			<content:encoded><![CDATA[<p>Szeroki wybór możliwości połączenia PHP i Flexa możemy uważać za coś pozytywnego, ponieważ każdy może sobie odnaleźć swój sposób integracji server-side z client-side. Jednakże na długą metę okazuje się to zmorą, bo człowiek (przynajmniej ja tak mam) zaczyna się zastanawiać, czy to drugie rozwiązanie nie jest lepsze.</p>
<p>Dlatego postanowiłem znaleźć jakiś sposób integracji, który będzie szybki i dobry :). Przeglądając różne stronki o Flexie, odnalazłem prezentację (niestety nie pamiętam adresu), na której ładnie przedstawiony był fakt, że <strong>AMF</strong> to idealny protokół komunikacji z Flexem. Nic dziwnego, w końcu to twór Adobe.</p>
<p><span id="more-389"></span></p>
<p>Ok, protokół mamy. Teraz wypada wybrać implementację. Jako, że jestem użytkownikiem frameworka Symfony, to właśnie z nim chciałbym zintegrować Flexa.</p>
<p>Wiem, że istnieje plugin do symfony <strong>sfAmfPlugin</strong> (<a href="http://www.symfony-project.org/plugins/sfAmfPlugin">strona głowna</a>). Nie będe się o nim rozpisywał. Jak ktoś jest ciekawy, to niech śmiga na jego stronę główną. Powiem tylko, że jest on oparty na bibliotece <strong>SabreAMF</strong>, której szczerze mówiąc nie znam. Wiem natomiast, że biblioteka Zend&#8217;a jest dobra do wsyztskiego :), dlatego właśnie z niej korzystam.</p>
<p>Poniżej przedstawiam opis jak zrobić szybko HelloWorld we Flexie, z wykorzystaniem Symfony i AMF oraz bibliotek Zenda. We wszystkich HelloWorld&#8217;ach w necie brakowało mi tego połączenia.</p>
<p><strong>Zaczynamy</strong></p>
<p>Na początku trzeba postawić zwykły projekt Symfony i dodać jakąś aplikację &#8211; ja dodałem aplikacje o nazwie <strong>frontend</strong>. Zakładam, że ludzie czytający wpis o symfony wiedzą jak to zrobić :)</p>
<p>Następnie należy zintegrować odpowiednie biblioteki Zenda. Integracja została opisana we wpisie <a title="Integracja Symfony + Zend" href="http://blog.flexmaniak.pl/flex_i_php/integracja-symfony-zend">Integracja Symfony + Zend</a>.</p>
<p>Oto lista plików jakie należy umieścić w katalogu /lib/vendor/Zend:</p>
<ul>
<li>Amf/</li>
<li>Loader/</li>
<li>Server/</li>
<li>Auth.php</li>
<li>Loader.php</li>
<li>Exception.php</li>
</ul>
<p>Następnie tworzymy moduł <strong>amf</strong>, w którym będzie nasz Zend_Amf_Endpoint, czyli miejsce do którego będziemy się odwoływać z Flexa.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">symfony generate:module frontend amf</div></div>
<p>Ja umieściłem swój endpoint w akcji server (tak dla niepoznaki ;)). Oto kod akcji:</p>
<pre class="brush:php">public function executeServer(sfWebRequest $request) {

$server = new Zend_Amf_Server();

$server-&gt;setClass('helloService');

$this-&gt;renderText($server-&gt;handle());
return sfView::NONE;
}</pre>
<p>Nic innego jak stworzenie instancji serwera, przypisanie mu klas, które są service&#8217;ami oraz wyświetlenie wyniku metody handle(). Istotne jest też wyłączenie renderowania template&#8217;u.</p>
<p><strong>Services</strong></p>
<p>Jak pisałem w opisie akcji, serwer Zend_Amf_Server składa się z klas (lub funkcji). Najwygodniejszym sposobem jest stworzenie oddzielnych klas, które będziemy traktować jako przestrzenie nazw. Poniżej nasza klasa dla helloWorld.</p>
<pre class="brush:php">class helloService {

/**
* Method returns hello mesage
*
* @return string
*/
public function helloWorld() {
return 'hello world';
}

}</pre>
<p>Jak widać service <strong>hello</strong> posiada tylko jedną metodę bezparametrową <strong>helloWorld()</strong>, która zwraca string. AMF to potęga bo mapuje typy :), więc we Flexie nie trzeba będzie parsować odpowiedzi, jak by to miało miejsce w przypadku np. XML czy JSON. Należy jednak określic w PHPDoc (nad metodą) wszystkie parametry oraz zwracany typ. Dobrą praktyką jest też krótkie opisanie działania metody.</p>
<p><strong>Flex</strong></p>
<p>Przed rozpoczęciem implementowania trzeba dodać do projektu (do folderu src) plik services-config.xml, który jest konfiguracją połączenie Flexa z endpointem. Założmy, że nasz serwer amf znajduje się pod adresem:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http://localhost/helloServer/amf/server</div></div>
<p>Wtedy przykładowy plik services-config.xml wygląda następująco</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;services-config&gt;
&lt;services&gt;
&lt;service id="amfphp-flashremoting-service"

messageTypes="flex.messaging.messages.RemotingMessage"&gt;
&lt;destination id="amfphp"&gt;
&lt;channels&gt;
&lt;channel ref="my-amfphp"/&gt;
&lt;/channels&gt;
&lt;properties&gt;
&lt;source&gt;*&lt;/source&gt;
&lt;/properties&gt;
&lt;/destination&gt;
&lt;/service&gt;
&lt;/services&gt;

&lt;channels&gt;
&lt;channel-definition id="my-amfphp"  class="mx.messaging.channels.AMFChannel"&gt;
&lt;endpoint  uri="http://localhost/helloServer/amf/server"  class="flex.messaging.endpoints.AMFEndpoint"/&gt;
&lt;/channel-definition&gt;
&lt;/channels&gt;
&lt;/services-config&gt;</pre>
<p>Nastepnie należy wejść do ustawień projektu. Przejść do &#8222;Flex compiler&#8221; i w polu &#8222;Additonal compiler arguments&#8221; dopisać:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-services &quot;sciezka-do-folderu/services-config.xml&quot;</div></div>
<p><strong>Komunikacja</strong></p>
<p>Z poziomu flexa do komunikacji będziemy wykorzystywać klasę <strong>RemoteObject</strong>. Poniżej przedstawiam przykład klasy fasady do komunikacji z serwerem PHP oraz jej wykorzystanie w przykładowej aplikacji. Fasada posiada obiekt RemoteObject, do którego mamy dostęp zabroniony. Wszelkie zapytania do serwera AMF będą przechodziły przez nasza fasadę.</p>
<pre class="brush:js">public class ServerFacade {

private var helloService:RemoteObject = null;

public function ServerFacade() {
//połączenie z endpointem oznaczonym w pliku services-config.xml
helloService = new RemoteObject("amfphp");
helloService.showBusyCursor = true;
//przypisanie nazwy klasy do źródła
helloService.source = "helloService";
//określenie co ma sie dziać jak wystąpi błąd
helloService.addEventListener(FaultEvent.FAULT, globalFault);

//przypisanie Listenerów, które są wywoływaja jak zostanie zwrócona wartość z serwera
addApiListeners();
}

//METHODS
public function hello_helloWorld():void {
helloService.helloWorld();
}

//HELLO_WORLD
public var hello_helloWorld_resultHandler:Function = null;
private function hello_helloWorld_internalResultHandler(event:ResultEvent):void {
if (hello_helloWorld_resultHandler != null) {
hello_helloWorld_resultHandler(event);
}
}

//PRIVATE

private function addApiListeners():void {
helloService.helloWorld.addEventListener(ResultEvent.RESULT, hello_helloWorld_internalResultHandler);
}

private function globalFault(event:FaultEvent):void {
Alert.show(event.fault.message, "Fault: " + event.type);
}

}</pre>
<p>Jak widać funkcja helloWorld została połączona z dwoma resultHandlerami. Jest to mój sposób implementacji asynchronicznych zapytań do serwera. Oczywiście asynchroniczność powoduje, że nie otrzymujemu wyniku od razu, tylko musimy dodać Listener&#8217;a, który obsłuży zwracany wynik (w bliżej nieokreślonym czasie).</p>
<p>Wewnętrzny handler (<em>internalHandler</em>)<em> </em>nasłuchuje na zdarzenie. Gdy je przechwyci:</p>
<ol>
<li>Wykonuje wewnętrzne akcję (przykład podam poniżej)</li>
<li>Wywołuje funkcję zewnętrzną &#8216;<em>hello_helloWorld_resultHandler</em>&#8216;, jeśli została zdefiniowana przez użytkownika.</li>
</ol>
<p>Przykład zastosowania fasady jest następujący:</p>
<pre class="brush:js">var sF:ServerFacade = new ServerFacade();
sF.hello_helloWorld_resultHandler = function(event:ResultEvent) {
Alert.show(event.result);
}
sF.hello_helloWorld();</pre>
<p>Przed wywołaniem funkcji określamy, co ma zostać wykonane z jej wynikiem &#8211; wyświetlenie w boxie Alert. Następnie wywołujemy funkcję.</p>
<p><strong>Przykładem wykorzystania wewnętrznych handlerów</strong> jest zachowanie stanu sesji uzytkownika. Na przykład w wewnętrznym handlerze akcji logowania można zapisać rolę użytkownika i wynik innych metod odpowiednio modyfikować w zależności od roli zalogowanego użytkownika.</p>
<p>Niestety nie mam tego przykładu jeszcze popartego kodem, ale jak tylko będę mógł pokazać kod, który wykorzystuje taki mechanizm, to umieszczę go na blogu.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex_i_php/symfony-i-flex-przez-zend_amf/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tequila Framework</title>
		<link>http://blog.flexmaniak.pl/aktualnosci/tequila-framework</link>
		<comments>http://blog.flexmaniak.pl/aktualnosci/tequila-framework#comments</comments>
		<pubDate>Wed, 19 May 2010 14:11:17 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Aktualności]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[ria]]></category>
		<category><![CDATA[tequila]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/aktualnosci/tequila-framework</guid>
		<description><![CDATA[Na konferencji Flash Camp 2010 Rafał Szemraj przedstawił w krótkim przemówieniu nowy framework do Flexa &#8211; Tequila. Jest to framework oparty na PureMVC z domieszką Fabrication. Niestety nie miałem jeszcze czasu zaznajomić się z nim dogłębniej, ale jak tylko znajdę czas to na pewno napisze jak mi się z nim pracuje :) Ciekawym rozwiązaniem jest [...]]]></description>
			<content:encoded><![CDATA[<p>Na konferencji Flash Camp 2010 Rafał Szemraj przedstawił w krótkim przemówieniu nowy framework do Flexa &#8211; <a href="http://blog.szemraj.eu/tequila">Tequila</a>.<br />
Jest to framework oparty na PureMVC z domieszką Fabrication.<br />
Niestety nie miałem jeszcze czasu zaznajomić się z nim dogłębniej, ale jak tylko znajdę czas to na pewno napisze jak mi się z nim pracuje :)</p>
<p>Ciekawym rozwiązaniem jest dołączenie do frameworka konsoli napisanej w AIR, która pomaga debugować program. </p>
<p>Po więcej informacji odsyłam na stronę <a href="http://blog.szemraj.eu/">autora</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/aktualnosci/tequila-framework/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Pagination + DataGrid + Service = PaginatedDataGrid v0.1 [english]</title>
		<link>http://blog.flexmaniak.pl/flex_i_php/pagination-datagrid-service-paginateddatagrid-v0-1-english</link>
		<comments>http://blog.flexmaniak.pl/flex_i_php/pagination-datagrid-service-paginateddatagrid-v0-1-english#comments</comments>
		<pubDate>Fri, 19 Feb 2010 17:57:30 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex i PHP]]></category>
		<category><![CDATA[DataGrid]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[service]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=357</guid>
		<description><![CDATA[Lately I was building an backend (admin-side) application in Flex. Most of the data was presented in data grids. However, when working with services (PHP in my case) it is risky to load all data  to the DataGrid. It may lead to an application crash, ie. when we work on 1000&#8242;s of items. Therefore I [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I was building an backend (admin-side) application in Flex. Most of the data was presented in data grids.</p>
<p>However, when working with services (PHP in my case) it is risky to load all data  to the DataGrid. It may lead to an application crash, ie. when we work on 1000&#8242;s of items.</p>
<p>Therefore I decided to create the component that handles pagination itself &#8211; it is similar to ExtJS&#8217; data grid (however much simpler :) ).</p>
<p><span id="more-357"></span></p>
<p>The example is below&#8230; (You can view source by right-clicking on application)</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="200" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blog.flexmaniak.pl/examples/paginatedDataGrid/paginatedDatagrid.swf" /><embed type="application/x-shockwave-flash" width="100%" height="200" src="http://blog.flexmaniak.pl/examples/paginatedDataGrid/paginatedDatagrid.swf"></embed></object></p>
<p>This components dispatches 2 events (for now):</p>
<ul>
<li>when page is changes</li>
<li>when data is sorted</li>
</ul>
<p>I also added DATA_FILTER event, but I do not have idea how to include the filtration form in the component GUI.</p>
<p>To download source click <a href="http://blog.flexmaniak.pl/examples/paginatedDataGrid/srcview/paginatedDatagrid.zip">here</a>.</p>
<p>Any comments would be welcomed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex_i_php/pagination-datagrid-service-paginateddatagrid-v0-1-english/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ustawienie szerokości i wysokości po utworzeniu komponentu</title>
		<link>http://blog.flexmaniak.pl/flex/ustawienie-szerokosci-i-wysokosci-po-utworzeniu-komponentu</link>
		<comments>http://blog.flexmaniak.pl/flex/ustawienie-szerokosci-i-wysokosci-po-utworzeniu-komponentu#comments</comments>
		<pubDate>Sun, 17 Jan 2010 10:40:03 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[height]]></category>
		<category><![CDATA[measure]]></category>
		<category><![CDATA[szerokość komponentu]]></category>
		<category><![CDATA[width]]></category>
		<category><![CDATA[wysokość komponentu]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=332</guid>
		<description><![CDATA[Jednym z częstych problemów z komponentami pisanymi w Action Scripcie jest ustawienie ich szerokości i wysokości tak, żeby były one widoczne od razu po utworzeniu komponentu. Poniżej przedstawie dwa rozwiązania tego problemu. 1. Użycie wydarzenia creationComplete Polega na ustawieniu w kontruktorze Listenera, żeby nasłuchiwał na zdarzenie creationComplete. W metodzie obsługującej zdarzenie zmieniamy odpowiednio width i [...]]]></description>
			<content:encoded><![CDATA[<p>Jednym z częstych problemów z komponentami pisanymi w Action Scripcie jest ustawienie ich szerokości i wysokości tak, żeby były one widoczne od razu po utworzeniu komponentu.<br />
<span id="more-332"></span><br />
Poniżej przedstawie dwa rozwiązania tego problemu.</p>
<p>1. Użycie wydarzenia <strong>creationComplete</strong></p>
<p>Polega na ustawieniu w kontruktorze <strong>Listenera</strong>, żeby nasłuchiwał na zdarzenie <strong>creationComplete</strong>. W metodzie obsługującej zdarzenie zmieniamy odpowiednio width i height komponentu.</p>
<pre class="brush:js">public class FirstBox extends Box {
	public function FirstBox() {
		super();
		this.addEventListener(FlexEvent.CREATION_COMPLETE, creationComplete);
	}

	protected function creationComplete(ev:FlexEvent):void {
		this.width = 150;
		this.height = 50;
	}
}</pre>
<p>2. Nadpisanie metody <strong>measure</strong><br />
Drugie rozwiązanie polega na nadpisaniu metody <strong>measure</strong> i ustawieniu w niej wartosci pol <strong>measuredWidth</strong> i <strong>measuredHeight</strong>, które odpowiadają szerokości i wysokości.</p>
<pre class="brush:js">public class SecondBox extends Box {

	public function SecondBox() {
		super();
	}

	protected override function measure():void {
		super.measure();
		measuredWidth = 150;
		measuredHeight = 50;
	}
}</pre>
<p>Poniżej przedstawiam przykład, który prezentuje problem i rozwiązania.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="200" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blog.na14.pl/examples/measure/measure.swf" /><embed type="application/x-shockwave-flash" width="100%" height="200" src="http://blog.na14.pl/examples/measure/measure.swf"></embed></object></p>
<p>O ile oba rozwiązania dają ten sam efekt, to jednak rozwiązanie drugie jest szybsze, prostsze, bardziej logiczne i w ogóle lepsze :) Dlaczego?</p>
<p>Logicznie rzecz biorąc, wymiary komponentu nie powinny być uzależnione od żadnego zewnętrznego czynnika (zgodnie z obiektowym podejściem do programowania). W pierwszym przypadku ta zasada nie jest spełniona, gdyż komponent czeka na zdarzenie <strong>creationComplete</strong>, które jest sygnalizowane przez aplikację.</p>
<p>W drugim zadaniu nie wykorzystujemy żadnych mechanizmów (=zdarzeń), tylko nadpisujemy jedną metodę. Oczywiście jest to prostsze rozwiązanie :) Poza tym jest całkowicie uniezależnione od innych komponentów, czy ogólnie aplikacji.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/ustawienie-szerokosci-i-wysokosci-po-utworzeniu-komponentu/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Custom Preloader</title>
		<link>http://blog.flexmaniak.pl/flex/custom-preloader</link>
		<comments>http://blog.flexmaniak.pl/flex/custom-preloader#comments</comments>
		<pubDate>Tue, 17 Nov 2009 17:35:33 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[custom preloader]]></category>
		<category><![CDATA[preloader]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=115</guid>
		<description><![CDATA[W tym wpisie przedstawię jak w prosty sposób dodać własny preloader do naszej aplikacji, pozbywając się domyślnego &#8211; moim zdaniem brzydkiego :) &#8211; preloadera. Na początek spójrzmy jak będzie wyglądał nasz preloader. Aby osiągnąć taki cel musimy: Stworzyć klasę która dziedziczy po DownloadProgressBar lub implementuje IPreloaderDisplay Zaimplementować w niej odpowiednie metody Dodać nasz preloader do [...]]]></description>
			<content:encoded><![CDATA[<p>W tym wpisie przedstawię jak w prosty sposób dodać własny preloader do naszej aplikacji, pozbywając się domyślnego &#8211; moim zdaniem brzydkiego :) &#8211; preloadera.</p>
<p><span id="more-115"></span></p>
<p>Na początek spójrzmy jak będzie wyglądał <a title="Custom preloader" href="http://blog.na14.pl/examples/sphere/bin/panorama_sphere.html" target="_blank">nasz preloader.</a></p>
<p>Aby osiągnąć taki cel musimy:</p>
<ol>
<li>Stworzyć klasę która dziedziczy po DownloadProgressBar lub implementuje IPreloaderDisplay</li>
<li>Zaimplementować w niej odpowiednie metody</li>
<li>Dodać nasz preloader do aplikacji</li>
</ol>
<p>Najłatwiej będzie zacząć od końca. Aby dodać nasz preloader do aplikacji, należy go wpisać w jej tagu.</p>
<pre class="brush:xml">&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" preloader="my.loader.MyPreloader"&gt;</pre>
<p>Jak widać mój preloader znajduje się w pakiecie <em>my.loader</em> i nazywa się <em>MyPreloader</em>. W moim przypadku dziedziczy on po klasie <em>Sprite</em>, tak żebym mógł po nim rysować i implementuje interfejs <em>IPreloaderDisplay</em>.</p>
<pre class="brush:js">package my.loader {
  public class MyPreloader extends Sprite implements IPreloaderDisplay {
  }
}</pre>
<p>Gdy tworzymy klasę dziedziczącą po <em>Sprite </em>i implementującą <em>IPreloaderDisplay</em>, to otrzymujemy pakiet wygenerowanych funkcji. Wiekszość z nich możemy usunąć i zostawić:</p>
<pre class="brush:js">        private var _backgroundColor	: uint = 0x000000;
        private var _stageHeight		: Number = 1;
        private var _stageWidth			: Number = 1;

        public function set backgroundAlpha(alpha:Number):void{}
        public function get backgroundAlpha():Number { return 1; }

        public function set backgroundColor(color:uint):void { _backgroundColor = color; }
        public function get backgroundColor():uint { return _backgroundColor; }

        public function set backgroundImage(image:Object):void {}
        public function get backgroundImage():Object { return null; }

        public function set backgroundSize(size:String):void {}
        public function get backgroundSize():String { return "auto"; }

        public function set stageHeight(height:Number):void { _stageHeight = height; }
        public function get stageHeight():Number { return _stageHeight; }

        public function set stageWidth(width:Number):void { _stageWidth = width; }
        public function get stageWidth():Number { return _stageWidth; }</pre>
<p>Dodatkowo musimy zmodyfikowac metody <em>set preloader </em>oraz<em> initialize</em><em>. </em>W metodzie <em>set preloader </em>musimy ustawić eventy dla preloadera.</p>
<pre class="brush:js">    private var _preloader			: Sprite;

    public function set preloader(value:Sprite):void {
            _preloader = value;

            value.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            value.addEventListener(Event.COMPLETE, completeHandler);

            value.addEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler);
            value.addEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler);
        }</pre>
<p>W metodzie<em> initialize </em>wypełniam tło białym prostokątem, wczytuje plik loga oraz inicjuje <em>Timer</em>, który będzie wywoływany co 50ms, aby update&#8217;ować stan preloadera.</p>
<pre class="brush:js">        public function initialize():void {
		//Wypełnienie tła
		graphics.beginFill( _backgroundColor, 1);
 		graphics.drawRect( 0, 0, stageWidth, stageHeight);
		graphics.endFill();

                loadingImage = new flash.display.Loader();
		loadingImage.contentLoaderInfo.addEventListener( Event.COMPLETE, loader_completeHandler); //metoda wywołana jak obrazek sie wczyta
		loadingImage.load(new URLRequest("../assets/logo.jpg")); // Scieżka do obrazka
        }</pre>
<p>Po wczytaniu obrazka umieszczam go na środku preloadera, zaś label z wartością procentową (początkowo równą 0) umieszczam zaraz pod nim.</p>
<pre class="brush:js">        private var _timer 				: Timer;

        private function loader_completeHandler(event:Event):void
        {
            addChild(loadingImage);
            loadingImage.x = stage.fullScreenWidth / 2 - loadingImage.width / 2;
            loadingImage.y = stage.fullScreenHeight / 3 - loadingImage.height / 2;

	    loadingText = new TextField();
	    loadingText.width = 20;
	    loadingText.height = 20;
	    loadingText.autoSize = TextFieldAutoSize.CENTER;
	    loadingText.text = "0";
	    loadingText.textColor = 0x0000ff;
    	    loadingText.x = stage.fullScreenWidth / 2 - loadingText.width / 2;
	    loadingText.y = loadingImage.y + loadingImage.height + 20;
	    addChild(loadingText);

            _timer = new Timer(50);
            _timer.addEventListener(TimerEvent.TIMER, timerHandler);
            _timer.start();
        }</pre>
<p>Timer, który zainicjowaliśmy w metodzie <em>initialize</em>, ma za zadanie odświeżenie labela oraz obrysowanie go paskami widocznymi na przykładzie, do którego link podałem powyżej.</p>
<pre class="brush:js">        private var _fractionLoaded 	: Number = 0;
        private var _IsInitComplete		: Boolean = false;

        private function timerHandler(event:Event):void {
            if ( _IsInitComplete ) {
                _timer.stop();
                _timer.removeEventListener(TimerEvent.TIMER,timerHandler);

		dispatchEvent(new Event(Event.COMPLETE));
            }
            else {
            	loadingText.text = Math.ceil(_fractionLoaded*100).toString();
            	loadingText.x = stage.fullScreenWidth / 2 - loadingText.width / 2;

            	// Tutaj następuje przerysowanie pasków otaczających label, kod prezentuje na końcu wpisu
                draw();
            }
        }</pre>
<p>Preloader dostarcza nam 4 zdarzenia, które wywołuje w odpowiednim czasie. Są to:</p>
<ol>
<li>progressHandler &#8211; wywoływany za każdym razem, gdy przeglądarka ściągnie kolejną część aplikacji</li>
<li>completeHandler &#8211; wywoływany, gdy aplikacja skończy się ściągać</li>
<li>initProgressHandler &#8211; wywoływana podczas postępu inicjalizacji</li>
<li>initCompleteHandler &#8211; wywoływana, gdy inicjalizacja się zakończy</li>
</ol>
<p>Naszym zadaniem jest implementacja metod <em>progressHandler </em>oraz <em>initCompleteHandler. </em>W<em> progressHandler </em>updatujemy pola odpowiedzialne za procent wczytania aplikacji:</p>
<pre class="brush:js">        private var _bytesLoaded 		: uint = 0;
        private var _bytesExpected 		: uint = 1;

       private function progressHandler(event:ProgressEvent):void {
            _bytesLoaded = event.bytesLoaded;
            _bytesExpected = event.bytesTotal;
            _fractionLoaded = Number(_bytesLoaded) / Number(_bytesExpected);
        }</pre>
<p>W metodzie <em>initCompleteHandler</em> ustawiamy pole odpowiedzialne za zakończenie działania preloadera na <em>true</em>. Dzięki temu nasz Timer, może zakończyć działanie. Robi to poprzez wywołanie zdarzenia Event.COMPLETE, tak jak to widać w metodzie <em>timerHandler</em>.</p>
<pre class="brush:js">        private function initCompleteHandler(event:Event):void {
        	_IsInitComplete = true;
        }</pre>
<p>Teraz zaprezentuje metody, które używam to obrysowania labela paskami, które tworzą koło. Niestety nie można we Flexie rysować częściowych kół (coś a&#8217;la pizza bez kawałka). Mój sposób polega na tym, żeby rysować od trójkąty z jednym punktem wspólnym w środku, zaś kolejnymi parami punktów dookoła labela.</p>
<pre class="brush:js">        private function draw():void {
            graphics.clear();

            fillAct(graphics, stage.fullScreenWidth / 2, loadingText.y + loadingText.height/2, _fractionLoaded*360 , 25);
            graphics.beginFill( 0xffffff , 1);
	    graphics.drawCircle(stage.fullScreenWidth / 2, loadingText.y + loadingText.height/2, 20);
            graphics.endFill();
        }

        private function fillAct(g:Graphics, x:Number, y:Number, angle:Number, radius:Number):void {
        	var trCounts:Number = Math.ceil(angle / 5);
        	var radFrom:Number, radTo:Number;

        	g.beginFill(0x000000);
        	for (var i:int = 0; i &lt; trCounts; i+=2) {
        		radFrom = -i*5*Math.PI / 180;
        		radTo = (-i*5 + 5)*Math.PI / 180;

        		g.moveTo(x,y);
        		g.lineTo(x + Math.sin(radFrom)*radius, y + Math.cos(radFrom)*radius);
        		g.lineTo(x + Math.sin(radTo)*radius, y + Math.cos(radTo)*radius);
        		g.lineTo(x,y);
        	}
        	g.endFill();
        }</pre>
<p>Ten kod po złączeniu daje efekt zaprezentowany w przykładzie :) Mam nadzieje, że wszystko jest zrozumiałe. W razie pytań, proszę komentować :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/custom-preloader/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przesyłanie danych z Flexa do PHP za pomocą XMLa</title>
		<link>http://blog.flexmaniak.pl/flex_i_php/przesylanie-danych-z-flexa-do-php-za-pomoca-xmla</link>
		<comments>http://blog.flexmaniak.pl/flex_i_php/przesylanie-danych-z-flexa-do-php-za-pomoca-xmla#comments</comments>
		<pubDate>Sun, 25 Oct 2009 14:31:02 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Flex i PHP]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=20</guid>
		<description><![CDATA[Nie samym Flexem i ActionScriptem programista żyje dlatego czasem musi zwrócić się do innych technologii. W komunikacji na linii Flex &#8211; PHP z pomocą przychodzą nam XML, JSON i AMFPHP. W tym wpisie zajmiemy się pierwszym z trójcy czyli XMLem. FLEX 3.0, PHP 5.3.0 W celu zaprezentowania mechanizmu komunikacji na linii Flex – PHP za [...]]]></description>
			<content:encoded><![CDATA[<p>Nie samym Flexem i ActionScriptem programista żyje dlatego czasem musi zwrócić się do innych technologii. W komunikacji na linii Flex &#8211; PHP z pomocą przychodzą nam XML, JSON i AMFPHP. W tym wpisie zajmiemy się pierwszym z trójcy czyli XMLem.<br />
<span id="more-20"></span><br />
FLEX 3.0, PHP 5.3.0<br />
<embed src="http://blog.na14.pl/examples/flex_xml_php/FLEX_XML_PHP.swf" width="100%" height="270"></embed></p>
<p>W celu zaprezentowania mechanizmu komunikacji na linii Flex – PHP za pomocą XMLa posłużymy się prostą aplikacją, która będzie posiadała dwa pola tekstowe i jedną listę oraz przycisk wysyłający dane z tych komponentów do skryptu PHP.</p>
<p>Na początek stworzymy graficzny interfejs naszej apliakcji.</p>
<p>Będziemy potrzebować usługi HTTP przesyłającej dane do skryptu PHP. Usługa HTTP będzie mieć dwa zdarzenia “result” i “fault”, z których każde będzie wyświetlać alert boxa odpowiednio z rezultatem działania skryptu i informacją o niepowodzeniu w wykonaniu usługi.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&lt;</span>mx:HTTPService id=<span style="color: #ff0000;">&quot;httpService&quot;</span> resultFormat=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #0066CC;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/phpScript.php&quot;</span> result=<span style="color: #ff0000;">&quot;httpServiceResult(event)&quot;</span> fault=<span style="color: #ff0000;">&quot;httpServiceFault(event)&quot;</span><span style="color: #66cc66;">/&gt;</span></div></div>
<p>Dalej zgodnie z założeniami dodamy dwa pola tekstowe.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;TextInput 1:&quot;</span><br />
&nbsp;x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;12&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
<span style="color: #66cc66;">&lt;</span>mx:TextInput id=<span style="color: #ff0000;">&quot;textInput1&quot;</span> <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;textInput1&quot;</span><br />
&nbsp;x=<span style="color: #ff0000;">&quot;134&quot;</span> y=<span style="color: #ff0000;">&quot;10&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;98&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
<span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;TextInput 2:&quot;</span><br />
&nbsp;x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;42&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
<span style="color: #66cc66;">&lt;</span>mx:TextInput id=<span style="color: #ff0000;">&quot;textInput2&quot;</span> <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;textInput2&quot;</span><br />
&nbsp;x=<span style="color: #ff0000;">&quot;134&quot;</span> y=<span style="color: #ff0000;">&quot;40&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;98&quot;</span><span style="color: #66cc66;">/&gt;</span></div></div>
<p>Edytowalna listę wypełnioną przykładowymi danymi. DataProvider będzie znajdował się w zewnętrznym pliku ActionScript.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">List</span> dataProvider=<span style="color: #ff0000;">&quot;{listDataProvider}&quot;</span> editable=<span style="color: #ff0000;">&quot;true&quot;</span><br />
x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;70&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;183&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;156&quot;</span><span style="color: #66cc66;">/&gt;</span></div></div>
<p>Oraz przycisk wysyłający dane do pliku PHP.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">Button</span> label=<span style="color: #ff0000;">&quot;Wyslij&quot;</span> click=<span style="color: #ff0000;">&quot;send()&quot;</span><br />
x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;234&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;183&quot;</span><span style="color: #66cc66;">/&gt;</span></div></div>
<p>Na koniec jeszcze musimy dodać referencję do pliku z kodem ActionScript i pierwszą część pracy mamy za sobą.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&lt;</span>mx:Script source=<span style="color: #ff0000;">&quot;FLEX_XML_PHP_Script.as&quot;</span> <span style="color: #66cc66;">/&gt;</span></div></div>
<p>A tak wygląda to w całości.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&lt;</span>mx:Application xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #66cc66;">&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:Script source=<span style="color: #ff0000;">&quot;FLEX_XML_PHP_Script.as&quot;</span> <span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:HTTPService id=<span style="color: #ff0000;">&quot;httpService&quot;</span> resultFormat=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #0066CC;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/phpScript.php&quot;</span> result=<span style="color: #ff0000;">&quot;httpServiceResult(event)&quot;</span> fault=<span style="color: #ff0000;">&quot;httpServiceFault(event)&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">List</span> dataProvider=<span style="color: #ff0000;">&quot;{listDataProvider}&quot;</span> editable=<span style="color: #ff0000;">&quot;true&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;70&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;183&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;156&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">Button</span> label=<span style="color: #ff0000;">&quot;Wyslij&quot;</span> click=<span style="color: #ff0000;">&quot;send()&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;234&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;183&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:TextInput id=<span style="color: #ff0000;">&quot;textInput1&quot;</span> <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;textInput1&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; x=<span style="color: #ff0000;">&quot;134&quot;</span> y=<span style="color: #ff0000;">&quot;10&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;98&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:TextInput id=<span style="color: #ff0000;">&quot;textInput2&quot;</span> <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;textInput2&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x=<span style="color: #ff0000;">&quot;134&quot;</span> y=<span style="color: #ff0000;">&quot;40&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;98&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;TextInput 1:&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;12&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;TextInput 2:&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x=<span style="color: #ff0000;">&quot;50&quot;</span> y=<span style="color: #ff0000;">&quot;42&quot;</span><span style="color: #66cc66;">/&gt;</span><br />
<span style="color: #66cc66;">&lt;/</span>mx:Application<span style="color: #66cc66;">&gt;</span></div></td></tr></tbody></table></div>
<p>Drugi etap na naszej drodze to zbudowanie kodu ActionScript, który to wszystko obsłuży.</p>
<p>Tworzymy DataProvider z przykładowymi danymi dla naszej listy.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span> <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> listDataProvider:ArrayCollection = <span style="color: #000000; font-weight: bold;">new</span> ArrayCollection<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;A&quot;</span>,<span style="color: #ff0000;">&quot;B&quot;</span>,<span style="color: #ff0000;">&quot;C&quot;</span>,<span style="color: #ff0000;">&quot;D&quot;</span>,<span style="color: #ff0000;">&quot;E&quot;</span>,<span style="color: #ff0000;">&quot;F&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Definiujemy funkcję wysyłającą dane do skryptu PHP. Na początku deklarujemy zmienną, która będzie przechowywać nasz kod XML i ustawiamy jej węzeł główny na .</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">xml</span>:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Wartość pierwszego pola tekstowego posłuży nam do ustawienia atrybutu o nazwie textInput1 dla węzła</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">xml</span>.<span style="color: #66cc66;">@</span>textInput1 = textInput1.<span style="color: #0066CC;">text</span>;</div></div>
<p>Wartość drugiego pola tekstowego użyjemy do nadania wartości nowemu węzłowi dodanemu do naszej struktury XML za pomocą operatora kropki.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">xml</span>.<span style="color: #006600;">textInput2</span> = textInput2.<span style="color: #0066CC;">text</span>;</div></div>
<p>W celu połączenia danych z listy w ciąg XML użyjemy metody encodeValue klasy SimpleXMLEncoder. Metoda encodeValue przyjmuje trzy parametry: obiekt do serializacji, nazwę węzła w którym umieści zserializowany obiekt oraz zmienną typu XMLDocument, w której zostanie zapisany wynikowy kod XML. Nowy węzeł do naszej struktury XML dodamy za pomocą metody appendChild.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> qName:QName = <span style="color: #000000; font-weight: bold;">new</span> QName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;list&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> xmlDocument:XMLDocument = <span style="color: #000000; font-weight: bold;">new</span> XMLDocument<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> simpleXMLEncoder:SimpleXMLEncoder = <span style="color: #000000; font-weight: bold;">new</span> SimpleXMLEncoder<span style="color: #66cc66;">&#40;</span>xmlDocument<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">xmlNode</span>:<span style="color: #0066CC;">XMLNode</span> = simpleXMLEncoder.<span style="color: #006600;">encodeValue</span><span style="color: #66cc66;">&#40;</span>listDataProvider.<span style="color: #006600;">source</span>, qName, xmlDocument<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">list</span>:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span>xmlDocument.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #0066CC;">xml</span>.<span style="color: #0066CC;">appendChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">list</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Na koniec dodajemy nasz kod XML do zmiennej typu Object, która zostanie przekazana do skryptu PHP.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">object</span>:<span style="color: #0066CC;">Object</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #0066CC;">object</span>.<span style="color: #0066CC;">xml</span> = <span style="color: #0066CC;">xml</span>.<span style="color: #006600;">toXMLString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
httpService.<span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">object</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Całość prezentuje się następująco:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">collections</span>.<span style="color: #006600;">ArrayCollection</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">collections</span>.<span style="color: #006600;">XMLListCollection</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">controls</span>.<span style="color: #006600;">Alert</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">FaultEvent</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">ResultEvent</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #0066CC;">xml</span>.<span style="color: #006600;">SimpleXMLEncoder</span>;<br />
<br />
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span> <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> listDataProvider:ArrayCollection = <span style="color: #000000; font-weight: bold;">new</span> ArrayCollection<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;A&quot;</span>,<span style="color: #ff0000;">&quot;B&quot;</span>,<span style="color: #ff0000;">&quot;C&quot;</span>,<span style="color: #ff0000;">&quot;D&quot;</span>,<span style="color: #ff0000;">&quot;E&quot;</span>,<span style="color: #ff0000;">&quot;F&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">xml</span>:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">//Dodanie atrybutu za pomocą .@</span><br />
<span style="color: #0066CC;">xml</span>.<span style="color: #66cc66;">@</span>textInput1 = textInput1.<span style="color: #0066CC;">text</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">//Dodanie węzła za pomocą .</span><br />
<span style="color: #0066CC;">xml</span>.<span style="color: #006600;">textInput2</span> = textInput2.<span style="color: #0066CC;">text</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">//Dodanie węzła za pomocą .appendChild</span><br />
<span style="color: #000000; font-weight: bold;">var</span> qName:QName = <span style="color: #000000; font-weight: bold;">new</span> QName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;list&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> xmlDocument:XMLDocument = <span style="color: #000000; font-weight: bold;">new</span> XMLDocument<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> simpleXMLEncoder:SimpleXMLEncoder = <span style="color: #000000; font-weight: bold;">new</span> SimpleXMLEncoder<span style="color: #66cc66;">&#40;</span>xmlDocument<span style="color: #66cc66;">&#41;</span>;<br />
simpleXMLEncoder.<span style="color: #006600;">encodeValue</span><span style="color: #66cc66;">&#40;</span>listDataProvider.<span style="color: #006600;">source</span>, qName, xmlDocument<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">list</span>:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span>xmlDocument.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #0066CC;">xml</span>.<span style="color: #0066CC;">appendChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">list</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">//Wyslanie XML'a do skryptu PHP</span><br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">object</span>:<span style="color: #0066CC;">Object</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #0066CC;">object</span>.<span style="color: #0066CC;">xml</span> = <span style="color: #0066CC;">xml</span>.<span style="color: #006600;">toXMLString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
httpService.<span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">object</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span> <span style="color: #808080; font-style: italic;">//send</span><br />
<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> httpServiceResult<span style="color: #66cc66;">&#40;</span>event:ResultEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>event.<span style="color: #006600;">result</span>.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,<span style="color: #ff0000;">&quot;HTTP Service Result&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span> <span style="color: #808080; font-style: italic;">//httpServiceResult</span><br />
<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> httpServiceFault<span style="color: #66cc66;">&#40;</span>event:FaultEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>event.<span style="color: #006600;">fault</span>.<span style="color: #006600;">faultString</span>,<span style="color: #ff0000;">&quot;HTTP Service Fault&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span> <span style="color: #808080; font-style: italic;">//httpServiceFault</span></div></td></tr></tbody></table></div>
<p>Pozostaje nam jeszcze tylko napisać prosty skrypt PHP, który przetworzy i wyświetli otrzymany kod XML. Ponieważ klasa XMLReader jest opisana w manualu PHP dlatego daruję sobie rozkład poniżeszego skryptu na czynniki pierwsze i zamiast tego odeślę do wspomnianego źródła: <a href="http://php.net/manual/en/book.xmlreader.php">XMLReader PHP Manual</a></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$xml</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XMLReader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">XML</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/stripslashes"><span style="color: #990000;">stripslashes</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;xml&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeType</span> <span style="color: #339933;">==</span> XMLReader<span style="color: #339933;">::</span><span style="color: #004000;">ELEMENT</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;root&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;TextInput 1: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;textInput1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;item&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;item: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">value</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;textInput2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;TextInput 2: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$xml</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">value</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex_i_php/przesylanie-danych-z-flexa-do-php-za-pomoca-xmla/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
