Crie um projeto chamado DevTeste na IDE Flex Builder. Na página principal do projeto, arraste dois componentes para a área da página, no modo design. Nomeie os dois combos para CbxUF e CbxCidade. O primeiro combo irá receber de nosso banco de dados Mysql, a lista de unidades federativas do Brasil.Essa lista vira no formato xml e o combo ira ser alimentado por esses dados, idem para a lista de cidades. A idéia é que ao escolhermos a UF, o combo cidade exibirá apenas as cidades da UF selecionada.
Devemos iniciar o trabalho criando no banco de dados duas tabelas: Cidades e UF(unidade federativa), ambas com suas chaves primárias que estabelecem a diferenciação entre cada registro no banco. Após a criação das tabelas realizaremos os inserts com os dados das cidades e estados do país.
O segundo passo é a criação de um arquivo php que irá trazer os dados de cada tabela individualmente. O primeiro arquivo criado é o load_uf.php , ele buscará no banco de dados a relação de todas as UF’s em ordem alfabética.O arquivo load_uf.php após realizar a busca no banco retorna um XML com as informações da tabela de UF.A busca retorna o código da UF e a sigla em nós XML.
Listagem 1: O código php que gera o xml:
if ($result)
{
/* xml result */
$xml = XMLHeader() . "";
while ($row = mysql_fetch_assoc($result))
{
$v_cd_uf = $row['cd_uf'];
$v_ds_uf_sigla = $row['ds_uf_sigla'];
$node = "" ;
$xml = $xml . $node;
} $xml = $xml . "" ;
Após a execução desse arquivo obtemos um retorno assim:
Listagem 2: XML gerado
A segunda parte é irmos até o flex e criarmos um projeto, dentro deste projeto iremos criar pastas para organizarmos o projeto, com os nomes classes(cidades e uf) e ws .Clicando com o botão direito do mouse na pasta UF( criada dentro de classes) iremos criar uma nova ActionScript Class, daremos o nome de UFData. Dentro desta classe iremos atribuir os métodos para carregar os dados que retornam no formato XML.Para isso fazemos o import da classe flash.xml.XMLNode do Flex e criamos o método doLoadFromXML que recebe como parâmetro um nó XML. O Código do método é:
Listagem 3: Método doLoadFromXML
public function doLoadFromXML(loNode:XMLNode):void
{
this.cd_uf = loNode.attributes.cd_uf;
this.ds_uf_sigla= loNode.attributes.ds_uf_sigla;
}
Iremos obter do XML o cd_uf e ds_uf_sigla, para isso criamos antes no arquivo UFData as variáveis cd_uf e ds_uf_sigla, da seguinte forma:
Listagem 4: Variáveis para receber valores do XML
public var cd_uf:String;
public var ds_uf_sigla:String;
Já possuímos a classe uf criada, fazemos o mesmo para a classe cidade.
O passo seguinte é criarmos um serviço que consumirá o xml retornado , isso é feito com a criação de um componente no flex o wsUF. O componente é criado e damos um tamanho de 10px de largura e 10px de altura apenas para podermos manipula-lo depois de pronto.Dentro do wsUF iremos usar a tag que informa que sua execução será após um evento do tipo onExecute. Usamos a tag para informarmos que o componente criado é do tipo HTTPService e seu retorno é em xml.Dentro do componente criamos o import das classes adicionais e da classe UFData. Criamos também uma variável FoList que receberá um array com os dados retornados, colocamos a palavra [Bindable] para garantir que essa variável possa ser acessada com atualização de seu conteúdo.Criamos o método que irá permitir a exibição dos dados do XML:
Listagem 5: Método OnResultUFRead
private function OnResultUFRead(event:ResultEvent):void
{
var lcXML:String = event.result.toString();
/* pede o arquivo xml */
var loXML:XMLDocument = new XMLDocument(lcXML)
/* colecao */
var loData:classes.UF.UFData = null;
/* remove os dados anteriores */
this.FoList.removeAll();
/* carregar o xml */
for each (var loNode:XMLNode in loXML.childNodes)
{
if (loNode.nodeName == "all")
{
for each (var loItem:XMLNode in loNode.childNodes)
{
loData = new UFData();
loData.doLoadFromXML(loItem);
this.FoList.addItem(loData);
}
}
}
var loEvent:Event = new Event("OnExecute");
this.dispatchEvent(loEvent);
}
E por fim criaremos o método que usa o arquivo load_uf.php.
Listagem 6: Método doLoadUf
public function doLoadUf():void
{
var params:Object = {};// esta variável esta vazia, pois não iremos //passar parâmetros ao php para exibir as UF.
this.srvUFRead.method="POST";
this.srvUFRead.url=Util.GetBasePath()+ "load_uf.php" ;
this.srvUFRead.send(params);
}
Agora criamos um combo no projeto e denominamos de cbxUF, arrastamos o componente criado wsUF, no modo design do flex, para dentro de nosso projeto, esse componente pode ser visualizado na pasta customs , na aba de componentes quando estamos visualizando no modo design do flex. Nomeamos o wsUF, como “webUF”.
Vamos até o cbxUf e informarmos a propriedade DataProvider como “{webUF.Folist}” e a propriedade labelField como “ds_uf_sigla”, isso fará o combo receber a sigla dos estados.
Para que o combo seja carregado, iremos criar um método e que será disparado quando o evento de carregar a aplicação se iniciar.A aplicação possui um evento creationcomplete, que é executado no instante final da aplicação, quando ela é construída no browser.Com a ajuda do método OncreationComplete () ,que possui o código a seguir:
Listagem 6: Mètodo OncreationComplete
private function OncreationComplete():void
{
webUf.doLoadUf();
}
Colocamos o método OncreationComplete na propriedade CreationComplete da aplicação.Com isso ao ser carregada a aplicação o método será executado e a lista de UF’s será exibida no combo cbxUF.
Já possuímos as siglas dos estados sendo exibidas, o próximo passo é exibir as cidades correspondentes aos estados selecionados.Para isso criamos a classe cidades, com o campo que queremos que seja exibido, no caso ,o campo ds_cidade_nome (coluna do banco).Criamos um componente HTTPService, igual ao wsUF, com exceção que iremos passar parâmetros , para que o PHP vá ao banco e selecione a cidade de acordo com o cd_uf que é a chave estrangeira na coluna cidade .
O código no componente wsCidades , terá o método doLoadCidades(lccd_uf:String) que possui como parâmetro o cd_uf.Segue o método:
Listagem 7: Método doLoadCidades
public function doLoadCidades(lccd_uf:String):void
{
var params:Object = {};
params["cd_uf"] = lccd_uf ;
this.srvCidadesRead.method="POST";
this.srvCidadesRead.url=Util.GetBasePath()+ "load_cidades.php" ;
this.srvCidadesRead.send(params);
}
Os demais métodos serão iguais ao do wsUF, com exceção do nomes das classes de importação , que para o wsCidades será classes.cidades.CidadesData.
Feito o wsCidades, vamos a aplicação principal e no modo Design, vamos a paleta de componentes e na pasta Customs, arrastamos o wsCidades, para dentro de nossa aplicação principal.No componete combo colocamos o dataprovider com o nome do wsCidades, no meu caso nomeei de webCidades e adicionamos o ponto para pegar a variável Folist que retorna, o código ficaria assim: dataProvider="{webCidade.FoList}" e a propriedade labelfield do combo(propriedade labelfield exibe o que queremos que o usuário selecione ) ficará assim: labelField="ds_cidade_nome".
Agora precisamos criar um método na aplicação principal que irá controlar a execução do wsCidade, para isso chamei de OnChange, pois na troca de UF , o combo Cidades se atualiza pelo evento onChange do combo UF.Segue o código:
Listagem 8: Evento OnChange do combo UF
private function OnChange():void
{
var lcuf:String = (cbxUF.selectedItem as UFData).cd_uf;
webCidade.doLoadCidades(lcuf);
}
Na primeira linha entre parênteses do método OnChange, criei uma variável que recebe do combo UF ,do item selecionado que é do tipo da classe UFData a propriedade cd_uf que alimentara na segunda linha, o parâmetro do webCidade . isso fará o php receber o parâmetro cd_uf e realizar a carga do xml com os dados do banco referente ao UF Selecionado.
Por fim para executar tudo isso, informe dentro de classes, a biblioteca Util, o path da sua aplicação para que ao compilar ele localize os arquivos php e sua aplicação funcione. Dúvidas sobre o arquivo Utils, contacte-me por email: josedarci_rodrigues@msn.com.