logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Dez 27

Flex com PHP usando ZendAMF – Zend_Db

Escrito por Leonardo França em .NET, 1, 2.0, 2009, 4, abas, action, Actionscript, Actionscript 3.0, Actionscript3, Adobe, Adobe Flex, AMF, amfphp, AR, Artigo, Banco de Dados, C#, catch, class, classe, classes, dados, email, exemplo, filter, Flex, framework, function, Google, handle, html, if, image, int, Java, lista, live, mg, mysql, O, on, Password, PHP, pt, Ria’s Geral, S+S, server, site, TAT, Tema, try, UI, uint, update, Ved, zend, Zend Amf, zendAMF, zendFramework @ 12 27th, 2011 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

O artigo Adobe Flex com PHP usando ZendAMF – primeiros passos teve como objetivo exemplificar a integração do Flex com PHP para quem já tinha sistemas desenvolvidos usando o AMFPHP, por isso não usei as classes para acesso a banco de dados do ZendFramework. Neste artigo mostrarei o mesmo exemplo mas usando exclusivamente ZendFramework.

Pegarei o mesmo exemplo utilizado no artigo anterior, só modificando a classe PHP para usar as classes de abstração de banco de dados do ZendFramework. Começaremos com nosso gateway.php

PLAIN TEXT
PHP:

  1. require_once ‘Zend/Config.php’;
  2. require_once ‘Zend/Db.php’;
  3. require_once ‘Zend/Amf/Server.php’;
  4. require_once ‘Zend/Amf/Exception.php’;
  5. require_once ‘Zend/Amf/Server.php’;
  6. $server = new Zend_Amf_Server();
  7. $server->setProduction(false);
  8. $server->setClass(‘Contato’);
  9. echo($server->handle());
  10. ?>

Executando o link no seu navegador, deve aparecer a seguinte mensagem:

Zend Amf Endpoint

Em seguida, modificaremos em nossa classe principal, que efetuará as operações de listar, inserir, apagar e atualizar os dados do nosso banco:

PLAIN TEXT
PHP:

  1. /*
  2. * author Leonardo França
  3. * site http://www.leonardofranca.com.br
  4. */
  5. class Contatos
  6. private $db;
  7. private $config;
  8. private $select;
  9. private $stmt;
  10. function __construct()
  11. $params['host'] = ‘localhost’;
  12. $params['dbname'] = ‘java’;
  13. $params['username'] = ‘root’;
  14. $params['password'] = ”;
  15. $database['adapter'] = ‘Mysqli’;
  16. $database['params'] = $params;
  17. $data['database'] = $database;
  18. $this->config = new Zend_Config($data);
  19. $this->db = Zend_Db::factory($this->config->database);
  20. public function getData()
  21. try
  22. $this->select = $this->db->select();
  23. $this->select->from(‘tabela’,array(‘id’,‘nome’,‘email’));
  24. $this->stmt = $this->select->query();
  25. $result = $this->stmt->fetchAll();
  26. return $result;
  27. catch (Exception $e)
  28. throw new Exception($e->getMessage());
  29. }
  30. public function insertData($data=array())
  31. try
  32. $dados = array(
  33. ‘nome’ => $data['nome'],
  34. ‘email’ => $data['email']
  35. );
  36. $retorno = $this->db->insert(‘tabela’, $dados);
  37. return $retorno;
  38. catch (Exception $e)
  39. throw new Exception($e->getMessage());
  40. }
  41. public function deleteData($data=array())
  42. try
  43. $retorno = $this->db->delete(‘tabela’, ‘id = ‘.$data['id']);
  44. return $retorno;
  45. catch (Exception $e)
  46. throw new Exception($e->getMessage());
  47. }
  48. public function updateData($data=array())
  49. try
  50. $dados = array(
  51. ‘nome’ => $data['nome'],
  52. ‘email’ => $data['email']
  53. );
  54. $where['id = ?'] = $data['id '];
  55. return $this->db->update(‘tabela’, $dados, $where);
  56. catch (Exception $e)
  57. throw new Exception($e->getMessage());
  58. }
  59. }
  60. ?>

No ActionScript só precisaremos mudar o que será passado para o PHP, ao inves de VOs, mandaremos Arrays:

PLAIN TEXT
ACTIONSCRIPT3:

  1. public function insertData():void
  2. var contatosVO:Array = [];
  3. contatosVO['nome']= input_nome.text;
  4. contatosVO['email'] = input_email.text;
  5. ro.insertData(contatosVO);

Referências:
http://framework.zend.com/manual/en/zend.db.adapter.html

Nov 16

LCCS e PHP com ZendAMF

Escrito por Leonardo França em .NET, 1, 2.0, 4, Adobe, AMF, amfphp, AR, Artigo, Artigos, C#, catch, class, classe, classes, developer, Documentação, exemplo, Exemplos, flash, Flex, Flex 4, for, framework, function, handle, image, int, Java, Javascript, live, LiveCycle, Mercado, mg, O, on, Password, PHP, player, portal, programação, pt, rest, RIA, Ria’s Geral, S+S, SDK, server, swf, Teste, try, UI, web, zend, zendAMF, zendFramework @ 11 16th, 2011 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

