Populando ComboBox no Flash com PHP, MySQL e XML
actionscript, labs, ria fevereiro 5th, 2009Tenho estudado muito nos últimos dias, afinal quem trabalha nesta área tem de estar em aprendizado constante. Estou iniciando meus estudos em OOP no PHP e também aprofundando meu conhecimento no Adobe Flex, e tenho progredido bastante neste período.
Mas brother, vamos ao que interessa para este post, acabei escrevendo um código utilizando PHP e MySQL, onde o PHP gera um XML através de uma consulta na tabela para alimentar um ComboBox Component no Flash.
Alimentar um ComboBox é simples, mas resolvi que iremos alimetar dois ComboBox, onde, um irá alimentar o outro, utilizarei os estados do Brasil e suas cidades como exemplo.
1ª Etapa:
Aqui, definiremos nossas tabelas no MySQL.
Tabela estado
CREATE TABLE `estado` ( `est_codigo` int(2) NOT NULL auto_increment, `est_nome` varchar(50), PRIMARY KEY (`est_codigo`) ) insert into `estado`(`est_codigo`,`est_nome`) values (1,'Santa Catarina'), (2,'Paraná'), (3,'Rio Grande do Sul'), (4,'São Paulo'), (5,'Rio de Janeiro');
Tabela cidade
CREATE TABLE `cidade` ( `cid_codigo` int(5) NOT NULL auto_increment, `cid_est_codigo` int(2) default NULL, `cid_nome` varchar(70) default NULL, PRIMARY KEY (`cid_codigo`) ) insert into `cidade`(`cid_codigo`,`cid_est_codigo`,`cid_nome`) values (1,1,'Porto União'), (2,1,'Canoinhas'), (3,1,'Balneário Camboriú'), (4,1,'Caçador'), (5,1,'Florianópolis'), (6,2,'Curitiba'), (7,2,'União da Vitória'), (8,2,'Foz do Iguaçu'), (9,3,'Porto Alegre'), (10,3,'Canoas'), (11,3,'Caxias do Sul'), (12,4,'São Paulo'), (13,4,'Campinas'), (14,4,'Santos'), (15,4,'Ubatuba'), (16,5,'Rio de Janeiro'), (17,5,'Angra dos Reis'), (18,5,'Paraty');
2ª Etapa:
Precisaremos de uma conexão com nosso banco de dados, caso ja tenha ou saiba como criar uma pode passar para a próxima etapa.
Crie um novo arquivo PHP e salve-o com o nome de Conexao.php então escreveremos a classe Conexao.
<?php class Conexao { // CONSTRUTOR function __construct() { return true; } /** * FUNCTION CONEXAO * @return $cnx */ function conectar() { $sHost = 'nome-do-host'; $sDB = 'nome-do-db'; $sUser = 'nome-do-user-mysql'; $sPassword = 'senha-do-usuer'; $cnx = mysql_connect($sHost, $sUser, $sPassword); mysql_select_db($sDB, $cnx); return $cnx; } } ?>
3ª Etapa
Nesta etapa definiremos as classes que irão gerar o XML para alimentar o ComboBox de estados que por sua vez irá alimentar o ComboBox de cidades.
Então crie um arquivo PHP chamado Estado.php e escreva a classe abaixo.
<?php // INFORMAMOS QUE O DOCUMENTO SERA DO TIPO XML header("Content-Type: text/xml; charset=UTF-8", true); // CONEXAO require_once('Conexao.php'); // CLASS ESTADO class Estado { // CONSTRUTOR function __construct() { return true; } /** * FUNCTION getEstado * @return xml */ function getEstado() { // CONEXAO $conexao = new Conexao(); $cnx = $conexao->conectar(); // SELECIONA ESTADO NO DB $sSQL = "SELECT est_codigo, est_nome FROM estado ORDER BY est_nome ASC"; $qSQL = mysql_query($sSQL, $cnx) or die(mysql_error()); // GERANDO XML echo "<?xml version='1.0' encoding='UTF-8'?> "; echo "<estados>"; while( $aRow = mysql_fetch_array($qSQL) ) { echo "<estado>"; echo "<codigo><![CDATA[" . $aRow['est_codigo'] . "]]></codigo>"; echo "<nome><![CDATA[" . $aRow['est_nome'] . "]]></nome>"; echo "</estado>"; }; echo "</estados>"; } } // INICIA CLASSE $estado = new Estado(); echo $estado->getEstado(); ?>
Salve-o, e agora iremos criar a classe que alimentará as cidades.
A Classe de cidades é exibida de forma dinâmica, onde, ao selecionar o estado desejado passaremos o código dele como parametro para consultar somente as cidades que fazem referência a este estado.
Crie um novo arquivo PHP e salve-o como o nome Cidade.php, e escreva a classe para as cidades.
<?php // INFORMAMOS QUE O DOCUMENTO SERA DO TIPO XML header("Content-Type: text/xml; charset=UTF-8", true); // CONEXAO require_once('Conexao.php'); // CLASS CIDADE class Cidade { // CONSTRUTOR function __construct() { return true; } /** * FUNCTION getCidade * @param Number codigo * @return xml */ function getCidade($codigo) { // CONEXAO $conexao = new Conexao(); $cnx = $conexao->conectar(); $nCodigo = $codigo; $sSQL = "SELECT cid_codigo, cid_nome FROM cidade WHERE cid_est_codigo = $nCodigo ORDER BY cid_nome ASC"; $qSQL = mysql_query($sSQL, $cnx) or die(mysql_error()); // GERANDO XML echo "<?xml version='1.0' encoding='UTF-8' ?>"; echo "<cidades>"; while ($aRow = mysql_fetch_array($qSQL)) { echo "<cidade>"; echo "<codigo><![CDATA[" . $aRow['cid_codigo'] . "]]></codigo>"; echo "<cidade><![CDATA[" . $aRow['cid_nome'] . "]]></cidade>"; echo "</cidade>"; } echo "</cidades>"; } } /** * INICIAMOS A CLASSE E PASSAMOS O CODIGO DO * ESTADO COMO PARAMETRO PARA A CONSULTA */ $cidade = new Cidade(); echo $cidade->getCidade($_GET['codigo']); ?>
4ª Etapa
Nesta quarta e última etapa, criaremos e escreveremos nosso arquivo Flash.
Então, crie um novo arquivo Flash, e arraste dois Components ComboBox para o palco, de o nome de instância para eles de estado_cbx e cidade_cbx, também crie um campo de texto dinâmico com o nome de alerta_txt.
Abaixo temos a imagem de como ficará os objetos no palco.

Agora, insira uma nova Layer para que possamos escrever nosso código ActionScript, onde, este por sua vez será o reponsável pelo carregamento e população dos ComboBox.
System.useCodepage = true; /** * FUNCTION getEstado */ getEstado = function() { var xmlEstado:XML = new XML(); xmlEstado.ignoreWhite = true; xmlEstado.load("Estado.php"); xmlEstado.onLoad = function(ok) { if (ok) { var aDados = Array(); var nTotal = this.firstChild.childNodes.length; // PASSANDO DADOS DO XML PARA ARRAY for (var i = 0; i < nTotal; i++) { aNode = this.firstChild.childNodes[i]; aDados[i] = { data:aNode.childNodes[0].firstChild.nodeValue, label:aNode.childNodes[1].firstChild.nodeValue }; } // POPULANDO COMBOBOX COM OS DADOS DO ARRAY estado_cbx.dataProvider = aDados; } }; // LISTENER PARA ESTADO var objEstado:Object = new Object(); objEstado.change = function() { sEstado = estado_cbx.selectedItem.label; nCodigo = estado_cbx.value; alerta_txt.text = sEstado; getCidade(nCodigo); }; estado_cbx.addEventListener("change", objEstado); } getEstado(); /** * FUNCTION getCidade * @param Number nCodigo */ getCidade = function(nCodigo) { var xmlCidade:XML = new XML(); xmlCidade.ignoreWhite = true; xmlCidade.load("Cidade.php?codigo="+nCodigo); xmlCidade.onLoad = function(ok) { if (ok) { var aDados = Array(); var nTotal = this.firstChild.childNodes.length; // PASSANDO DADOS DO XML PARA ARRAY for (var i = 0; i < nTotal; i++) { aNode = this.firstChild.childNodes[i]; aDados[i] = { data:aNode.childNodes[0].firstChild.nodeValue, label:aNode.childNodes[1].firstChild.nodeValue }; } // POPULANDO COMBOBOX COM DADOS DO ARRAY cidade_cbx.dataProvider = aDados; } } // LISTENER PARA CIDADE var objCidade:Object = new Object(); objCidade.change = function() { sEstado = estado_cbx.selectedItem.label; sCidade = cidade_cbx.selectedItem.label; alerta_txt.text = sCidade + " - " + sEstado; }; cidade_cbx.addEventListener("change", objCidade); }
Agora, salve o arquivo Flash com qualquer nome, compile e teste-o.
Prontinho, nosso trabalho está feito, e com a certeza de que tiraremos bastante proveito dele.
O post ficou grande, porém tenho a certeza de que estou progredindo em meus estudos e em meu conhecimento também, e assim espero repassar o pouco do que estou aprendendo com os demais, pois, como nossa areá vive em constante apredizado e nem todos tem a oportunidade de estar aprendendo em uma sala de aula fica ai então a pequena contribuição.
Clique aqui e veja como ficou nossa pequena aplicação
Macanudo, finalizo este post ao som de Chromophobia, Gui Boratto. d(-_-)b
abril 13th, 2009 at 2:20 am
Nossa. Falou e disse alí no final. Não é todos que tem a oportunidade de correr atrás de aprendizado em sala de aula, com o professor alí do lado matando todas as dúvidas. No meu caso, me falta tempo. Mas… não seria possível de fazer isso internamente no flash sem uso de linguagem externa? O máximo que ousei destrinchar foi o PHP, mas não sou muito bom nele não.
abril 13th, 2009 at 11:13 am
@Souza
Então velho, tu poderia fazer isto utilizando array, assim não necessitaria do php.
maio 14th, 2009 at 9:56 am
Ola..
Seria possivel fazer um exemplo simples de alimentaçao do combobox… Tenho uma tabela com um campo categoria. Quero pegar o conteudo dessa tabela e jogar num combo box, só isso. Esse combo estara num form onde o cliente vai cadastrar o produto, selecionar a categoria e pronto. Tem como fazer um exemplo simples assim? Muito obrigado..
maio 18th, 2009 at 12:29 am
@luiz
dae velho,
da uma olhada nestes links, talvez seja a solução para seu problema,
Abraço
http://www.guiadohardware.net/comunidade/combobox-mysql/917901/
http://www.webdeveloper.com/forum/showthread.php?t=80222
maio 19th, 2009 at 5:20 pm
boa tarde não consegui fazer não…. ta dando erro
fiquei o dia inteiro quebrando a cabeça …. estou instalando o wampserver como servidor …. da uma forcinha ai…. valeu brother
maio 19th, 2009 at 11:21 pm
@Diogo
dae Diogo, qual o erro que esta dando pra vc?
maio 27th, 2009 at 8:52 am
Então a parte que vc explicou esta 100% mais eu coloquei mais uma tabela de clientes…
tab.=> cliente:
cli_codigo/cli_cit_codigo/cli_razao:
**********************************************************
Por que eu estou tentando colocar mais um filtro de clientes por cidade>>>
Estado / Cidade / Cliente……
Se puder me ajudar acradeço de coração brother…. valeu t+++++++++
maio 27th, 2009 at 5:08 pm
@Diogo,
correto, pelo que entendi tu quer fazer mais um combobox mostrar o cliente após selecionar a cidade,
tu precisa criar mais uma função para o cliente apenas, onde, na função change da cidade tu coloca assim:
objCidade.change = function() {
nCodigoCidade = cidade_cbx.value;
// aqui será a nova function que recebera o codigo da cidade selecionada
getCliente(nCodigoCidade);
}
ai lógico, tu precisa criar a class Cliente no php para buscar os dados do cliente conforme o código solicitado, que por sua vez será identica as outras classes.
espero que tenha te ajudado, qualquer coisa posta novamente,
Abraço.
maio 28th, 2009 at 9:48 am
Bom dia…. Obrigado pela atenção….
colocar o combobox seria legal mais eu precisava mesmo que filtrava os clientes da cidade como lista exemplo…
*******************************************************
CREATE TABLE `cliente` (
`cli_codigo` int(5) NOT NULL AUTO_INCREMENT,
`cli_cit_codigo` int(5) DEFAULT NULL,
`cli_razao` varchar(100) DEFAULT NULL,
`cli_endereco` varchar(250) DEFAULT NULL,
`cli_fone` varchar(20) DEFAULT NULL,
PRIMARY KEY (`cli_codigo`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
********************************************************
assim ficar assim o filtro….
Estado: São Paulo
Ciadade: Campinas
—————————
mario augusto
av. jorm 192
(44) 5266-9958
luciano silva
av. tomas 195
(44) 6589-6555
=======================================================
agradeço des de já peloa atenção…..
caso queira entrar em contato…
diogo.lf@hotmail.com
valeu um abraço t++++++
maio 28th, 2009 at 12:38 pm
@Diogo,
a principio tu precisa somente fazer uma consulta SQL para filtrar os clientes da cidade solicitada, e lógico tu precisa tratar esta informação no flash também,
para a consulta pode ser assim:
onde, nCodigoCidade segue o exemplo do que ja havia postado no outro comentário,
espero que seja isto seu problema,
maio 28th, 2009 at 2:11 pm
meua amigo sou meio burro para isso….
patinei patinei e nada
Cliente.php
conectar();
$nCodigoCidade = $codigo;
$sSQL = “SELECT
cli_razao, cli_endereco, cli_fone
FROM
cliente
WHERE
cli_cit_codigo = nCodigoCidade
ORDER BY
cli_razao ASC”;
$qSQL = mysql_query($sSQL, $cnx) or die(mysql_error());
// GERANDO XML
echo “”;
echo “”;
while ($aRow = mysql_fetch_array($qSQL)) {
echo “”;
echo “”;
echo “”;
echo “”;
}
echo “”;
}
}
/**
* INICIAMOS A CLASSE E PASSAMOS O CODIGO DO
* ESTADO COMO PARAMETRO PARA A CONSULTA
*/
$cliente = new Cliente();
echo $cliente->getCliente($_GET['codigo']);
?>
========
Flash
System.useCodepage = true;
/**
* FUNCTION getEstado
*/
getEstado = function() {
var xmlEstado:XML = new XML();
xmlEstado.ignoreWhite = true;
xmlEstado.load(“Estado.php”);
xmlEstado.onLoad = function(ok) {
if (ok) {
var aDados = Array();
var nTotal = this.firstChild.childNodes.length;
// PASSANDO DADOS DO XML PARA ARRAY
for (var i = 0; i < nTotal; i++) {
aNode = this.firstChild.childNodes[i];
aDados[i] = { data:aNode.childNodes[0].firstChild.nodeValue, label:aNode.childNodes[1].firstChild.nodeValue };
}
// POPULANDO COMBOBOX COM OS DADOS DO ARRAY
estado_cbx.dataProvider = aDados;
}
};
// LISTENER PARA ESTADO
var objEstado:Object = new Object();
objEstado.change = function() {
sEstado = estado_cbx.selectedItem.label;
nCodigo = estado_cbx.value;
alerta_txt.text = sEstado;
getCidade(nCodigo);
};
estado_cbx.addEventListener(“change”, objEstado);
}
getEstado();
/**
* FUNCTION getCidade
* @param Number nCodigo
*/
getCidade = function(nCodigo) {
var xmlCidade:XML = new XML();
xmlCidade.ignoreWhite = true;
xmlCidade.load(“Cidade.php?codigo=”+nCodigo);
xmlCidade.onLoad = function(ok) {
if (ok) {
var aDados = Array();
var nTotal = this.firstChild.childNodes.length;
// PASSANDO DADOS DO XML PARA ARRAY
for (var i = 0; i < nTotal; i++) {
aNode = this.firstChild.childNodes[i];
aDados[i] = { data:aNode.childNodes[0].firstChild.nodeValue, label:aNode.childNodes[1].firstChild.nodeValue };
}
// POPULANDO COMBOBOX COM DADOS DO ARRAY
cidade_cbx.dataProvider = aDados;
}
}
// LISTENER PARA CIDADE
var objCidade:Object = new Object();
objCidade.change = function() {
sEstado = estado_cbx.selectedItem.label;
sCidade = cidade_cbx.selectedItem.label;
nCodigoCidade = cliente_cbx.value;
alerta_txt.text = sCidade + ” – ” + sEstado;
};
cidade_cbx.addEventListener(“change”, objCidade);
}
getCidade();
/**
* FUNCTION getCliente
* @param Number nCodigo
*/
getCliente = function(nCodigoCidade) {
var xmlCliente:XML = new XML();
xmlCliente.ignoreWhite = true;
xmlCliente.load(“Cliente.php?codigo=”+nCodigoCidade);
xmlCliente.onLoad = function(ok) {
if (ok) {
var aDados = Array();
var nTotal = this.firstChild.childNodes.length;
// PASSANDO DADOS DO XML PARA ARRAY
for (var i = 0; i >>>
Onde encontrar……..
Dez de já agradeço valeu….
qual coisa entre em contato pelo diogo.lf@hotmail.com
junho 22nd, 2009 at 9:40 am
bom dia…
desculpe te incomodar mais um pouco mais des daquele bendito dia que estou quebrando a cabeça… e ainda não consegui…..
da uma olhada.
http://www.grifeinove.com.br/cidade_combox.rar
se puder da uma olhadinha e me retornar….
des de já agraço brother valeu um abraço.
junho 23rd, 2009 at 3:46 pm
boa tarde…..
gostei muito do resultado.. atempos eu estava procurando algo de estado assim…..
o seu funcionou direitinho…
mais estou querendo implementar com lojas nestas cidades
contendo um scroll com nome;telefone;endere por cidade….
se puder me dar uma mão eu agradeço… mais mesmo assim agradeço meu brother….. t+
junho 23rd, 2009 at 10:43 pm
@Diogo
ae velho, tu é persistente hein, rs
não testei nada, porém apenas notei que tu esta passando a variavel codigo no php de forma errada,
repare como você está fazendo:
repare que você não esta passando a variavel $nCodigoCidade na consulta, altere ai e ve se rola.
a principio acredito que seja isto o problema,
bom estudos, abraço.
junho 23rd, 2009 at 10:57 pm
@Marcos
que bom que lhe ajudou…
da uma olhada nestes links, talvez resolva o seu problema.
bom estudo, abraço.
http://www.google.com.br/search?hl=pt-BR&safe=off&num=20&q=classe+scroll+%22flash%22&btnG=Pesquisar&meta=lr%3Dlang_pt
http://imasters.uol.com.br/artigo/3393/actionscript/scroll_para_movieclips_e_textfields/
junho 24th, 2009 at 4:34 pm
Valeu Andrews Consegui valeu um abraço…..
uffaa até que fim em… muito obrigado de coração
valeu ufaaa esta foi dificil,,,, rs
junho 26th, 2009 at 7:50 am
Bom dia….
dei um olhada nos link acima…. aprendi alguma coisa…
só um pergunta como eu passo para ler no flash
pois ele me retorna objCliente..
junho 26th, 2009 at 11:32 am
@Marcos
não entendi, o que tu quer que ele leia?
junho 26th, 2009 at 1:23 pm
então ex. coloquei outra tabela
/*
MySQL Data Transfer
Source Host: localhost
Source Database: cidadesite
Target Host: localhost
Target Database: cidadesite
Date: 26/6/2009 13:19:37
*/
SET FOREIGN_KEY_CHECKS=0;
– —————————-
– Table structure for lojas
– —————————-
DROP TABLE IF EXISTS `lojas`;
CREATE TABLE `lojas` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`Fantasia` varchar(150) DEFAULT NULL,
`Endereco` varchar(150) DEFAULT NULL,
`Bairro` varchar(150) DEFAULT NULL,
`Telefone` varchar(20) DEFAULT NULL,
`cid_est_codigo` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
– —————————-
– Records
– —————————-
Eu quero que me retorna …
Loja; cidade; telefone;
em texto mesmo……. não sei se é textfild ou htmltext ou text
ele me retorna ex.
uf: Mato Grosso
Cidade: Ivaipora
objCliente;objCliente;objCliente
caso tenha tres cliente na cidade
……
junho 27th, 2009 at 9:03 am
Ex. vamos ver o que já esta pronto…..
ex. no lugar cidade invez de ser combobo seria para imprimir como texto….
UF: Mato Grosso
Cidade:
ivaiopora
moreira
tocsss
dddd
assim por dia ante
junho 27th, 2009 at 12:39 pm
@Marcos
brother, o que tu precisa fazer é apenas trazer estes dados junto com a consulta de cidades, assim incrementando só que precisa para gerar o xml.
E no flash tu precisa apenas pegar estas informações e tratá-las, na function getCidade, onde você irá remover o listener do combobox e somente refenrênciar para mostrar no label.
ex:
Só lembrando que este exemplo serve apenas para um dado, caso deva aparecer mais, ai tu precisa encontrar uma outra forma de fazer mostrar estas informações.
Abraço.
janeiro 9th, 2010 at 6:42 am
I admire the valuable information you offer in your articles.Great post, You make 100% valid points in a concise and pertinent fashion, This is a really good read for me, thank you for your time.
abril 20th, 2010 at 9:53 am
Meu querido Deus te abençoe. Você me ajudo é muito.