Artigos com o marcador Zend Framework
Minizend – Aplicação Demo
29/04/10
No video abaixo apresento a aplicação de Distribuição de Fornecedores que irei desenvolver durante o mini curso online de Flex e Zend Framework (#minizend).
O curso ocorrerá neste sábado, dia 05/06. Para quem não se matriculou ainda, não se preocupe, pois ainda há tempo! Acesse www.riacycle.com/zend e garanta sua vaga.
[Fiel Cookbook] Manipulando Datas entre Flex e PHP
22/04/10
Problema
Temos um DateField no Flex e queremos enviar a data selecionada para o PHP como um objeto Date e não somente uma simples string no fomato DD/MM/YYYY. Enviando o objeto Date, teremos o benefício de ter todas as informações de Timezone, GMT e etc para serem manipuladas futuramente via backend.
Solução
Para resolvermos nosso problema, devemos utilizar o Zend Amf para serialização/deserialização de objetos entre Flex e PHP. No Flex simplesmente usaremos a propriedade selectedDate do DateField para selecionarmos o objeto Date e após enviar ao PHP via RemoteObject. O Zend Amf terá o papel de converter este objeto para Zend Date e vice versa.
Explicação Detalhada
Obs.: O ViewSource está habilitado no exemplo abaixo para quem quiser acompanhar melhor esta explicação.
1º – Capturamos o objeto Date pela propriedade selectedDate do DateField e enviamos para o PHP.
FlexPHPDate.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html"> <mx:Script> <![CDATA[ import mx.controls.Alert; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; public function getTimezone():void { remote.getTimezone(dt.selectedDate); } public function getTimestamp():void { remote.getTimestamp(dt.selectedDate); } protected function remote_resultHandler(event:ResultEvent):void { Alert.show(event.result.toString()); } ]]> </mx:Script> <mx:DateField id="dt" formatString="DD/MM/YYYY" /> <mx:Button label="Get Timezone" click="getTimezone()" enabled="{ dt.selectedDate != null }" /> <mx:Button label="Get UNIX timestamp" click="getTimestamp()" enabled="{ dt.selectedDate != null }" /> <mx:RemoteObject id="remote" destination="zend" endpoint="../gateway.php" source="DateService" result="remote_resultHandler(event)"/> </mx:Application> |
2º – Recebemos o objeto Date no PHP já convertido para Zend_Date. Isso é feito automaticamente pelo Zend_Amf.
DateService.php (está localizando dentro da pasta /services/)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php class DateService { public function getTimezone(Zend_Date $date) { return $date->getTimezone(); } public function getTimestamp(Zend_Date $date) { return $date->getTimestamp(); } } |
Exemplo da Solução: Ao selecionarmos a data e selecionando Get Timezone, mandaremos para o PHP o objeto Date e após o PHP enviará para nós um timestamp desta data atravéz do Zend_Date. Acontece o mesmo para Get UNIX Timestamp.
Baixe aqui o projeto Flex incluindo o PHP: FlexPHPDate.zip
Observações Finais
Esta prática é interessante para manipularmos o mesmo objeto Date de uma linguagem para outra, com várias informações de Timezone, GMT e etc, como citados acima.
Abraços a todos e até o próximo Fiel Cookbook.
Palestra Flex + PHP usando Zend Amf (Flex Mania)
09/07/09
Olá pessoal! Já está disponível a gravação da minha palestra sobre Flex + PHP usando Zend Amf no grande evento da Flex Mania. Peço desculpas pelo nervosismo, mas esta foi minha primeira palestra e tentei focar no objetivo que era integrar o Flex e PHP com o Zend Amf.
Os slides e o app de exemplo segue abaixo para download.
Agradeço a todos que me apoiaram e ao Igor Costa que me deu esta oportunidade para participar de um grande evento como foi o Flex Mania.
Acesse minha palestra aqui: http://tinyurl.com/lnphvc
Slides: http://tinyurl.com/m52dh6
App: http://tinyurl.com/m5xbrx
Também não percam as outras palestras do Flex Mania… é imperdível!!! Acesse e Assista: www.flexmania.com.br
Maior atualização do Zend Amf (1.8.4 release)
01/07/09
É bom estar de olho nas atualizações do Zend Framework, que sempre corrige bugs ou adiciona uma nova funcionalidade ou plugin para uso. Desde então é a maior atualização do componente Zend Amf desde o seu lançamento.
Atualmente o Zend Framework na versão 1.8.4 recebeu muitas alterações no componente Zend Amf que vale a pena ficar atento e testar novas funcionalidades ou verificar as correções efetuadas. Veja abaixo as alterações:
Maiores Alterações
ZF-6641 Shared references are duplicated
ZF-6205 Serializer does not support cyclic references
ZF-6393 Wrong Amf0_Amf3 reference counting
ZF-5382 Multiple calls seems to break the deserializer.
ZF-6625 Zend Amf can load any instantiated PHP class. Security
Menores alterações, mas significantes
ZF-6975 Adobe Flash Builder 4 wizard now supports data types for introspection.
ZF-6992 Negative integers on 64 bit system is resolved.
ZF-6775 Unable to send Array’s from Blaze DS.
Ainda foi detectado um bug nesta nova versão 1.8.4. Quando usado o método addDirectory() a classe a ser chamada pára de carregar. Isso já foi resolvido, mas será lançado amanhã dia 2 de julho a correção. Veja abaixo a solução para este problema:
Substitua o Zend/Loader/PluginLoader.php pela nova versão localizada em
http://framework.zend.com/svn/framework/standard/branches/release-1.8/library/Zend/Loader/PluginLoader.php
======== Atualização 7 de Julho ========
Liberada a versão que resolve o problema do método addDirectory:
http://devzone.zend.com/article/4808-Zend-Framework-1.8.4pl1-Now-Available
Fontes:
http://wadearnold.com/blog/flash/amfphp/major-zend-amf-updates-for-184-release
http://wadearnold.com/blog/flash/zf-184-breaks-adddirectory
Integrando Flex + Zend Framework (Usando o Quickstart da Zend) – PARTE 3
18/05/09
Olá pessoal, na Parte 2 tinha mostrado como criar o componente Zend AMF para comunicarmos com o Flex. Então vamos ao Flex e dar a continuidade a essa integração.
No seu Eclipse, selecione a perspectiva Flex Development e logo clique com o direito do mouse sobre o projeto PHP ZendFrameworkQuickstart. No menu selecione Flex Project Nature > Add Flex Project Nature, conforme a imagem abaixo.

No nosso projeto não será necessário selecionar a tecnologia, pois não iremos rodar o projeto diretamente do Eclipse e sim diretamente pelo browser, como pode ver a imagem abaixo.
Prosseguindo coloque o seu Output Folder a pasta public, aonde acessaremos diretamente nossa aplicação Flex.
Clicando em Finish será criado a pasta “src” dentro do projeto e abrirá o arquivo ZendFrameworkQuickstart.mxml. Caso ocorra algum erro no Eclipse de “Cannot create HMTL wrapper…” que não criou a pasta “html-template”, clicamos com o botão direito em cima da linha do erro e selecionamos a opção “Recreate HTML Templates”.

Na Application ZendFrameworkQuickstart criamos um simples botão e em seguida criaremos um RemoteObject no próprio MXML.
ZendFrameworkQuickstart.mxml
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:RemoteObject id="ro" destination="zend" endpoint="http://localhost/guestbook/gateway/amf" source="HelloFlexService" /> <mx:Button label="Chamar PHP" verticalCenter="0" horizontalCenter="0" /> </mx:Application> |
Veja o código acima, criei o RemoteObject passando o Endpoint com a url “http://localhost/guestbook/gateway/amf” que nada mais é a nossa action que configuramos o componente Zend AMF para se comunicar com o Flex, também foi adicionado a propriedade “source” com o nome da classe PHP que desejamos chamar, neste caso é a “HelloFlexService”.
Feito isso, vamos colocar uma ação de click no Botão e iremos chamar o método “helloFlex” que está na classe “HelloFlexService”.
ZendFrameworkQuickstart.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Alert; public function chamarPhp():void{ //chama o método helloFlex ro.helloFlex(); } ]]> </mx:Script> <mx:RemoteObject id="ro" destination="zend" endpoint="http://localhost/guestbook/gateway/amf" source="HelloFlexService" result="Alert.show(event.result.toString())" /> <mx:Button label="Chamar PHP" click="chamarPhp()" verticalCenter="0" horizontalCenter="0" /> </mx:Application> |
Como pode ver criei um método chamarPhp que será chamado quando eu clicar no botão e dentro do método chamamos o RemoteObject de id “ro” e em seguida invocamos o método que está lá na classe HelloFlexService, chamado helloFlex.
Já aproveitei e adicionei um evento de result no RemoteObject, colocando um Alert para exibir o resultado vindo do método invocado. Salve a Application ZendFrameworkQuickstart e antes de acessar a url “http://localhost/guestbook/ZendFrameworkQuickstart.html” para rodar nossa aplicação Flex, vamos ao GatewayController e adicionaremos no método init() a linha de código “$this->_helper->layout()->disableLayout();”, veja abaixo como ficará o seu GatewayController:
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //linha adicionada para evitar que o layout seja exibido $this->_helper->layout()->disableLayout(); //devemos adicionar isso para evitar a renderização da view $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ $server = new Zend_Amf_Server(); $server->addDirectory(APPLICATION_PATH . '/services/'); echo($server->handle()); } } |
Abrindo parenteses e explicando essa nova linha adicionada, ela evita que o layout HTML do nosso projeto Zend seja enviado para o arquivo AMF, atrapalhando nossa requisição entre Flex e PHP, pois ocorrerá um erro se tentar rodar sem desabilitar o layout do projeto. Poderá até fazer um teste rodando o nosso Endpoint “http://localhost/guestbook/gateway/amf” pelo browser e ver que o arquivo AMF terá dentro o layout HTML mais a string “Zend Amf Endpoint” e para que funcione corretamente a requisição AMF deve conter apenas a string “Zend Amf Endpoint”, fechando parenteses.
Agora sim rode a aplicação Flex pela URL “http://localhost/guestbook/ZendFrameworkQuickstart.html” e clique no botão Chamar PHP e verá como resultado o Alert exibindo o result do método helloFlex, que será a seguinte frase “Olá Flex, estou usando o Zend AMF!”.
Bom pessoal, o exemplo foi simples, mas pretendo fazer a parte 4 que mostrará como fazer a camada view do Quickstart em Flex. Abraços e até breve.
Integrando Flex + Zend Framework (Usando o Quickstart da Zend) – PARTE 2
16/05/09
Olá pessoal, estou de volta, não tive muito tempo esses últimos dias, mas prometo nos próximos dias honrar o meu sobrenome e ser fiel aos posts rsrs. Bom brincadeiras a parte, mas vamos o que interessa, que é continuar esta série de integrar o Flex com o Zend Framework usando um projeto já construído, neste caso estou usando o Quickstart da Zend.
Recomendo que você leia a parte 1 antes de continuar lendo este post.
Bom antes de dar continuidade e ir diretamente ao código, precisamos criar um novo projeto PHP no Eclipse, chamado ZendFrameworkQuickstart e apontar a pasta aonde está nosso Quickstart que baixamos anteriormente, no meu caso é “c:\wamp\apps\ZendFrameworkQuickstart”.

Criado o projeto, temos que configurar finalmente nosso componente Zend AMF. Para isso criamos um novo controller chamado “GatewayController” e logo em seguida seu método chamado “amfAction” veja abaixo:
GatewayController.php
1 2 3 4 5 6 7 8 | <?php class GatewayController extends Zend_Controller_Action { public function amfAction(){ } } |
Como podemos ver, o GatewayController é um controller comum como os outros, ele extende de Zend_Controller_Action e ele será o nosso Endpoint para comunicar com o Flex. Claro, ainda não acontecerá nada porque temos que instanciar nosso componente Zend AMF e faremos isso dentro da action “amf” que acabamos de criar. Para instanciar devemos primeiramente importar a classe Zend_Amf_Server e após instanciá-la. Aproveitando criei o método init() padrão do Zend Framework para importar a classe e também tirar a renderização do layout.
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //remove a renderização do layout da página $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ //criamos a instancia do componente Zend AMF $server = new Zend_Amf_Server(); } } |
Agora deveremos indicar a pasta aonde ficará todas as nossas classes PHP que farão comunicação com o Flex, mas antes disso vamos criar esta pasta, eu sugiro criar dentro de application para padronizar a estrutura. Esta pasta poderá chamar-se “services”.
Criada a pasta voltamos ao GatewayController e usamos o método “addDirectory” do nosso componente Zend AMF e em seguida passamos o caminho completo da nossa pasta “services”. Veja:
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //remove a renderização do layout da página $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ //criamos a instancia do componente Zend AMF $server = new Zend_Amf_Server(); $server->addDirectory(APPLICATION_PATH . '/services/'); } } |
Percebem-se que coloquei a constante APPLICATION_PATH para indicar o caminho completo até a pasta “application”, isso já está configurado no nosso index.php (Arquivo front-controller do Quickstart). Então o método “addDirectory” mapeia toda a pasta “services” indicando que ali estão todas as classes que terão acesso ao Flex e vice versa.
Precisamos agora fazer o Zend AMF conectar com o Flex através do método “handle”, para isso devemos imprimi-lo na tela para que aja a manipulação dos dados AMF.
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //remove a renderização do layout da página $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ //criamos a instancia do componente Zend AMF $server = new Zend_Amf_Server(); $server->addDirectory(APPLICATION_PATH . '/services/'); echo($server->handle()); } } |
Pronto, agora você pode testar em seu navegador, a url “http://localhost/guestbook/gateway/amf” e deverá obter uma solicitação de download de um arquivo “amf” do tipo AMF. Se editá-lo verá que está escrito Zend Amf Endpoint. Isso significa que está funcionando até então nossa comunicação entre Zend e Flex.
Vamos criar a nossa classe PHP que desejamos comunicar com o Flex.
Crie um novo arquivo PHP dentro da pasta “services” chamado de “HelloFlexService” e respectivamente o mesmo nome para a classe. Em seguida criamos um método chamado “helloFlex” e colocamos um simples return “Olá Flex, estou usando o Zend AMF!”.
HelloPhpService.php
1 2 3 4 5 6 7 8 | <?php class HelloFlexService { public function helloFlex(){ return 'Olá Flex, estou usando o Zend AMF!'; } } |
Feito! No próximo post estarei mostrando para vocês como chamar esta classe no Flex e exibir o seu conteúdo. Desta vez eu não demoro rsrs, aguardem…
Integrando Flex + Zend Framework (Usando o Quickstart da Zend) – PARTE 1
29/04/09
Olá pessoal, estou aí para mais um post e agora postando um artigo interessante e que muitos ainda gostariam de saber como integrar uma aplicação Zend Framework com o Adobe Flex. Vou dividir este post em partes e de inicio vamos configurar o nosso Quickstart para que possam prosseguir na integração com nosso Flex.
Lembrando que não vou ensinar como configurar o ambiente Zend Framework, pois não é objetivo deste post.
Primeiramente vou citar o que você precisará para que tudo funcione perfeitamente:
1º – Baixe o Quickstart no site do Zend Framework:
http://framework.zend.com/docs/quickstart
2º – Descompacte o arquivo aonde desejar, de preferência em um local aonde você conheça o caminho do diretório completo.
3º – Caso ainda não tenha a library do Zend Framework, você pode baixar aqui:
http://framework.zend.com/download/latest
Pode baixar o pacote minimal, pois conterá somente o que precisamos.
4º – Basta você pegar a pasta library do Zend Framework que acabou de baixar e sobrescreva a que está em seu ZendFrameworkQuickstart.
5º – Então precisamos configurar a aplicação Quickstart para que funcione sem erros, para isso devemos configurar para que a pasta Public dentro de ZendFrameworkQuickstart seja o nosso diretório raiz do servidor. Para evitar que alteramos as configurações de nosso servidor, podemos criar um Alias, que agora mostrarei a maneira que eu fiz usando o Wamp, sendo que você pode fazer da maneira que preferir desde que funcione perfeitamente a aplicação Quickstart.
Se você usa o Wamp existe um diretório chamado “alias” e dentro dele possui 2 arquivos .conf que se refere aos alias do phpmyadmin e sqlite. Crie uma cópia de um dos arquivos .conf e crie o seu alias, apontando a pasta public do ZendFrameworkQuickstart. Em meu caso ficou desta maneira:
Arquivo guestbook.conf
Alias /guestbook "c:/wamp/apps/ZendFrameworkQuickstart/public/" # to give access to guestbook from outside # replace the lines # # Order Deny,Allow # Deny from all # Allow from 127.0.0.1 # # by # # Order Allow,Deny # Allow from all # Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Deny from all Allow from 127.0.0.1
Após isso vá até seu arquivo .htaccess dentro da pasta Public de seu ZendFrameworkQuickStart e altere a última linha que contém “RewriteRule ^.*$ index.php [NC,L]” e troque por “RewriteRule ^.*$ /guestbook/index.php [NC,L]” adicionando na frente o seu alias, no meu caso “/guestbook/”.
Reinicie o seu servidor e após acesse a url http://localhost/guestbook
Se você está visualizando em seu navegador a seguinte frase “Welcome to the Zend Framework!”, parabéns você conseguiu fazer funcionar o QuickStart da Zend. Se não conseguiu, peço que reveja os passos acima ou comente este post dizendo o problema que ocorreu.
Bom pessoal, por enquanto é isso, em breve estarei postando a Parte 2, aonde mexeremos com o Zend_Amf.