O Adobe LiveCycle Collaboration Service possui em seu SDK, exemplos de integração com as principais linguagens de programação web do mercado como PHP, Java, Python, etc.
Na documentação da Adobe, é recomendado o uso do AMFPHP ou o PHP puro mesmo, mas nada impede de usar tranquilamente em conjunto com o ZendFramework (usando ZendAMF)
Ryan Stewart escreveu dois artigos mostrando a implementação com PHP e REST.

  • http://ria.dzone.com/articles/integrating-php-flash
  • http://ria.dzone.com/articles/php-flash-rest

Uma observação sobre o artigo de Ryan, no Flex 4, Adobe passou a usar o swfobject, então o modo de pegar os parâmetros via URL e passar para o SWF fica desse modo:

PLAIN TEXT
JAVASCRIPT:

  1. var xiSwfUrlStr = “playerProductInstall.swf”;
  2. var flashvars = ;
  3. flashvars.roomURL = swfobject.getQueryParamValue(“roomURL”);
  4. flashvars.authToken = swfobject.getQueryParamValue(“authToken”);
  5. var params = ;

No SDK do LCCS, existe um arquivo chamado lccs.php, basta copiar para o mesmo diretório em que você já usa suas classes. Em seguida, adicionar o include no arquivo gateway.php

PLAIN TEXT
PHP:

  1. require_once ‘Zend/Amf/Server.php’;
  2. require_once ‘lccs.php’;
  3. require_once ‘Test.php’;
  4. /** Bootstrap */
  5. // Instantiate server
  6. $server = new Zend_Amf_Server();
  7. $server->setProduction(false);
  8. $server->setClass(‘Test’);
  9. // Handle request
  10. echo($server->handle());
  11. ?>

E está é uma simples classe para teste chamando o método que retorna o token para autenticação.

PLAIN TEXT
PHP:

  1. class Test
  2. private $account;
  3. private $room;
  4. private $devUsername;
  5. private $devPassword;
  6. private $secret;
  7. //$accountURL = “https://collaboration.adobelivecycle.com/$account”;
  8. private $accountURL;
  9. private $roomURL;
  10. function __construct()
  11. //for LCCS
  12. $this->account = “Your SDK account username from LCCS developer portal”;
  13. $this->room = “The room you want to connect to”;
  14. $this->devUsername = “Your LCCS developer account username”;
  15. $this->devPassword = “Your LCCS developer account password”;
  16. $this->secret = “The shared secret from the LCCS developer portal”;
  17. //$accountURL = “https://collaboration.adobelivecycle.com/$account”;
  18. $this->accountURL = “http://connectnow.acrobat.com/$this->account“;
  19. $this->roomURL = “$this->accountURL/$this->room“;
  20. public function getToken($data=array())
  21. try
  22. $this->account = new RTCAccount($this->accountURL);
  23. $this->account->login($this->devUsername,$this->devPassword);
  24. $session = $this->account->getSession($data['room']);
  25. $displayName = $data['displayName'];
  26. $username = $data['username'];
  27. $role = $data['role'];
  28. $token = $session->getAuthenticationToken($this->secret, $displayName, $username, $role);
  29. return $token;
  30. catch (Exception $e)
  31. throw new Exception($e->getMessage());
  32. }
  33. }
  34. ?>
Jun 1

Como analisar/debugar o retorno AMF pelo FireFox

Escrito por Daniel Schmitz em 1, 2.0, 4, 6, AMF, AR, back, BI, botão, bug, C#, dados, Debug, Desenvolvedor, err, erro, error, exemplo, explorer, firefox, Flex, for, IE, image, int, Java, lite, mg, O, on, Pessoal, PHP, pt, Ria’s Geral, RoR, S+S, server, servidor, super(), Tutorial, UI, Ved, XP, zend, zendAMF @ 06 1st, 2011 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Pessoal, tenho recebido muitas dúvidas de como analizar o retorno AMF do java/php, causando principalmente aquele erro “Server Fault”.

Algo OBRIGATÓRIO que todo desenvolvedor deve conhecer é uma forma de estar sempre atento ao retorno AMF e isso pode ser realizado de diversas formas. A mais simples delas é a integração Firefox + Firebug + AMF Explorer e iremos mostrar a seguir como fazer isso.

Primeiro, instale o firefox: http://br.mozdev.org/

Segundo, instale o firebug: https://addons.mozilla.org/pt-br/firefox/addon/firebug/

Terceiro, instale o AMF Explorer: https://addons.mozilla.org/pt-br/firefox/addon/amf-explorer/

Reinicie o firefox (tanto para o firebug quanto para o amf explorer) e então carregue a sua aplicação Flex. Clique no botão do firebug, que na versão 4 está no canto superior direito da tela. Navegue até a aba “Rede” e habilite-a:

image

Quando for realizar a conexão, limpe as entradas que já tenham acontecido, e faça a conexão AMF. Procure pelo seu gateway, que é o arquivo PHP ou Java que faz a conexão com o servidor. Expanda-o e veja se existe algo semelhante a figura a seguir:

