MXStudio » Flex » Criando uma enquete com Flex + PHP + MySQL – Parte II

Criando uma enquete com Flex + PHP + MySQL – Parte II


Olá pessoal, vamos dar proceguimento a nossa enquete com Flex + PHP + MySQL, abram o projeto anteriormente criado – Criando uma enquete com Flex + PHP + MySQL – Parte I.

Vamos criar os HTTPs que serão responsáveis pela manutenção da nossa enquete, para isso abram o arquivo enquete.mxml e logo abaixo do código:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”absolute”
currentState=”enquete”
backgroundColor=”#FFFFFF”
horizontalScrollPolicy=”off” verticalScrollPolicy=”off”>

Incluam o seguinte código:

<mx:HTTPService id=”pegaDados”
useProxy=”false”
resultFormat=”e4x”
url=”enq_pegaDados.php”
method=”POST”
contentType=”application/x-www-form-urlencoded”
showBusyCursor=”true”
result=”handleDsPegaDadosResult(event)”/><mx:XMLListCollection id=”pegaDadosXML”/>

<mx:HTTPService id=”vota” url=”vota.php” result=”{atualizaDados();}”>
<mx:request xmlns=”">
<votou>{rgEnquete.selectedValue}</votou>
</mx:request>
</mx:HTTPService>

nesse código, logo após o HTTPService, com o ID pegaDados, ser executado e pegar as informações, que serão retornadas no formato XML, do nosso script PHP, executará a função handleDsPegaDadosResult(event) que será criada logo mais na seção ActionScript. esse HTTPService será o responsável em ver se o usuário já votou e de atualizar as barras de progresso da nossa enquete. O formato que eu usei foi o XML e4x (falarei do formato XML e4x num outro post). Criamos também um XMLListCollection que será usado no nosso AS

Temos também o HTTPService com o ID vota, que será responsável por fazer a votação, adicionando a mesma na tabela respostas. Ao terminar de fazer a votação, ele executará a função atualizaDados();.
Dentro desse HTTPService vamos passar o valor do nosso radioButton selecionado pelo usuário, esse parâmetro é passado pela tag mx:request, lá no arquivo PHP pegamos esse valor e colocamos na variável $voto – $votou = $_GET[votou];

Agora vamos criar nosso script AS, que dará as funcionalidades necessárias as nossas enquetes, abaixo do código anterior (HTTPServices) vamos adicionar nosso AS, conforme script abaixo:

<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.controls.*
import mx.events.*;[Bindable]
private var meuXML:XML;

[Bindable]
private var temp:XMLList;

[Bindable]
private var checaIP:String;

public function handleDsPegaDadosResult( ev:ResultEvent ):void {

meuXML = XML(ev.result.toString());
meuXML = meuXML.normalize();

temp = meuXML.enquete.respostas;

pegaDadosXML.removeAll();
pegaDadosXML.source = temp;

chegaVoto();
}

private function habilitaBotaoVotar():void{
if ((rb0.selected == false) && (rb1.selected == false) && (rb2.selected == false) && (rb3.selected == false)){
btnVotar.enabled = false;
}else{
btnVotar.enabled = true;
}

}

private function chegaVoto():void{
checaIP = String(pegaDadosXML.getItemAt(5).cookie.acesso);
if (checaIP==”NEGADO”){
btnVotar.enabled = false;
rgEnquete.enabled = false;
}else{
rgEnquete.enabled = true;
}
}

private function atualizaDados():void{
pegaDados.send();
ver();
}

private function votando():void{
vota.send();
}

private function ver():void{
currentState=”resultado”;
gauge();
}

private function gauge():void{
bar0.setProgress(pegaDadosXML.getItemAt(0).voto,100);
bar1.setProgress(pegaDadosXML.getItemAt(1).voto,100);
bar2.setProgress(pegaDadosXML.getItemAt(2).voto,100);
bar3.setProgress(pegaDadosXML.getItemAt(3).voto,100);
}

]]>
</mx:Script>

Vamos a explicação do nosso código acima, as 3 primeiras linhas do nosso código

import mx.rpc.events.ResultEvent;
import mx.controls.*
import mx.events.*

é pra importar todos as classes necessárias para que nossa enquete funcione. Em seguida eu crio 3 variável que será usada na função handleDsPegaDadosResult, essa função será executada logo após o HTTPService pegar os dados do PHP, ela tratará o XML e colocará dentro da XMLListCollection. Logo depois eu executo a função chegaVoto();, onde eu testo se o usuário pode ou não votar.

A função chamada – chegaVoto() – serve para checar se o usuário já votou ou não, se ele votou, então nosso código PHP retornará um XML com a opção NEGADO e assim, não será liberado o botão Votar e nem os radioButtons – rgEnquete. Se o usuário ainda não votou, então tanto o botão Votar como os radioButtons, serão liberados para votação.

A função – habilitaBotaoVotar() – serve pra que o usuário não consiga votar sem antes clicar em uma das opções, enquanto o usuário não selecionar uma opção, o botão Votar (btnVotar) ficará setado como false, ficando disponível somente depois de selecianada uma das opções.

A função gauge( ) do nosso código, é que pega os dados do XML que foi retornado pelo HTTPService pegaDados e atualizará as barras de progresso da nossa enquete com a contagem dos votos.

private function gauge():void{
bar0.setProgress(pegaDadosXML.getItemAt(0).voto,100);
bar1.setProgress(pegaDadosXML.getItemAt(1).voto,100);
bar2.setProgress(pegaDadosXML.getItemAt(2).voto,100);
bar3.setProgress(pegaDadosXML.getItemAt(3).voto,100);
}

