<?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>TSW - That Should Work Blog &#187; php5</title>
	<atom:link href="http://blog.msdevstudio.net/tag/php5/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.msdevstudio.net</link>
	<description>Flash, Flex, Web e Aplicações Ricas para Internet!</description>
	<lastBuildDate>Tue, 07 Feb 2012 18:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>ZendAMF &#8211; Novidade, analise (vs amfPHP) e tutorial</title>
		<link>http://blog.msdevstudio.net/2009/01/31/zendamf-novidade-analise-vs-amfphp-e-tutorial/</link>
		<comments>http://blog.msdevstudio.net/2009/01/31/zendamf-novidade-analise-vs-amfphp-e-tutorial/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 15:10:36 +0000</pubDate>
		<dc:creator>Mário Santos</dc:creator>
				<category><![CDATA[Action Script & MXML]]></category>
		<category><![CDATA[Air]]></category>
		<category><![CDATA[Certificaçao Flex]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RIA's Geral]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AMF0]]></category>
		<category><![CDATA[AMF3]]></category>
		<category><![CDATA[amfphp]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[vs]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://msdevstudio.com/blog/?p=822</guid>
		<description><![CDATA[Este é o mais recente logo de uma das frameworks de php mais conceituadas da actualidade. Não vou falar da framework apesar desta ter muito que falar, mas vou falar sim de um componente AMF desta nova framework intitulado ZendAMF, que como o amfPHP serve para comunicação de dados do PHP com a plataforma Flash. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://framework.zend.com/"><br />
<img class="aligncenter" title="Zend Framework" src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" border="0" alt="" width="127" height="25" /></a></p>
<p style="text-align: left;">Este é o mais recente logo de uma das frameworks de php mais conceituadas da actualidade. Não vou falar da framework apesar desta ter muito que falar, mas vou falar sim de um componente AMF desta nova framework intitulado ZendAMF, que como o amfPHP serve para comunicação de dados do PHP com a plataforma Flash.<br />
Tudo isto deve-se à politica de globalização da plataforma flash por parte da Adobe, que <a href="http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf" target="_blank">abriu o formato AMF para a comunidade</a>. Nas bastando isso, a adobe ainda se aliou à Zend e junto com um dos autores do <a href="http://www.amfphp.org/about.html" target="_blank">amfPHP</a> &#8211; (Wade Arnold) &#8211; desenvolveram uma aliaça conjunta que resultou no Zend AMF que depois de ter <a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Amf+-+Wade+Arnold" target="_blank">passado do papel</a> veio a publico com o seu<a href="http://framework.zend.com/download/amf" target="_blank"> download</a> disponibilizado oficialmente na pagina da zend.</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">Apesar de a minha primeira impressão ter sido absurdamente rude (não gostei do impacto de tanta pasta no ficheiro de download) depois de apenas uns minutos de volta do sistema reparei que o seu uso ainda é mais simples que o amfPHP, e pelas experiencias que fiz parece ser mais rápido que o amfPHP, nao esquecendo também a necessidade absoluta do PHP5.</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">Apenas vasculhei os ficheiros o suficiente para vos demonstrar o simples uso no flex deste novo ZendAMF.</p>
<p style="text-align: left;">Vamos então a um pequeno tutorial&#8230; </p>
<p style="text-align: left;"><span id="more-822"></span></p>
<p style="text-align: left;">- O primeiro passo é fazer o <a href="http://framework.zend.com/download/amf" target="_blank">download do zendAMF</a>.</p>
<p style="text-align: left;">- De seguida, ter um servidor *AMP:  Apache + MySQL + PHP (5)</p>
<p style="text-align: left;">- Finalmente seguir os passos seguintes atentamente:</p>
<p style="text-align: left;">Antes de configurar as minhas pastas, vou explicar o meu sistema: Tenho o WAMP Server instalado na pasta <strong>C:\wamp</strong>, com o domain &#8220;<strong>localhost</strong>&#8221; e a raiz do servidor em <strong>c:\wamp\www </strong></p>
<p style="text-align: left;">Vou então à minha pasta do www e crio uma pasta <strong>flex</strong> e dentro dela um <strong>testTend </strong>ficando com os caminhos<strong>: c:\wamp\www\flex\testZend</strong></p>
<p style="text-align: left;">Abram o arquivo que fizeram download : <strong>ZendAMF-1.7.3.zip </strong>percorram a pasta <strong>library/</strong> e extraiam apenas a pasta <strong>Zend</strong> para <strong>c:\wamp\www\flex\testZend.</strong> Esta é a pasta necessaria ao funcionamento do zendAMF<strong>, </strong>como se fosse a pasta &#8220;amfphp&#8221; do amfPHP. Vou agora explicar o funcionamento deste zendAMF, que ao contrario do amfPHP não possui uma estrutura obrigatória de pastas, mas para que ele funcione devidamente teremos que providenciar alguns detalhes como um gateway e uma classe.</p>
<p style="text-align: left;"><em><strong>O conhecido amfPHP usa um ficheiro gateway.php para definir as classes e estruturas de dados e que regra geral nao temos que mexer nele, o zendAMF não usa e nem sequer traz este gateway.php, mas teremos de criar um ficheiro que funciona +- da mesma maneira. Para isso criem um ficheiro index.php (será o nosso gateway) e dentro dele coloquem o código seguinte:</strong></em></p>
<p style="text-align: left;"> </p>
<p><coolcode lang="php" linenum="off"><br />
<?php<br />
        //debug, nao necessário<br />
	error_reporting(E_ALL | E_STRICT);<br />
	ini_set("display_errors", "on");</p>
<p>        //importa o server, servidor ZendAMF e de seguida importa a nossa class (serviço no amfPHP) TutorialZend<br />
	require_once "Zend/Amf/Server.php";<br />
	require_once "TutorialZend.php";</p>
<p>        //inicia o servidor e de seguida indica que a nossa class TutorialZend deve fazer parte do zendAMF para serializar<br />
	$server = new Zend_Amf_Server();<br />
	$server->setClass(&#8220;TutorialZend&#8221;);</p>
<p>        //necessário para que o flex/flash identifique o endPoint.<br />
	echo($server->handle());<br />
?><br />
</coolcode></p>
<p>Este é o nosso gateway, onde importo a minha primeira class: <strong>require_once &#8220;TutorialZend.php&#8221;;</strong> e onde digo ao &#8220;Servidor AMF&#8221; que deve usa-la: <strong>$server-&gt;setClass(&#8220;TutorialZend&#8221;);</strong></p>
<p>Para mais que uma class basta usarem repetidamente os comandos, require_once &#8220;minha_classe_2.php&#8221;; e $server-&gt;setClass(&#8220;minha_class_2&#8243;); ficando também estas acessiveis no zendAMF para remoting.</p>
<p>Guardem o ficheiro como <strong>index.php</strong> na pasta: <strong>c:\wamp\www\flex\testZend\</strong> e vamos agora criar a nossa primeira classe, que aqui sim funciona como no amfPHP, neste caso criar a class necessária ao gateway, a classe TutorialZend (.php) criando entao o ficheiro <strong>TutoriaZend.php</strong> onde vamos escrever uma função para ir buscar dados a uma tabela users, escrevendo o seguinte:</p>
<p><coolcode lang="php" linenum="off"><br />
 <?php</p>
<p>define("DATABASE_SERVER", "localhost");</p>
<p>//definam a vossa password e nome de utilizador<br />
define("DATABASE_USERNAME", "username");<br />
define("DATABASE_PASSWORD", "password");</p>
<p>define("DATABASE_NAME", "zend");</p>
<p>	class TutorialZend {<br />
                //esta é uma das diferenças entre amfPHP e o zendAMF, aqui é usado o __construct() em vez do nome da class, TutorialZend().<br />
		public function __construct() {<br />
			$mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD);<br />
			mysql_select_db(DATABASE_NAME);<br />
		}</p>
<p>                //função para buscar os dados à bd mysql.<br />
		public function getUsers() {</p>
<p>			$query = "SELECT id, nome, email FROM users";<br />
		$result = mysql_query($query);</p>
<p>		$res = array();</p>
<p>		while ($row = mysql_fetch_assoc($result)) {<br />
				array_push($res, $row);<br />
			}</p>
<p>		mysql_free_result($result);<br />
		return $res;</p>
<p>		}<br />
	}<br />
?><br />
</coolcode><br />
 </p>
<p>E temos a nossa class feita. Só fica mesmo a faltar a nossa base de dados zend e a nossa tabela users, para isso criem a base de dados <strong>zend</strong> e executem a seguinte instrução:</p>
<p><coolcode lang="sql" linenum="off"><br />
CREATE TABLE IF NOT EXISTS `users` (  `id` int(11) NOT NULL auto_increment,  `nome` varchar(255) NOT NULL,  `email` varchar(255) default NULL,  PRIMARY KEY  (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;</p>
<p>INSERT INTO `users` (`id`, `nome`, `email`) VALUES (1, &#8216;Mario&#8217;, &#8216;admin@msdevstudio.com&#8217;), (2, &#8216;Ze carlos&#8217;, &#8216;zecarlos@sic.pt&#8217;), (3, &#8216;Antonio&#8217;, &#8216;antoni@rail-uk.com&#8217;), (4, &#8216;Sousa&#8217;, &#8216;sfranco@spo.pt&#8217;);<br />
</coolcode></p>
<p>E pronto, temos a tabela users já com dados&#8230; só falta mesmo ligar o flex ao nosso zend.</p>
<p> </p>
<p>No flex basta criarem um novo projecto,</p>
<p>File-&gt;New-&gt;Flex Project colocando o nome <strong>testZend </strong>escolhendo como server type :<strong> PHP</strong>, clicando em seguinte basta introduzir as cordenadas que usei em cima:</p>
<p><strong>Web Root:</strong> C:\wamp\www\flex\testZend e <strong>Web Root URL:</strong> http://localhost/flex/testZend cliquem em Validate Configuration e depois em Finish.</p>
<p>O projecto está criado, e para que o flex se ligue ao zend AMF é necessário também um ficheiro <strong>services-config.xml</strong> o qual podem encontrar em baixo e onde definimos o nosso gateway, neste caso o index.php podendo ou nao enumera-lo:</p>
<p> <br />
<coolcode lang="xml" linenum="off"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<services-config><br />
    <services><br />
        <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"><br />
            <destination id="zend"><br />
                <channels><br />
                    <channel ref="my-zend"/><br />
                </channels></p>
<properties>
                    <source>*</source>
                </properties>
            </destination><br />
        </service><br />
    </services><br />
    <channels><br />
        <channel-definition id="my-zend" class="mx.messaging.channels.AMFChannel"><br />
            <endpoint uri="http://localhost/flex/testZend/" class="flex.messaging.endpoints.AMFEndpoint"/><br />
        </channel-definition><br />
    </channels><br />
</services-config><br />
</coolcode></p>
<p> </p>
<p>Salvem o arquivo services-config.xml na pasta <strong>src</strong> ao lado do <strong>zendTest.mxml</strong></p>
<p>Finalmente, coloquem-no como argumento na compilação, indo ao menu Project-&gt;Properties-&gt;Flex Compiler-&gt;Aditional compiler arguments, colocando  <strong>-locale en_US -services &#8220;services-config.xml&#8221;</strong> cliquem em Apply e o nosso projecto esta pronto a trabalhar com o zendAMF, basta usarem o código normal no amfPHP como remoteObject, mas definindo o destination como <strong>zend.</strong> Vejam o segunte código<strong> testZend.mxml</strong>:</p>
<p> <br />
<coolcode lang="actionscript" linenum="off"></p>
<p><?xml version="1.0" encoding="utf-8"?><br />
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html"><br />
	<mx:Script><br />
		<![CDATA[<br />
			import mx.rpc.events.FaultEvent;<br />
			import mx.rpc.events.ResultEvent;<br />
			import mx.controls.Alert;</p>
<p>			private function testZendIt():void {<br />
				myZendService.getUsers();<br />
			}</p>
<p>			private function onResultado(res:ResultEvent):void {</p>
<p>				var objRes:Object = res.result as Object;<br />
				myZendGrid.dataProvider=objRes;<br />
			}</p>
<p>			private function onErro(erro:FaultEvent):void {<br />
				 Alert.show(erro.toString());<br />
			}</p>
<p>		]]&gt;<br />
	</mx:Script><br />
	<mx:RemoteObject id="myZendService" destination="zend" source="TutorialZend" ><br />
		<mx:method name="getUsers" result="onResultado(event)" fault="onErro(event)" /><br />
	</mx:RemoteObject><br />
	<mx:Canvas width="344" height="254" borderColor="#FFFFFF" backgroundColor="#FFFFFF" horizontalCenter="0" verticalCenter="0"><br />
		<mx:Button x="20" y="19" label="Call Zend" click="testZendIt();" width="302"/><br />
		<mx:DataGrid x="20" y="49" id="myZendGrid"><br />
			<mx:columns><br />
				<mx:DataGridColumn headerText="Id" dataField="id"/><br />
				<mx:DataGridColumn headerText="Nome" dataField="nome"/><br />
				<mx:DataGridColumn headerText="Email" dataField="email"/><br />
			</mx:columns><br />
		</mx:DataGrid><br />
		<mx:Image x="20" y="208" source="PoweredBy_ZF_4LightBG.png"/><br />
		<mx:Label x="217" y="199" text="ZEND AMF Tutorial"/><br />
		<mx:Label x="194" y="215" text="www.msdevstudio.com"/><br />
	</mx:Canvas><br />
</mx:Application></p>
<p></coolcode></p>
<div><strong>Basta correm-no e clicar no botão &#8220;Call Zend&#8221; para a vossa tabela ser preenchida com os dados do mysql vindos directinhos no php via ZendAMF como mostra a imagem em baixo <img src='http://blog.msdevstudio.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></div>
<div style="text-align: center;"></div>
<div style="text-align: center;"><strong><img class="aligncenter size-full wp-image-823" title="testZend; ZendAMF Tutorial" src="http://msdevstudio.com/blog/wp-content/uploads/2009/01/testzend.jpg" alt="testZend; ZendAMF Tutorial" width="326" height="241" /><br />
</strong></div>
<div></div>
<div><strong>Simples hein?</strong></div>
<div></div>
<p style="text-align: left;">
<div>Uma das grandes vantagens do uso do zendAMF é a possibilidade de mapear VO&#8217;s directamente na class Servidor, usando apenas:<strong> $server-&gt;setClassMap(&#8220;VOUser&#8221;, &#8220;VOUser&#8221;); </strong>($server-&gt;setClassMap(&#8220;AS3Classe&#8221; , &#8220;PHPClasse&#8221;);) mas isso fica para a próxima.</div>
<div></div>
<p style="text-align: left;">
<div>Podem ver o projecto final online <a href="http://www.msdevstudio.com/blog/flexSource/testZend/testZend.html" target="_blank">aqui</a>, fazer o download do projecto <a href="http://www.msdevstudio.com/blog/flexSource/testZend/testZend.zip">aqui,</a> o download do gateway: <a href="http://www.msdevstudio.com/blog/flexSource/testZend/index.rar">index.php</a> e da classe <a href="http://www.msdevstudio.com/blog/flexSource/testZend/TutorialZend.rar" target="_blank">TutorialZend.php.</a></div>
<div></div>
<p style="text-align: left;">
<div>Espero que seja util, e já agora contem as vossas experiencias&#8230; será que é um substituto à altura do amfPHP ?</div>
<p> 
<div></div>
<p style="text-align: left;">
<p>Na minha opinião pessoal acho o zendAMF menos pesado, mais rapido e até mais simples de usar visto que podemos definir a estrutura de dados e classes&#8230; mas bom, ainda só estudei um pouco&#8230; brevemente darei mais noticias&#8230;.</p>
<p>Abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.msdevstudio.net/2009/01/31/zendamf-novidade-analise-vs-amfphp-e-tutorial/feed/</wfw:commentRss>
		<slash:comments>61</slash:comments>
		</item>
	</channel>
</rss>