image

Veja que, quanto expandimos o POST zendamf.php (no seu caso pode ser POST gateway.php), surge o AMF Request e o AMF Response. O AMF Response contém os dados que retornaram do servidor, conforme o exemplo a seguir:

image

Se houver algum erro de PHP, este erro estará na mensagem também, então ao invés de ver um erro genérico “Server Fault”, você verá o fatal error do php/java que foi gerado.

Out 18

Upload de arquivos com Adobe Flex e Zend AMF

Escrito por Leonardo França em .NET, 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Actionscript3, Adobe, Adobe Flex, AMF, apache, api, app, AR, arte, Artigo, back, bar, BI, Bindable, boolean, carregar, catch, class, classe, comunicação, control, Controls, custom, Download, err, erro, error, event, EventListener, events, filter, flash, Flex, for, framework, function, Google, handle, html, ide, IE, if, image, int, Java, Javascript, label, library, lite, live, map, mg, MXML, O, on, PHP, procura, progress, pt, reference, Remoting, Ria’s Geral, RoR, server, spark, string, Tema, Teste, TextInput, try, UI, utils, Ved, Widget, Widgets, Wordpress, XML, XP, zend, Zend Amf, zendAMF, zendFramework @ 10 18th, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



O Zend AMF é uma implementação feita em PHP[bb]para se trabalhar com o protocolo de comunicação binário AMF(Action Message Format) fazendo parte do ZendFramework. Precisei implementar um sistema de upload de arquivos que fosse um pouco diferente do que normalmente é usado no Adobe Flash, sendo que essa funcionalidade precisava ser integrada no Zend AMF.

Pesquisando um pouco na net, achei a solução que foi mais simples do que eu imaginava baseada nesse artigo com algumas poucas adaptações.

Começaremos pelo nosso gateway que será usado como endpoint no Adobe Flex.

PLAIN TEXT
PHP:

  1. <?php
  2. require_once ‘Zend/Amf/Server.php’;
  3. require_once ‘Zend/Amf/Exception.php’;
  4. require_once ‘br/com/leonardofranca/vo/FileVO.php’;
  5. require_once ‘br/com/leonardofranca/UploadZendAMF.php’;
  6.  
  7. $server = new Zend_Amf_Server();
  8. $server->setProduction(false);
  9.  
  10. $server->setClass(‘UploadZendAMF’);
  11.  
  12. $server->setClassMap(‘FileVO’,"br.com.leonardofranca.vo.FileVO");
  13.  
  14. echo($server->handle());
  15. ?>

Agora o nosso VO com propriedades com nome do arquivo e os binarios.

PLAIN TEXT
PHP:

  1. <?php
  2. class FileVO
  3. {
  4.     public $_explicitType = ‘br.com.leonardofranca.vo.FileVO’;
  5.     public $fileName;
  6.     public $fileData;
  7.    
  8.     function __construct ()
  9.     {}
  10.    
  11.     public function getFileName()
  12.     {
  13.         return $this->fileName;
  14.     }
  15.  
  16.     public function setFileName($fileName)
  17.     {
  18.         $this->fileName = $fileName;
  19.     }
  20.  
  21.     public function getFileData()
  22.     {
  23.         return $this->fileData;
  24.     }
  25.  
  26.     public function setFileData($fileData)
  27.     {
  28.         $this->fileData = $fileData;
  29.     }
  30. }
  31. ?>

Agora nossa classe PHP que ser responsavél por efetudar o upload.

PLAIN TEXT
PHP:

  1. <?php
  2. class UploadZendAMF  
  3. {
  4.     public function __construct()
  5.     {
  6.      
  7.     }
  8.    
  9.     public function upload(FileVO $data)
  10.     {
  11.         try
  12.         {
  13.             $fileData = $data->getFileData();
  14.             file_put_contents( ‘C:\apache\htdocs\images\’ . $data->getFileName(), $fileData);
  15.             return true;   
  16.         }
  17.         catch (Exception $e)
  18.         {
  19.             throw new Exception($e->getMessage());
  20.         }
  21.     }
  22. }
  23. ?>

Agora vamos a camada de visão usando o Adobe Flex, começamos com nosso VO.

PLAIN TEXT
ACTIONSCRIPT3:

  1. package br.com.leonardofranca.vo
  2. {
  3.     import flash.utils.ByteArray;
  4.  
  5.     [Bindable]
  6.     [RemoteClass(alias="br.com.leonardofranca.vo.FileVO")]
  7.     public class FileVO
  8.     {
  9.         private var _fileName:String;
  10.         private var _fileData:ByteArray;
  11.        
  12.         public function FileVO()
  13.         {
  14.         }
  15.  
  16.         public function get fileName():String
  17.         {
  18.             return _fileName;
  19.         }
  20.  
  21.         public function set fileName(value:String):void
  22.         {
  23.             _fileName = value;
  24.         }
  25.  
  26.         public function get fileData():ByteArray
  27.         {
  28.             return _fileData;
  29.         }
  30.  
  31.         public function set fileData(value:ByteArray):void
  32.         {
  33.             _fileData = value;
  34.         }
  35.  
  36.     }
  37. }