Agora vamos mudar algumas propriedades na nossa enquete, na viewState enquete na tag <mx:text mudem a propriedade text=”" para:
text=”{pegaDadosXML.getItemAt(4).pergunta.perg} ficando toda a linha da seguinte forma:

<mx:Text x=”10″ y=”6″ text=”{pegaDadosXML.getItemAt(4).pergunta.perg}” width=”130″ height=”72″ textAlign=”center” fontWeight=”bold” color=”#ff8040″/>

Logo abaixo, temos a tag <mx:RadioButtonGroup> mude essa linha acrescentando a propriedade itemClick=”" assim:

<mx:RadioButtonGroup itemClick=”habilitaBotaoVotar();” id=”rgEnquete”/>

Aqui, ao clicar em qualquer das 4 opções, executará a função habilitaBotaoVotar();.
Em seguida nós tempos as 4 tags, uma pra cada radioButton, vamos mudá-las, para que fiquem da seguinte forma:

<mx:RadioButton id=”rb0″ value=”{pegaDadosXML.getItemAt(0).unico}” label=”{pegaDadosXML.getItemAt(0).resp}” groupName=”rgEnquete” textAlign=”left”/>
<mx:RadioButton id=”rb1″ value=”{pegaDadosXML.getItemAt(1).unico}” label=”{pegaDadosXML.getItemAt(1).resp}” groupName=”rgEnquete” textAlign=”left”/>
<mx:RadioButton id=”rb2″ value=”{pegaDadosXML.getItemAt(2).unico}” label=”{pegaDadosXML.getItemAt(2).resp}” groupName=”rgEnquete” textAlign=”left”/>
<mx:RadioButton id=”rb3″ value=”{pegaDadosXML.getItemAt(3).unico}” label=”{pegaDadosXML.getItemAt(3).resp}” groupName=”rgEnquete” textAlign=”left”/>

Aqui cada radioButton recebe sua respectiva resposta com seu respectivo ID, trazidos pelo XML que o arquivo enq_pegaDados.php gerou.

Agora, abaixo tempo dois componentes buttons, um “Votar” e outro “Ver”, no botão Votar acrescente a função votando( ) no evento Click do mesmo, faça o mesmo com o botão “Ver”, acrescentando no click do mesmo, a função ver( ). veja código abaixo:

<mx:Button id=”btnVotar” x=”9″ y=”209″ label=”Votar” click=”{votando();}” enabled=”false”/>
<mx:Button x=”75″ y=”209″ label=”Ver” click=”{ver();}”/>

Agora mudem para a viewState resultado e mudem as linhas do progress bar para que fiquem da seguinte forma:

<mx:ProgressBar id=”bar0″ label=”{pegaDadosXML.getItemAt(0).resp}->{pegaDadosXML.getItemAt(0).voto}%” width=”130″ minimum=”0″ maximum=”100″ direction=”right” mode=”manual” themeColor=”#00CC00″/>
<mx:ProgressBar id=”bar1″ label=”{pegaDadosXML.getItemAt(1).resp}->{pegaDadosXML.getItemAt(1).voto}%” width=”130″ minimum=”0″ maximum=”100″ direction=”right” mode=”manual” themeColor=”#0066CC”/>
<mx:ProgressBar id=”bar2″ label=”{pegaDadosXML.getItemAt(2).resp}->{pegaDadosXML.getItemAt(2).voto}%” width=”130″ minimum=”0″ maximum=”100″ direction=”right” mode=”manual” themeColor=”#FFCC00″/>
<mx:ProgressBar id=”bar3″ label=”{pegaDadosXML.getItemAt(3).resp}->{pegaDadosXML.getItemAt(3).voto}%” width=”130″ minimum=”0″ maximum=”100″ direction=”right” mode=”manual” themeColor=”#FF0000″/>

Agora no botão voltar, incluam a seguinte ação no click do botão: click=”currentState=’enquete’” ficando a linha da seguinte forma:

<mx:Button label=”Voltar” horizontalCenter=”0″ bottom=”10″ click=”currentState=’enquete’” width=”100″/>

Caso tenha alguma dúvida utilize o fórum.
Abraços, Luis Carlos Quinhone – quinhone@mxstudio.com.br


4 Comments to Criando uma enquete com Flex + PHP + MySQL – Parte II

  1. Leandro's Gravatar Leandro
    Setembro 6, 2008 at 1:47 am | Permalink

    Cara.. não funcionou.. ele não lista as enquetes.. não sei se fiz errado, então poderia disponibilizar os arquivos para eu compara os códigos.
    Grato.

  2. karpovl's Gravatar karpovl
    Abril 20, 2009 at 12:41 am | Permalink

    Concordo com o colega acima, fiz todo o processo. Aparentemente o problema está na interação com o banco de dados.

  3. Michel Dohms's Gravatar Michel Dohms
    Janeiro 5, 2010 at 1:52 pm | Permalink

    Xiii barco furado.. ótima tecnologia, porém com algum detalhe dando problema

    Abs

  4. Danilo's Gravatar Danilo
    Fevereiro 23, 2010 at 12:08 pm | Permalink

    Segui os tutoriais e consegui rodar certinho a enquete.
    No início ele não listava as opções pra voto, mas resolvi o problema apenas adicionando creationComplete=”pegaDados.send();”
    na tag mx:Application.
    Em seguinda, ele não “pintava” as porcentagens automaticamente, resolvi removendo a chamada para a função gauge() de dentro de ver() e adicionando enterState=”gauge();”
    na tag mx:State do resultado.

    Espero que tenha ajudado.
    Parabéns e obrigado ao autor pelo tutorial. To iniciando no Flex e estou aprendendo muito por aqui.

Deixe um Comentario

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">

Luiz