<?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; AMF3</title>
	<atom:link href="http://blog.msdevstudio.net/tag/amf3/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; Conclusão e opinião!</title>
		<link>http://blog.msdevstudio.net/2009/04/01/zendamf-conclusao-e-opiniao/</link>
		<comments>http://blog.msdevstudio.net/2009/04/01/zendamf-conclusao-e-opiniao/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 11:59:31 +0000</pubDate>
		<dc:creator>Mário Santos</dc:creator>
				<category><![CDATA[Action Script & MXML]]></category>
		<category><![CDATA[Air]]></category>
		<category><![CDATA[Análises]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA's Geral]]></category>
		<category><![CDATA[Action Script]]></category>
		<category><![CDATA[AMF0]]></category>
		<category><![CDATA[AMF3]]></category>
		<category><![CDATA[amfphp]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zendAMF]]></category>

		<guid isPermaLink="false">http://msdevstudio.com/blog/?p=899</guid>
		<description><![CDATA[      Depois do meu post ZendAMF &#8211; Novidade, analise (vs amfPHP) e tutorial e depois de mer finalmente terminado a migração completa de um CRM/ERP de php+javascript/ajax+myslq para o flex usando o zendAMF venho aqui dar uma opinião pessoal depois de ter trabalhado bastante com o zendAMF e com o amfPHP. Se o que eu [...]]]></description>
			<content:encoded><![CDATA[<p> <br />
<center><br />
<a href="http://framework.zend.com/download/amf"><img title="ZendAMF" src="http://framework.zend.com/images/logo_small.gif" alt="ZendAMF" width="123" height="23" /></a></center></p>
<p> </p>
<p> </p>
<p>Depois do meu post <a title="Permalink para ZendAMF - Novidade, analise (vs amfPHP) e tutorial" rel="bookmark" href="http://msdevstudio.com/blog/2009/01/31/zendamf-novidade-analise-vs-amfphp-e-tutorial/">ZendAMF &#8211; Novidade, analise (vs amfPHP) e tutorial</a> e depois de mer finalmente terminado a migração completa de um CRM/ERP de php+javascript/ajax+myslq para o flex usando o zendAMF venho aqui dar uma opinião pessoal depois de ter trabalhado bastante com o zendAMF e com o amfPHP.</p>
<p>Se o que eu queria dizer era: o zendAMF é muito melhor que o amfPHP, eu não o posso dizer, mas passo a explicar o porquê anotando algumas ideias que até já tinha trocado com o fabio vedovelli.</p>
<p>Bem, o zendAMF deu-me a ideia de ser muito mais rapido, simples e leve,  mas com um grande problema, como não têm explorer como o amfPHP pode  tornar-se muito mais complicado, principalmente na deteçao de erros que  foi realmente o que me deu mais trabalho. A ausencia  deste explorer e da não visialização dos erros do php, leva a que se  faça uma grande atenção à programação do php, levando assim a que  melhoremos a nossa &#8220;maneira&#8221; de programar php, embora compreenda que não só para iniciantes seja um GRANDE problema. Eu próprio para desvendar alguns dos erros do  php tive que recorrer aos logs do apache&#8230;.</p>
<p>Outro dos pontos que me pareceram menos bons, foi encontrar alguns  problemas com a passagem de um arrayCollection do as3 pro zendAMF que  por vezes chega ao zendAMF em objecto e outras vezes em array composto,  (sim, o mesmo arrayCollection) o que nos leva a ter que tratar o mesmo arrayCollection de maneiras  diferentes, quer como $dadosDoAs3-&gt;campo1 quer como  $dadosDoAs3['campo1'], o que nos leva a ter que criar mais umas linhas de código no php mas nada que uma simples comparação com os  is_object() ou is_array() do php não resolvesse, embora tenha que estar  a fazer esta verificação sempre que passo um arrayCollection ou um  Array/Objecto de multi-linhas/camadas o que me deu algum desconforto principalmente por perca de tempo, coisa que no amfPHP não aconteceria.</p>
<p>De resto, 5 estrelas, muito mais simples na hora de trabalhar com  funções da mesma classe, ou aceder a definições nas diferentes classes  no mesmo servidor, coisa que não era possivel no amfPHP, quanto ao  mapeamento de objectos, agora ficou brincadeirinha de criança.</p>
<p>o Sistema/estrutura de pastas é simples e muito mais flexivel, podendo ou não ter uma estrutura de pastas com as classes, o que torna muito simples a organização do nosso jeito. Notei ainda um ou outro ponto menos bom, mas nada que afectasse o sistema ou o funcionamento final da aplicação.</p>
<p>Notas finais, o zendAMF demonstrou ainda estar a caminhar para atingir a perfeição e assume muitos pontos iguais ao amfPHP, mas tende mais para a simplificação o que me agrada imenso e deve agradar aos seguidores do amfPHP. Por outro lado, ainda com os defeitos em cima será com certeza um obstaculo aos que se estão a iniciar. Bom, o amfPHP é melhor em muitos pontos &#8220;easy-to-use&#8221; , mas dificilmente voltarei ao usa-lo, zendAMF é a minha aposta agora. </p>
<p>Fica a minha opinião.</p>
<p>Abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.msdevstudio.net/2009/04/01/zendamf-conclusao-e-opiniao/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<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>