Agora nosso mxml que carregará os bytes do arquivo para enviar para o Zend AMF.

PLAIN TEXT
MXML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
  3.                xmlns:s="library://ns.adobe.com/flex/spark"
  4.                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)">
  5.     <fx:Declarations>
  6.         <!– Place non-visual elements (e.g., services, value objects) here –>
  7.     </fx:Declarations>
  8.     <fx:Script>
  9.         <![CDATA[
  10.             import br.com.leonardofranca.vo.FileVO;
  11.            
  12.             import mx.controls.Alert;
  13.             import mx.events.FlexEvent;
  14.             import mx.rpc.events.FaultEvent;
  15.             import mx.rpc.events.ResultEvent;
  16.             import mx.rpc.remoting.mxml.RemoteObject;
  17.             import mx.utils.ObjectUtil;
  18.            
  19.             private var ro:RemoteObject;
  20.             private var fileRef:FileReference;
  21.             private var fileTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg)", "*.jpg; *.jpeg");
  22.             private var allTypes:Array = new Array(fileTypes);
  23.  
  24.            
  25.             protected function application1_creationCompleteHandler(event:FlexEvent):void
  26.             {
  27.                 ro = new RemoteObject();
  28.                 ro.destination = "nao faz diferença nenhuma usando com Zend AMF";
  29.                 ro.endpoint = "http://localhost:81/ZendAmf/teste_upload.php";
  30.                 ro.source = "br.com.leonardofranca.UploadZendAMF";
  31.                 ro.addEventListener(ResultEvent.RESULT, handlerResult);
  32.                 ro.addEventListener(FaultEvent.FAULT, handlerFault);
  33.                
  34.                 btnProcurar.addEventListener(MouseEvent.CLICK, handlerUpload);
  35.                 btnSend.addEventListener(MouseEvent.CLICK, uploadVideos);
  36.             }
  37.            
  38.             protected function handlerUpload(evt:MouseEvent=null):void
  39.             {
  40.                 fileRef = new FileReference();
  41.                 fileRef.addEventListener(Event.SELECT,selectHandler);
  42.                 //          fileRef.addEventListener(Event.COMPLETE,completeHandler);
  43.                 //          fileRef.addEventListener(ProgressEvent.PROGRESS,progressHandler);
  44.                 fileRef.browse(allTypes);
  45.             }
  46.            
  47.             protected function selectHandler(evt:Event):void
  48.             {
  49.                 txtFile.text = fileRef.name;
  50.                 fileRef.load();
  51.             }
  52.            
  53.             protected function uploadVideos(evt:MouseEvent=null):void
  54.             {
  55.                 var data:ByteArray = new ByteArray();
  56.                 fileRef.data.readBytes(data,0,fileRef.data.length);
  57.                
  58.                 var vo:FileVO = new FileVO();
  59.                 vo.fileName = fileRef.name;
  60.                 vo.fileData = data;
  61.                
  62.                 ro.upload(vo);
  63.             }
  64.            
  65.             protected function handlerResult(re:ResultEvent):void
  66.             {
  67.                 trace(ObjectUtil.toString(re.message.body));
  68.                 if(Boolean(re.message.body))
  69.                 {
  70.                     Alert.show("Arquivo enviado com sucesso!","Sucesso!");
  71.                 }
  72.                 else
  73.                 {
  74.                     Alert.show("Não foi possivel enviar o arquivo!","Error!");
  75.                 }
  76.             }
  77.            
  78.             protected function handlerFault(fault:FaultEvent):void
  79.             {
  80.                 Alert.show(fault.fault.faultString,"Error!");
  81.             }
  82.            
  83.         ]]>
  84.     </fx:Script>
  85.     <mx:Form>
  86.         <mx:FormItem label="Envio de arquivos" direction="horizontal">
  87.             <s:TextInput id="txtFile"/>
  88.             <s:Button id="btnProcurar" label="Procurar"/>
  89.             <s:Button id="btnSend" label="Enviar"/>
  90.         </mx:FormItem>
  91.     </mx:Form>
  92. </s:Application>

DOWNLOAD SOURCE




Set 21

Trabalhando com exceções com Adobe Flex e Zend AMF

Escrito por Leonardo França em 1, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Actionscript3, Adobe, Adobe Flex, AMF, api, app, AR, arte, back, bar, BI, C#, class, classe, código, Curso, demo, dispatch, Download, err, erro, event, EventListener, flash, Flash Platform, Flex, for, framework, function, handle, ide, if, image, int, Java, Javascript, lite, mg, O, on, PHP, platform, programação, pt, RIA, Ria’s Geral, server, servidor, string, Tema, Teste, UI, uint, XP, zend, Zend Amf, zendAMF, zendFramework @ 09 21st, 2010 | via http://www.leonardofranca.com.br | 1 comentário
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Algumas linguagens de programação possuem o recurso de se trabalhar com exceções como PHP, ActionScript 3.0, Java, C# etc. É um recurso que se for bem usado, torna-se poderoso e ajuda a evitar futuras dores de cabeça para seu sistema. Uma exceção nada mais é que a possibilidade de tratar um erro sem necessariamente parar totalmente seu programa.

