10/12/2010 - 16:14:39

Turbine sua aplicação PHP com o Flex


Flex é um Framework open source da Adobe para aplicações web, projetado para o desenvolvimento rápido de aplicações web ou desktop. Ele permite que você crie um software que é então compilado em um arquivo Flash (swf), e pode ser executado em qualquer navegador que tiver o plugin do Flash instalado. Você pode criar grandes aplicações facilmente, adicionando com poucas linhas de código efeitos agradáveis, ou seja, você pode fazer uma aplicação rica rapidamente.

Neste artigo, iremos aprender a usar o Flex com o PHP, criando um widget em Flex que exibirá as informações sobre um produto que será passado pelo PHP. Antes de começar, adquira uma versão Trial do Flex Builder, pode ser a versão 4, mas neste artigo, estou usando a versão 3.

Widget

O pequeno widget que estamos construindo, mostrará uma imagem do produto com a descrição e um link para uma página de informações sobre o produto. Ele será composto por estes componentes básicos:

  • Uma aplicação Flex para exibir o widget
  • Uma página HTML que contém o Flash
  • E, mas tarde, um script PHP para apresentar os dados do produto como XML ou JSON

Para começar, vamos inserir as informações sobre o produto na aplicação Flex enquanto construímos o nosso widget. Uma vez que tenhamos resolvido a parte do Flex, vamos alterar nosso código para saber como obter os dados de um arquivo XML.

Vamos começar criando um novo projeto Flex (Flex Project) usando o Flex Builder. Digite ProductWidget como nome do projeto, e certifique-se que o tipo de aplicativo está definido como aplicação web (web application), e em seguida clique no botão Finish.

Com isto, você terá criado o projeto básico, incluindo um arquivo de modelo HTM para carregar e exibir o aplicativo, bem como um esqueleto da aplicação, o arquivo ProductWidget.mxml. Se você não mudar o layout do seu Flex Builder, o arquivo principal do aplicativo será visível no lado direito do editor. Certifique-se de que o arquivo ProductWidget.mxml é exibido no editor. Se você está em dúvida, procure um arquivo chamado ProductWidget.mxml na árvore de arquivos do lado esquerdo e de um duplo clique nele. Isto irá garantir que o arquivo correto está carregado.

Dentro do arquivo, você verá o início de um aplicativo Flex, contido nas tags mx:Application. Nós vamos adicionar uma caixa para conter o nosso widget, um espaço reservado para uma imagem e um botão que irá conter um link. Entre as tags mx:Application, acrescenteo seguinte código:


        <mx:VBoxtop="0" left="0" right="0" bottom="0">
             <mx:Imageid="image" width="150"/> 
             <mx:LinkButtonlabel="LinkButton" id="link" width="150"/>
        </mx:VBox>

O mx:VBox é um componente de layout e ele vai se certificar de que a imagem e o botão de link serão exibidos um abaixo do outro. Ambos os itens tem 150px de largura.

Aperte o botão Run na barra de ferramentas (o botão verde com seta branca) para fazer que tudo funcione. Seu navegador deve abrir e exibir uma página vazia, apenas com o LinkButton que criamos anteriormente:

Exemplo 1

Passando Parâmetros

A forma mais básica para passar parâmetros para uma aplicação Flex é adicionar os parâmetros para o modelo HTML que contém o nosso widget. Para o nosso exemplo vamos precisar fornecer três valores:

  • A URL da imagem a ser exibida (imageURL)
  • Uma descrição do produto (productTitle)
  • Um link para informações mais detalhadas sobre o produto (productLink)

Iremos fazer isto, alterando o template HTML, que está localizado na pasta HTML-template. Por padrão esta arquivo contém o código para detectar o plugin do Flash e um link para um local de instalação no caso do usuário necessitar instalar o plugin do Flash. E uma vez que terminamos a nossa alteração, ele também irá conter o código que passar os parâmetros para a nossa aplicação Flex.

