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

Publicado por Luiz em 28/05/2007

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


Assine o nosso Feed
1.326 assinantes,
assine você também!
Publique esse artigo no Twitter Salve este artigo no Delicious Cadastre esse artigo no Dihitt Cadastre esse artigo no UEBA Cadastre esse artigo no Rec6

Luiz

4 usuário comentou em " Criando uma enquete com Flex + PHP + MySQL – Parte II "

Assine o Feed de Comtentários ou URL de Trackback

Leandro disse,
Enviado em 06-09-2008 às 1:47 am

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.

karpovl disse,
Enviado em 20-04-2009 às 12:41 am

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

Michel Dohms disse,
Enviado em 05-01-2010 às 1:52 pm

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

Abs

Danilo disse,
Enviado em 23-02-2010 às 12:08 pm

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 o seu comentário abaixo...

 Username (*required)

 Email Address (*private)

 Website (*optional)

 

MXStudio © 2003-2010. Todos os direitos reservados.
É expressamente proibido a cópia, reprodução e difusão dos textos, fotos e outros elementos contidos neste site sem autorização expressa do MXStudio.