O suporte a exceções foi adicionado no PHP a partir da versão 5, e pode ser usando em conjunto com o Adobe Flex, neste caso utilizarei o Zend AMF, uma implementação do protocolo AMF para se trabalhar em conjunto com a Flash Platform e seu server-side rodando PHP fazendo parte do ZendFramework.
Considera-se uma boa prática você criar sua classe de exceção extendendo a classe Zend_Exception.

PLAIN TEXT
PHP:

  1. <?php
  2. class MyException extends Zend_Exception{}

Por enquanto só isso basta, podemos implementar mais métodos de acordo com a necessidade de nosso sistema.
Agora criaremos uma classe para disparar a exceção, no PHP isso é feito usando a palavra reservada “throw”.

PLAIN TEXT
PHP:

  1. <?php
  2. class HelloException  
  3. {
  4.      public function dispatchException()
  5.      {
  6.         throw new MyException("dispatch exception!!!");
  7.      }  
  8. }
  9. ?>

No Flex vamos chamar o método normalmente usando a classe RemoteObject.

PLAIN TEXT
ACTIONSCRIPT3:

  1. protected function application1_creationCompleteHandler(event:FlexEvent):void
  2.             {
  3.                 ro = new RemoteObject();
  4.                 ro.destination = "nao faz diferença nenhuma usando com Zend AMF";
  5.                 ro.endpoint = "http://localhost:81/ZendAmf/teste_exception.php";
  6.                 ro.source = "br.com.leonardofranca.HelloException";
  7.                 ro.addEventListener(ResultEvent.RESULT, handlerResult);
  8.                 ro.addEventListener(FaultEvent.FAULT, handlerFault);
  9.                 ro.dispatchException();
  10.             }

Nossa atenção se voltará para o FaultEvent, ele é responsável por capturar as exceções vindas do servidor. Basicamente só precisaremos mostrar ao usuário o faultString.

PLAIN TEXT
ACTIONSCRIPT3:

  1. private function handlerFault(fault:FaultEvent):void
  2.             {
  3.                 trace(fault.fault.faultCode);
  4.                 trace(fault.fault.faultDetail);
  5.                 trace(fault.fault.faultString);
  6.                 Alert.show(fault.fault.faultString,"Atenção");
  7.             }

Devemos ter o seguinte resultado:

Exception

Código completo:
Download PHP
Download Flex

Set 12

Serializando Objetos entre Flex e PHP utilizando AMFPHP ( mapeando VOs / DTOs )

Escrito por DanielPedrinha em 1, 2.0, 6, AMF, amfphp, AR, Artigo, as3, blog, C#, english, exemplo, Exemplos, Flex, Geral, IE, map, O, padrão, PHP, processo, RIA, Ria’s Geral, S+S, Tutorial, UI, zendAMF @ 09 12th, 2010 | via http://www.flexbrasilia.com.br/ | Sem comentários
DanielPedrinha
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Translate to english Atendendo ? pedidos, segue outro artigo sobre como serializar objetos (mapear VOs ou DTOs) entre Flex e PHP usando AMFPHP. O processo é muito simples, o AMFPHP já faz tudo sozinho, mas há detalhes importantes no processo. Crie o diretório ‘vo’ dentro da pasta ‘services’ do teu AMFPHP. Por padrão, o AMFPHP [...]

(Read more…)

Jul 10

Utilizando o ZamfBrowser

Escrito por Willian Mano em .NET, 1, 2.0, 4, 6, Air, AMF, amfphp, AR, auto, back, BI, blog, botão, browser, C#, camp, class, classe, classes, control, Desenvolvedor, Desenvolvimento, Download, err, erro, exemplo, Flex, fonte, for, framework, git, handle, IE, image, int, lista, Livro, mg, NaN, O, on, Pessoal, PHP, redeRIA, referencia, RIA, Ria’s Geral, S+S, server, serviço, servidor, site, string, TAT, Tema, Tutorial, Twitter, UI, uint, Ved, XP, ZamfBrowser, zend, Zend Framework, zendAMF @ 07 10th, 2010 | via http://blog.willianmano.eti.br/ | Sem comentários
Willian Mano
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Um dos pontos onde o ZendAmf perde para o AmfPhp ERA o fato de não ter um browser para poder testar os métodos do sistema.

O ZamfBrowser Atualmente na versão 1.2, é um aplicativo (.air) que permite ao desenvolvedor flex+php testar seus métodos e classes de uma forma mais prática.
Nesse tutorial irei explicar como configurar seus sistemas para que possa ser possível utilizar o ZamfBrowser.

Primeiramente baixe o ZamfBrowser através do site http://www.zamfbrowser.org

Após instalar o ZamfBrowser vamos configurar o arquivo gateway (que faz a ponte entre o flex e o PHP) para o ZamfBrowser poder ”enxergar” os métodos das classes.