Há duas chamadas para uma função AC_FL_RunContent, no arquivo. Certifique-se de usar a chamada para o arquivo swf (o outro é para atualizar o Flash, se for detectada uma versão desatualizada). No meu caso, ele se encontra em torno da linha 77. Esta chamada contém todos os parâmetros passados para a aplicação Flex. Para passar os dados para o seu aplicativo Flex, você precisa adicionar um parâmetro adicional chamado flashVars, este parâmetro pode conter vários outros parâmetros codificados com a URL HTML, como uma chamada GET. No exemplo estou usando uma imagem do sxc.hu, é a imagem que servirá de demonstração do produto:


        } else if (hasRequestedVersion) {
                // if we've detected an acceptable version
                // embed the Flash Content SWF when all tests are passed
                AC_FL_RunContent(
                                 "src", "${swf}",
                                 "width", "${width}",
                                 "height", "${height}",
                                 "align", "middle",
                                 "id", "${application}",
                                 "quality", "high",
                                 "bgcolor", "${bgcolor}",
                                 "name", "${application}",
                                 "allowScriptAccess","sameDomain",
                                 "type", "application/x-shockwave-flash",
                                 "pluginspage", "http://www.adobe.com/go/getflashplayer",
                                 "flashVars", "imageURL=http://www.sxc.hu/pic/m/n/ni/nitewind23/638995_dead_rubber_ducky.jpg&productTitle=Pato%20de%20borracha&productLink=http://www.sxc.hu/photo/638995" 
               ); 

Isso é suficiente para fazer o que pretendemos que irá funcionar se o usuário tiver o JavaScript habilitado no navegador. Para usuários que estejam com o JavaScript desabilitado, você pode colocar também os parâmetro no blog noscript.

Agora a nossa aplicação já está recebendo os parâmetros do template HTML, só falta dizer ao aplicativo como usá-los.

O código no arquivo mxml deve ser colocado no bloco mx:Script. Nós vamos adicionar o bloco após o fechamento da tag mx:VBox:


        <mx:Script>
              <![CDATA[
                     private var linkURL: String ="";

                     private function onCreationComplete() : void
                     {
                          setData(
                                  application.parameters.imageURL,
                                  application.parameters.productTitle,
                                  application.parameters.productLink);
                     }
 
                     private function setData(imageURL: String, productTitle:String, productLink:String) : void
                     {
                          image.source = imageURL;
                          link.label = productTitle;
                          linkURL = productLink;
                     }

                     private function onLinkClicked(): void
                     {
                          navigateToURL(newURLRequest(linkURL));
                     }
               ]]>
         </mx:Script>

O onCreationComplete é o método que lê os parâmetros que foram passados a partir do arquivo HTML e chama outra função, setData, que irá preencher as variáveis para o nosso código com os parâmetros que nós recebemos a partir do HTML. Como este método é chamado, assim que o aplicativo é criado, temos certeza de que os dados serão carregados logo no início.

A função setData recebe três parâmetros: imageURL, ProductTile e productLink. Usaremos o imageURL para definir a origem da imagem, e o produtoTitle pode ser usado para definir o texto exibido no ButtonLink. O productLink precisa ser salvo na variável linkURL que acabamos de definir, para que possamos usa-lo assim que usuário clicar no link.

Finalmente, a função onLinkClicked irá direcionar a aplicação para o link definido na variável linkURL. Nós vamos relacionar esta função com o botão na próxima etapa.

Vamos voltar para a tag mx:VBox que criamos anteriormente, e procure o LinkButton, adicione o evento click da seguinte forma:


       <mx:LinkButtonlabel="LinkButton" id="link" width="150" click="onLinkClicked()" />

Finalmente, nos precisamos fazer isto tudo acontecer assim que o aplicativo é carregado. Vamos adicionar um evento para o aplicativo, creationComplete, para executar a nossa função onCreationComplete, assim que o elemento for criado. Procure pela tagmx:Applicatione adicione o evento:

        <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">

O seu código deve estar parecido com o abaixo:


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">
        <mx:VBox top="0" left="0" right="0" bottom="0">
                <mx:Image id="image" width="150"/>
                <mx:LinkButton label="LinkButton" id="link" width="150" click="onLinkClicked()" />
        </mx:VBox>
        <mx:Script>
               <![CDATA[
                        private var linkURL: String ="";

                        private function onCreationComplete() : void
                        {
                                setData(
                                        application.parameters.imageURL,
                                        application.parameters.productTitle,
                                        application.parameters.productLink);
                        }
			
                        private function setData(imageURL: String, productTitle:String, productLink:String) : void
                        {
                                image.source = imageURL;
                                link.label = productTitle;
                                linkURL = productLink;
                        }
			
                        private function onLinkClicked():void
                        {
                                navigateToURL(new URLRequest(linkURL));
                        } 
                ]]>
        </mx:Script>
</mx:Application>

Se tiver, execute a aplicação para visualizar o resultado:

Exemplo 2

Então, agora temos a estrutura básica de uma aplicação Flex. Em seguida, usaremos o PHP para criar um arquivo XML que será lido pela nossa aplicação.

Trabalhando com dados XML

Se seu aplicativo puder gerar dados XML, a próxima parte deste tutorial irá mostrar como trabalhar com estes dados no Flex. XML é um padrão de transferência de dados muito difundido e pode ser criado facilmente e o mais importante o Flex suporta XML. Essas são as razões para utiliza-lo, agora vamos ao exemplo.

Antes de começar é bom frisar que o Flash tem uma política extremamente rigorosa quando se trata de acessar dados de um domínio diferente, então execute a sua aplicação Flex no mesmo domínio que o arquivo XML está sendo criado, ou crie um arquivo de política entre domínios no servidor onde esta o PHP que gera o XML. Para maiores informações confira este artigo do Adobe Developer Connection.

Já que estamos usando o HTML para recuperar os dados, vamos usar a classe HTTPService, para fazer o trabalho pesado por nós. Nós diremos a HTTPService onde se conectar e o que fazer com os dados retornados.

Para testá-la, vamos precisar de um simples código PHP para gerar os dados. Em uma situação real, você estaria pegando estas informações do banco de dados, mas para este exemplo vamos atribuir estes valores. Aqui está um script PHP que usa uma função para busca os dados, e cria uma variável para guarda-lo, e então gera os dados em formado XML:


 <?php  
   header("Content-type: text/xml");  
   function getData() {  
      $data["productLabel"] = "Pato de borracha";  
      $data["productLink"] = "http://www.sxc.hu/photo/638995";  
      $data["imageURL"] = "http://www.sxc.hu/pic/m/n/ni/nitewind23/638995_dead_rubber_ducky.jpg";  
      return $data;  
   }  
     
   $product = getData();  
 ?>  
 <?php echo '<?xml version="1.0"?>'; ?>  
 <data>  
  <product>  
     <label><?php echo $product["productLabel"] ?></label>  
     <link><?php echo $product["productLink"] ?></link>  
     <imageURL><?php echo $product["imageURL"] ?></imageURL>  
  </product>  
 </data>

Em nosso aplicativo Flex, vamos definir um HTTPService apontando para a nossa página PHP, adicionando um bloco do HTTPService no código. Dentro deste bloco, precisamos definir um nome único para o serviço (id) para que possamos acessa-lo no nosso código ActionScript, além da URL requisitada (url) e do formado do resultado (resultFormat).

Uma coisa para não se esquecer, é que a chamada será assíncrona, o método é chamado e retorna na hora a resposta, isto tudo funcionando em modo background. Se o retorno for bem sucedido, ele nos retorna result, se ocorrer algum erro o retorno será fault.

O código do HTTPService, que pode ser visto abaixo, será colocando antes do bloco do mx:Script:


    <mx:HTTPServiceid="productService" url="http://localhost/service.php" resultFormat="e4x" result="serviceLoaded(event)" fault="serviceError(event)" />

Quando um HTTPService retornar um XML, definimos o tipo de formato esperado, resultFormat, como e4x (ECMAScript for XML). Desta forma, temos acesso a uma serie de funções JavaScript que nos permite trabalhar com o XML retornado.

Em seguida, precisamos definir o que vamos fazer com os dados que recebemos do HTTPService. Nós sabemos o formato do resultado, então vamos simplesmente tratar o resultado do evento como XML. Isso nos permite acessar os dados no XML como um objeto. O primeiro nível do nosso XML (data no nosso exemplo) será mapeado para um objeto XML (xmlData no nosso exemplo), então podemos acessar o elemento do segundo nível, usando xmlData.product. Uma vez que o XML pode conter diversas tags product, é preciso especificar qual queremos, neste exemplo, ela será a primeira (xmlData.product[0]). Os elementos dentro da tag product, podem ser acessados diretamente. Agora basta passar os dados para a nossa função setData que tudo funcionará. Iremos fazer tudo isto na função serviceLoaded:


        private function serviceLoaded(event: ResultEvent) : void
        {
               var xmlData: XML = event.result as XML;
               setData(
                       xmlData.product[0].imageURL,
                       xmlData.product[0].label,
                       xmlData.product[0].link);
        }

Também precisamos definir outra função, a serviceError, para quando acontecer um erro com o HTTPService. Normalmente ela definida para repetir a ação, mas no momento vamos simplesmente gerar uma mensagem de erro:


      private function serviceError(event: FaultEvent) : void
      {
            trace("Unable to get XML:" + event.fault.message);
      }

Para não ocorrer nenhum erro, coloque no inicio do código ActionScript a referencia abaixo:


        import mx.rpc.events.*;

Agora execute a aplicação para visualizar o resultado:

Exemplo 3

Como você pode ver a conexão do Flex com o PHP é muito simples. Se o seu aplicativo PHP dispõe de um serviço que retorna um XML, o Flex pode receber esses dados e exibi-los.

Formas de Pagamento

Até 12x no cartão (3x sem juros):
Até 10x no cartão (4x sem juros)

TEF / Transferência Eletrônica / Débito:
TEF / Transferência Eletrônica / Débito

Pagamento Digital:
Pagamento Digital

Boleto Bancário:
Boleto bancário


O TreinaWeb é Auditado!

O TreinaWeb e seus meios de pagamento são auditados e certificados.

Seus dados estarão 100% protegidos:

Visualizou o selo site Blindado? Navegue tranquilamente, esse site está PROTEGIDO CONTRA HACKERS. Realizamos diariamente milhares de testes para garantir sua navegação segura. Clique no selo e confira nossa certificação.

Somos afiliados:

ABED - Associação Brasileira de ensino à distância

© 2004 - 2013 TreinaWeb - Cursos Online de TI

TreinaWeb Tecnologia LTDA - CNPJ: 06.156.637/0001-58
Av. Paulista, 1765, Conj 71 e 72 - Bela Vista, São Paulo - SP 01311-200