No site oficial do ZamfBrowser tem um exemplo do arquivo gateway. O gateway deste tutorial já está preparada pra funcionar junto com o flex. Para mais informações recomendo a leitura do livro Dominando Flex e Zend do Daniel Schmitz.Arquivo gateway.php

 setFallbackAutoloader(true);

 //Instancia do servidor PHP
 $server = new Zend_Amf_Server();

 //Habilita o modo de desenvolvimento, retornando mensagens de erro
 //Comente esta linha quando estiver em modo de produção
 $server->setProduction(false);

 //Adiciona o controller php para que as classes sejam encontradas pelo flex
 $server->addDirectory(dirname(__FILE__) . '/php/controller/');

 //O model é acessado pelo php e não pelo flex
 set_include_path(dirname(__FILE__) . '/php/model/' . PATH_SEPARATOR.get_include_path());

 set_include_path(dirname(__FILE__) . '/php/controller/' . PATH_SEPARATOR.get_include_path());

 //Adiciona a classe do serviço ZamfBrowser para o ZamfBrowser possa retornar as informações dos métodos
 $server->setClass( "ZendAmfServiceBrowser" );

 //Adiciona uma referencia para o Zend_Amf_Server para que a classe ZendAmfServiceBrowser possa retornar as informações dos métodos.
 ZendAmfServiceBrowser::setAmfServer( $server );

 //Handle irá chamar a classe do controller e renderizar a saída AMF para o flex
 echo $server->handle();
 

Depois de configurar a pasta abra o Zamfbrowser.

Devemos agora incluir o servidor que queremos executar os métodos, para isso clique sobre o botão + .

No campo ZendAMF Server Name coloque um nome para o seu servidor

No campo Services Gateway coloque o endereço do seu services Gateway.

Depois de clicar no botão Add Server a tela inicial é exibida onde agora se deve escolher o servidor que deseja testar os métodos. No ComboBox escolha o servidor que você adicionou na etapa anterior e clique em Load ZendAmf Server.

1. O caminho do seu arquivo gateway.

2. Mostra as classes que estão dentro da pasta controller e a classe ZendAmfServicesBrowser. Essas classes foram adicionadas no arquivo gateway através do setClass e do addDirectory.

3. Mostra os métodos da classe selecionada.

4. Executa o método selecionado.

5. Mostra o resultado do método. Você pode alternar a visualização clicando em Console.

Esta é uma exibição de um método simples e que não recebe parâmetros. Um método que recebe parâmetros é executado da seguinte forma.

1. Em 1 o método seleciona é o sayHelloToSomebody.

2. Informa que o método está esperando um parâmetro.

3. Exibe o nome do parâmetro esperado.

No ComboBox Type altere o valor do parâmetro para para string.

Com o campo value disponível para que seja digitado o valor do parâmetro.

Bom pessoal, esses são os procedimentos básicos para poder utilizar o Browser do ZendAmf, espero que sirva de ajuda, qualquer dúvida é só perguntar.

Até a próxima.

Faça o download deste exemplo

Post to Twitter

Jun 23

CRUD com Flex e Zend-AMF – Parte 5 – Final

Escrito por Daniel Schmitz em 1, 4, 6, AMF, AR, arte, Artigo, Artigos, BI, botão, código, código fonte, CRUD, dados, DataGrid, Desenvolvimento, err, erro, event, Flex, Flex 4, fonte, for, free, function, IE, int, label, O, on, PHP, Projetos, RIA, Ria’s Geral, tag, Tema, Teste, Tutorial, UI, uint, zend, zendAMF @ 06 23rd, 2010 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Para finalizar o CRUD criado ao logo da semana, iremos implementar o delete de registros.

  • Parte 1 – Preparando o ambiente, criando os projetos Flex e PHP, testando a conexão
  • Parte 2 – Inserindo dados com ZendAmf e Flex
  • Parte 3 – Exibindo os dados no DataGrid
  • Parte 4 – Alterando dados

Para deletar um registro, precisamos inicialmente criar um botão que tem o mesmo comportamento do botão editar, ou seja, ele fica disponível somente se uma linha do DataGrid estiver selecionada. Isso é feito com o seguinte código:

<s:Button label="Apagar" top="10" left="150"
	  enabled="{dg.selectedIndex!=-1}">
<s:click>
	<![CDATA[
	RemotePessoas.Delete(dg.selectedItem.id);
	]]>
</s:click>
</s:Button>

Veja que agora chamamos o método Delete do PHP, que está implementado a seguir:

function Delete($idPessoa)
{
	$this->db->delete("pessoas", "id = {$idPessoa}");
	return true;
}

Para finalizar, precisamos atualizar o DataGrid assim que o registro for deletado. Isso é feito da seguinte forma:

<fx:Declarations>
<mx:RemoteObject id="RemotePessoas"
		 destination="zend"
		 source="Pessoas">

	<mx:method name="TesteConexao"
		   result="OnTestConexaoOk(event)"/>

	<mx:method name="GetAll"
		   result="OnGetAll(event)"/>

	<mx:method name="Delete"
		   result="OnDelete(event)"/>

</mx:RemoteObject>
</fx:Declarations>

..............
protected function OnDelete(event:ResultEvent):void
	{
		GetAll();
	}

Com isso conseguimos deletar os registros que criamos.

Você pode baixar o código fonte completo aqui.

Conclusões

O desenvolvimento de sistemas, seja ele em flex ou não, sempre está passível de erros. Este crud apresentado possui
diversas melhorias que podem ser feitas e fica como “dever de casa” para você. Fique a vontade em criticar o código,
é assim que se aprende (e não copiando/colando)…

Esta série de artigos marcou minha despedida das férias, que tirei exclusivamente para trabalhar em casa. Foi muito
proveitoso, muito bom. Quero mais !! To pensando em virar freela !! Tem algum trabalho ae??

Jun 23

CRUD com Flex e Zend AMF – Parte 4

Escrito por Daniel Schmitz em 1, 2009, 4, 6, Adobe, AMF, AR, arte, Artigo, bar, BI, botão, camp, carregar, class, classe, código, components, control, Controls, CRUD, Curso, dados, DataGrid, email, err, erro, error, event, events, Flex, Flex 4, for, Formulário, function, Geral, ide, IE, if, label, layout, library, MXML, O, on, PHP, Projetos, pt, RIA, Ria’s Geral, RoR, spark, string, tag, Teste, TextInput, Tutorial, UI, update, window, XML, zend, zendAMF @ 06 23rd, 2010 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Nesta 4a parte iremos aprender a editar os dados que foram inseridos.

Outras partes do tutorial:

  • Parte 1 – Preparando o ambiente, criando os projetos Flex e PHP, testando a conexão
  • Parte 2 – Inserindo dados com ZendAmf e Flex
  • Parte 3 – Exibindo os dados no DataGrid

Agora vamos editar um registro que está no grid. Inicialmente temos que criar um botão “editar” , conforme o código a seguir:

<s:Button label="Editar" top="10"
       left="300"
       enabled="{dg.selectedIndex!=-1}">
  <s:click>
	<![CDATA[
	var p:PessoaForm = new PessoaForm();
	p.idPessoa = dg.selectedItem.id;
	PopUpManager.addPopUp(p,this,true);
	PopUpManager.centerPopUp(p);
	]]>
  </s:click>
</s:Button>

Neste botão, usamos a propriedade enabled ligada ao DataGrid, para que o botão esteja ativado somente se uma linha do DataGrid estiver selecionada. No click do botão, criamos a o popup e passamos o id da pessoa para ele. Quando o formulário terminar de carregar, ele irá se encarregar de pegar os dados.

Porque não passar diretamente nome e email para o formulário? Porque geralmente o formulário contém mais campos do que as colunas do DataGrid. Neste caso não seria possivel passar estes campos. O ideal sempre é passar o ID e pegar os dados novamente, mesmo porque os dados podem até ter sido alterados por outra pessoa.

O formulário PessoaForm.mxml conterá modificações para aceitar a edição de dados. As alterações estão em negrito

<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
	   xmlns:s="library://ns.adobe.com/flex/spark"
	   xmlns:mx="library://ns.adobe.com/flex/mx"
	   width="300" height="150"
	   title="Pessoa"
	   close="{PopUpManager.removePopUp(this)}"
	   >
<s:layout>
<s:VerticalLayout/>
</s:layout>

<s:creationComplete>
<![CDATA[

	if (idPessoa != null)
		pessoaRemote.GetById(idPessoa);

]]>
</s:creationComplete>

<fx:Declarations>

<mx:RemoteObject id="pessoaRemote"
				 destination="zend"
				 source="Pessoas"
				 showBusyCursor="true"
				 >

	<mx:method name="Inserir"
			   result="OnInserir(event)"
			   fault="OnFault(event)"
			   />

	<mx:method name="GetById"
			   result="OnGetById(event)"
			   fault="OnFault(event)"
			   />

	<mx:method name="Alterar"
			   result="OnAlterar(event)"
			   fault="OnFault(event)"
			   />

</mx:RemoteObject>

</fx:Declarations>

<fx:Script>
<![CDATA[
	import mx.controls.Alert;
	import mx.managers.PopUpManager;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;

	import spark.components.PopUpAnchor;

	public var idPessoa:String;

	protected function OnInserir(event:ResultEvent):void
	{
		PopUpManager.removePopUp(this);
	}

	protected function OnFault(event:FaultEvent):void
	{
		Alert.show(event.message.toString(), "ERROR");
	}

	protected function OnGetById(event:ResultEvent):void
	{
		nome.text = event.result.nome;
		email.text = event.result.email;
	}

	protected function OnAlterar(event:ResultEvent):void
	{
		PopUpManager.removePopUp(this);
	}

]]>
</fx:Script>

<mx:Form width="100%" height="100%">
<mx:FormItem label="Nome:" width="100%">
	<s:TextInput id="nome" width="100%"/>
</mx:FormItem>
<mx:FormItem label="Email:" width="100%">
	<s:TextInput id="email" width="100%"/>
</mx:FormItem>
</mx:Form>

<s:controlBarContent>
<s:HGroup horizontalAlign="right" width="100%">
	<s:Button id="btnOk" label="OK">
		<s:click>
			<![CDATA[

			if (idPessoa != null)
				pessoaRemote.Alterar(idPessoa,nome.text,email.text);
			else
				pessoaRemote.Inserir(nome.text,email.text);
			]]>
		</s:click>
	</s:Button>
	<s:Button id="btnCancelar"
			  label="Cancelar"
			  click="{PopUpManager.removePopUp(this)}"/>
</s:HGroup>
</s:controlBarContent>

</s:TitleWindow>

Para preparar o formulário para edição, é preciso criar uma variável de controle, que aqui chamamos de idPessoa. Através desta variável sabemos se estamos inserindo ou alterando um registro

A classe Pessoas no php também sobre modificações, conforme o código a seguir:

<?php
include("base.php");

class Pessoas extends Base
{
function __construct()
{
	parent::__construct();
}

function TesteConexao()
{
	return "OK";
}

function Inserir($nome,$email)
{
	$data = array("nome"=>$nome,"email"=>$email);
	$this->db->insert("pessoas",$data);
	return $this->db->lastInsertId();
}

function Alterar($idPessoa,$nome,$email)
{
	$data = array("nome"=>$nome,"email"=>$email);
	$this->db->update("pessoas",$data,"id={$idPessoa}");
	return true;
}

function GetAll()
{
	return $this->db->fetchAll("select * from pessoas");
}

function GetById($idPessoa)
{
	return $this->db->fetchRow("select * from pessoas where id = {$idPessoa}");
}

}

Agora só falta deletar o registro, que será feito no próximo artigo da série.

Jun 22

CRUD com Flex e ZendAMF – Parte 3

Escrito por Daniel Schmitz em 1, 4, 6, AMF, AR, arte, BI, botão, class, código, comunicação, control, Controls, CRUD, dados, DataGrid, DataProvider, email, event, events, Flex, Flex 4, for, Formulário, function, ide, IE, int, label, O, on, PHP, Projetos, pt, RIA, Ria’s Geral, string, tag, Teste, Tutorial, UI, uint, zend, zendAMF @ 06 22nd, 2010 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Nesta 3a parte do tutorial iremos exibir os dados que estão sendo gravados no formulário para inserir pessoas.

Outras partes do tutorial:

  • Parte 1 – Preparando o ambiente, criando os projetos Flex e PHP, testando a conexão
  • Parte 2 – Inserindo dados com ZendAmf e Flex

 

Agora vamos exibir os dados que foram adicionados na parte 2. Precisamos criar um dataGrid com as colunas nome e email, e fazer a comunicação com o PHP para obter os dados. O Datagrid é feito através do seguinte código:

<mx:DataGrid id="dg" width="400" height="200" top="50" left="10">
 <mx:columns>
	<mx:DataGridColumn dataField="id" visible="false"/>
	<mx:DataGridColumn dataField="nome" headerText="Nome"/>
	<mx:DataGridColumn dataField="email" headerText="Email"/>
 </mx:columns>
 <mx:creationComplete>
	<![CDATA[
	GetAll();
	]]>
 </mx:creationComplete>
</mx:DataGrid>

Veja que chamamos o método GetAll no CreationComplete do DataGrid. Este método está descrito a seguir:

<fx:Declarations>
 <mx:RemoteObject id="RemotePessoas"
				 destination="zend"
				 source="Pessoas">

	<mx:method name="TesteConexao"
			   result="OnTestConexaoOk(event)"/>

	<mx:method name="GetAll"
			   result="OnGetAll(event)"/>

 </mx:RemoteObject>
</fx:Declarations>

<fx:Script>
<![CDATA[
	import forms.PessoaForm;

	import mx.controls.Alert;
	import mx.managers.PopUpManager;
	import mx.rpc.events.ResultEvent;

	public function OnTestConexaoOk(event:ResultEvent):void
	{
		Alert.show(event.result.toString());
	}

	public function GetAll():void
	{
		RemotePessoas.GetAll();
	}

	protected function OnGetAll(event:ResultEvent):void
	{
		dg.dataProvider = event.result;
	}

]]>
</fx:Script>

O método GetAll() irá chamar o método GetAll() do php, que está descrito a seguir:

<?php
include("base.php");

class Pessoas extends Base
{
	function __construct()
	{
		parent::__construct();
	}

	function TesteConexao()
	{
		return "OK";
	}

	function Inserir($nome,$email)
	{
		$data = array('nome'=>$nome,'email'=>$email);
		$this->db->insert('pessoas',$data);
		return $this->db->lastInsertId();
	}

	function GetAll()
	{
		return $this->db->fetchAll("select * from pessoas");
	}

}

O método GetAll() do PHP usa a instância de db para realizar um select, através do método fetchAll. O resultado de fetchAll é retornado pelo php e o método OnGetAll no flex é executado, onde setamos o dataprovider do DataGrid. Para finalizar, precisamos criar um botão que irá atualizar o dataGrid. Isso é facilmente feito pelo código a seguir:

<s:Button label="Atualizar" top="10" left="150">
 <s:click>
  <![CDATA[
  GetAll();
  ]]>
 </s:click>
</s:Button>

« Entradas anteriores |

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2755 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com