Você está na página 1de 9

Configuração do banco de dados MySQL e do PHP para acessá-lo

Como em todos os aplicativos de banco de dados, a primeira coisa a fazer é definir a estrutura dos dados.
Neste caso, foi criada uma nova tabela MySQL, com os seguintes campos:

* contact ID, smallint, primary key, auto_increment


* lastName, tinytext
* firstName, tinytext
* phone, tinytext
* email, tinytext
* picFile, tinytext
*caption, tinytext

Cada campo foi preenchido manualmente, com instruções como as seguintes:

insert into contacts


values (NULL, 'Anderson', 'Lois', '301-424-5555',
'lois@yahoo.com', 'lois.jpg', 'Lois, 2001');

Esta é uma tabela pequena. Em uma tabela maior, faria mais sentido preencher os dados através da leitura de
um arquivo de texto com as informações necessárias. Para ter certeza de que a tabela pode ser acessada
através de PHP, foi feito um teste, utilizando o seguinte código de amostra:

<?php
mysql_connect("servername","username","password");
mysql_select_db("databasename");
$qr = mysql_query("SELECT * FROM contacts");
$nrows = mysql_num_rows($qr);
for ($i=0; $i < $nrows; $i++) {
$row = mysql_fetch_array($qr);
echo $row['lastName'].", ".$row['firstName']."<br>";
echo " ".$row['phone']." ".$row['email']."<br>";
echo " ".$row['picFile'].": ".$row['caption']."<br><br>";
}
?>

Configuração do filme Macromedia Flash

Para exibir texto em filmes Macromedia Flash, é necessário ter um ou vários campos de texto. Pode-se criar
dinamicamente um campo, através de create TextFiled, ou estabelecer um campo no filme, atribuir-lhe um
nome de instância e usá-lo. Minha opção foi a segunda alternativa. O principal campo de texto tem o nome de
instância "content" (localizado na camada "text field & scrollbar" do FLA) e está configurado para linhas
múltiplas (multilinha), através da seleção da opção "Render text as HTML" (processar texto como HTML), para
que se possa inserir links.

Adição da barra de rolagem

Como todos os registros de endereços que se iniciam com a mesma letra serão colocados em um mesmo
campo, é preciso que o campo seja rolável, caso haja mais registros do que os que couberem na tela. Para
fazer isso, abra o painel Componentes e arraste uma cópia da barra de rolagem para o campo de texto. Ela
automaticamente se encaixa no lugar e é associada com a instância "content". Não é fácil?

Configuração do clipe de filme para conter um JPEG

Também é necessário inserir no filme algo para conter o JPEG que será carregado. Para fazer isso, crie um
clipe de filme como alocador de espaço (na camada "pic, caption" do FLA) e atribua-lhe o nome de instância
"picHolder". Na mesma camada, inclua outro campo de texto (multilinha, mas não HTML), com o nome de
instância "caption".

Configuração ds guias como botões em clipes de filme.

Como todas as guias têm exatamente a mesma função, mas aparência ligeiramente diferente, pode-se usar o
novo recurso do Macromedia Flash MX, botões em clipes de filmes. Em outras palavras, cria-se uma guia
modelo que é um clipe de filme, copia-se a mesma para tantas guias quantas forem necessárias, e define-se o
código para colocar a letra certa e anexar o identificador correto na guia, para que esta responda a um clique de
mouse.

Cada guia em clipe de filme contém um campo de texto denominado "letter". Cada guia em clipe de filme
também contém uma função onRelease, designada ao mesmo, que informará o que deve ser feito quando for
dado um clique no clipe de filme. Para efetuar a ação certa, contudo, é necessário saber que guia está sendo
acessada. Para que isso aconteça, é necessário nomear as guias em clipes de filmes de forma que se possa
descobrir qual delas está sendo acessada. A guia A recebe o nome de instância "tabA", a guia B, "tabB", etc.
Tendo em mente essas informações, vamos examinar o código (no quadro 1 do filme principal) que configura as
três guias corretamente (de forma que exibam a letra correta e sejam executadas de forma correta ao se clicar
nas mesmas):

for (var i=65; i<=67; i++) {


// exibir a letra correta na guia
this["tab"+chr(i)].letter.text = chr(i);
// quando esta guia é clicada
this["tab"+chr(i)].onRelease = function() {
// o caractere chr(i) não pode ser usado aqui-- é preciso usar o nome mc
// porque i não será configurado quando o evento realmente acontecer
c.thisLetter = this._name.substr(3,1);
bigLetter.text = c.thisLetter;
content.htmlText = "Loading data for " + c.thisLetter;
// o escopo desta função é uma linha de tempo principal, para poder referir-se
diretamente a c
c.sendAndLoad("flashmx_dbPassAndReturnString.php",c,"POST");
}
}

Atribua cada letra, de A a C, ao campo de texto "letter" da guia. Da mesma forma, designe para cada letra uma
rotina que faça o seguinte, ao se clicar na guia:

• Coloca a letra associada com a guia selecionada na propriedade "thisLetter" do objeto c, um objeto
LoadVars que será discutido na próxima página.
• Exibe a letra selecionada como imagem de segundo plano no catálogo de endereços.
• Informa o usuário que o programa está obtendo as informações do banco de dados.
• Inicia a transferência, usando o objeto LoadVars c para transferir os dados.

Não devemos esquecer que tudo isso não está sendo efetuado no filme principal; são instruções configuradas
para serem processadas quando se clicar em uma guia. Em seguida, é necessário configurar o próprio objeto
LoadVars, bem como as ações que serão executadas quando os dados forem retornados do script PHP. A
próxima seção explica como fazer isto.

Os objetos LoadVars transferem dados entre scripts no lado do servidor - como PHP, ASP, CF, Perl ou JSP - e filmes
Macromedia Flash MX. As propriedades do objeto LoadVars são enviadas ao script como variáveis, pelo método
POST ou GET. Todas as variáveis retornadas do script estão disponíveis no Macromedia Flash como propriedades
do objeto LoadVars especificado no método de carregamento.

Transferência de Dados com o objeto LoadVars

Uso de LoadVars.send

format = loadVars.send( url, target, method ) // onde todos os elementos são expressões.

Na amostra, envie a letra da guia selecionada, para que o script PHP possa usá-la para consultar o banco de dados.
Assim, será necessário criar um objeto LoadVars com uma de suas propriedades atribuída àquela letra. Antes de
examinar o código da amostra, apresentamos um exemplo em que um valor é atribuído a uma propriedade de um
objeto LoadVars recém-criado, e enviado a um script PHP:

var c = new LoadVars();


c.thisLetter = "A";
c.send("dbquery.php","_self","POST");

O script lê a propriedade como uma variável POSTed, e a utiliza para consultar o banco de dados e exibir as
informações encontradas:

<?php
mysql_connect("servername","username","password");
mysql_select_db("dbname");

$qr = mysql_query("SELECT * FROM contacts WHERE LEFT(lastName,1) =


'".$HTTP_POST_VARS['thisLetter']."'");

// exibe a linha de visitantes (1)


$nrows = mysql_num_rows($qr);
for ($i=0; $i < $nrows; $i++) {
$row = mysql_fetch_array($qr);
echo $row['lastName'].", ".$row['firstName']."<br>";
echo " ".$row['phone']." ".$row['email']."<Br>";
echo " ".$row['picFile'].": ".$row['caption']."<Br><Br>";
}
?>

Este é o resultado que aparece na janela de saída (a mesma janela em que o filme Flash estava sendo reproduzido,
porque especificamos "_self" como o alvo de loadVars.send):

Anderson, Lois
301-424-5555 lois@yahoo.com
lois.jpg: Lois, 2001

Armand, Cheryl and Joe


912-948-4444 armandcj@hh.com
babysue.jpg: C and J's baby Sue, 9 days old

(etc)

Como usamos POST como parâmetro de envio, as variáveis tiveram de ser lidas com PHP $HTTP_POST_VARS. Se
for preciso que você mesmo crie a seqüência de consulta (como acontece às vezes), esta poderá ser enviada sem
especificar o método, o que fará com que ela reverta à predefinição GET, devido à seqüência de consulta anexada.

var c = new LoadVars();


c.send("dbquery.php?thisLetter=A","newWindow");

O código no arquivo dbquery.php produz o mesmo resultado na janela de saída do que o código visto anteriormente,
mas em uma nova janela de documentos (newWindow):

<?php
mysql_connect("servername","username","password");
mysql_select_db("dbname");

$qr = mysql_query("SELECT * FROM contacts


WHERE LEFT(lastName,1) = '".$HTTP_GET_VARS['thisLetter']."'");

// exibe a linha de visitantes(1)


$nrows = mysql_num_rows($qr);
for ($i=0; $i < $nrows; $i++) {
$row = mysql_fetch_array($qr);
echo $row['lastName'].", ".$row['firstName']."<Br>";
echo " ".$row['phone']." ".$row['email']."<Br>";
echo " ".$row['picFile'].": ".$row['caption']."<Br><Br>";
}
?>

Ao criar um aplicativo Flash para o lado do servidor, recomenda-se executar código simples, como o código acima,
usando .send para ter certeza de que as variáveis serão transmitidas como se espera, antes de testar todo o
aplicativo.

Recebimentos com o LoadVars.load


format = loadVarsObject.load( url ) // onde url é uma expressão

Agora que você já sabe como enviar variáveis ao script PHP e fazer com que elas sejam usadas corretamente no
mesmo, o que deve fazer para que as informações sejam retornadas ao Macromedia Flash? Antes de começar a usar
as funções de envio e recebimento juntas, vamos examinar apenas o recebimento, com o método de carregamento
do objeto LoadVars.

O envio de variáveis ao Macromedia Flash por um script no lado do servidor deve sempre ser feito na forma de uma
seqüência de var=values, separadas por sinais de &; exemplo:

lastName=Anderson&phone=301-424-5555

Se essa seqüência for enviada como resposta a um carregamento de LoadVars, as variáveis poderão ser lidas em
Macromedia Flash, como propriedades do objeto LoadVars.

Mas há mais uma coisa que deve ser levada em consideração. A obtenção de informações de um banco de dados e
seu retorno ao Macromedia Flash não são instantâneos - é necessário que algo informe o Macromedia Flash quando
a tarefa se completar, para que o filme não tente usar as variáveis antes que elas estejam disponíveis (um problema
comum entre usuários inexperientes). Para isso, é necessário definir uma função que será executada quando os
dados forem retornados, e atribuir essa função à propriedade onLoad do objeto LoadVars. Em outras palavras, deve
haver uma instrução de que, quando as variáveis tiverem sido recebidas, a função deve ser executada. Isto pode ser
feito de duas maneiras: com uma função anônima (também chamada função literal):

var c = new LoadVars();


c.onLoad = function() {
returnvals.text = "returned from php: \n\n";
for (i in this) {
returnvals.text += i + " = " + this[i] + "\n";
}
};

ou com uma função nomeada, que é então designada para a propriedade onLoad. Essa função não deve ser
chamada - ou seja, não coloque () após o nome da função:

function showValues() {
returnvals.text = "returned from php: \n\n";
for (i in this) {
returnvals.text += i + " = " + this[i] + "\n";
}
}

var c = new LoadVars();


c.onLoad = showValues;

Em qualquer das duas alternativas, referir-se a "this" dentro da função equivale a chamar o objeto LoadVars através
do nome.

Assim, para solicitar os dados, pode-se utilizar qualquer uma das seqüências de código acima, acrescentando a
seguinte linha:
c.load("passvars.php");

e, em passvars.php, este código...

<?php
$lastName = "Anderson";
$phone = "301-424-5555";
echo "lastName=".$lastName."&phone=".$phone;
?>

...resulta no seguinte:

retorno do php:

phone = 301-424-5555
lastName = Anderson
onLoad = [type Function]

As duas variáveis que se quer receber são phone (telefone) e lastName (sobrenome). onLoad também aparece no
exemplo, embora não seja uma variável, pois também é uma propriedade do objeto LoadVars. Normalmente,
sabemos que variáveis esperamos, e as tarefas levarão em conta apenas essas variáveis, ignorando outras
propriedades do objeto LoadVars. Pode-se também eliminar quaisquer propriedades supérfluas antes de emitir o
comando de carregamento (embora onLoad não seja supérfluo e precise ser sempre uma propriedade de LoadVars
para que este funcione corretamente).

Envio e recebimento simultâneo, através de LoadVars.sendAndLoad

format = loadVarsObject.sendAndLoad( url, loadVarsObject, method )


// onde url e método são expressões, e loadVarsObject não o é

Na amostra, vamos enviar a letra selecionada (ou a guia que foi selecionada) e enviar de volta todos os registros
retornados pela consulta. Assim, a rotina PHP deverá enviar de volta uma seqüência var=value de todas as variáveis,
e o filme Macromedia Flash terá que usar as propriedades corretas do objeto LoadVars para exibi-las no campo de
texto com rolagem colocado no filme.

O script PHP retorna uma seqüência semelhante à seguinte:

"n=4&lastName0=Anderson&firstName0=Lois&phone=301-424-5555&...&caption3=lastyear"

que contém valores correspondentes aos quatro registros encontrados em que o sobrenome começa pela letra A.
Observe que também adicionamos uma variável no início da seqüência, para informar o Macromedia Flash de
quantos registros esperar, de forma que se possa configurar o ciclo correto para ler todos eles. Segue-se uma
amostra parcial do script PHP:

$nrows = mysql_num_rows($qr);
$rString = "n=".$nrows;
for ($i=0; $i < $nrows; $i++) {
$row = mysql_fetch_array($qr);
$rString .= "&lastName".$i."=".$row['lastName'].
"&firstName".$i."=".$row['firstName'];
$rString .= "&phone".$i."=".$row['phone']."&email".$i."=".$row['email'];
$rString .= "&picFile".$i."=".$row['picFile'].
"&caption".$i."=".$row['caption'];
}
echo $rString;

Já examinamos todo o código Macromedia Flash necessário; agora, só é preciso definir a função a ser executada
quando as variáveis forem retornadas (para ler e fazer algo com essas variáveis) e, em seguida, emitir o comando
sendAndLoad correto. Segue-se o código do filme Macromedia Flash (¬ indica uma quebra de linha):

function showContent() {
var i;
content.htmlText = "";
for (i=0; i < this.n; i++) {
if (this["picFile"+i] != "") {
content.htmlText += ¬
"<b>" + this["firstName"+i] + " " + this["lastName"+i] + ¬
"</b>" + "<a href='asfunction:showjpg," + this["picFile"+i] + ¬
"," + escape(this["caption"+i]) + ¬
"'> (<font color='#0000cc'>pic</font>)¬
</a><Br>";
} else {
content.htmlText += ¬
"<b>" + this["firstName"+i] + " " + this["lastName"+i] + ¬
"</b><Br>";
}
content.htmlText += " " + this["phone"+i] + "<Br>";
content.htmlText += ¬
" <a href='mailto:" + this["email"+i] + "'>" + ¬
this["email"+i] + "</a><Br><Br>";
}
}

// Criação de novo objeto loadvars c para transferência de dados


var c = new LoadVars();
c.onLoad = showContent;

Lembre-se que é necessário executar o próprio sendAndLoad correspondente à guia selecionada de dentro da rotina
onRelease, com o seguinte código:

this["tab"+chr(i)].onRelease = function() {
...
c.sendAndLoad("flashmx_dbPassAndReturnString.php",c,"POST");
}

Agora, estamos prontos para enviar um A, B ou C ao script PHP, e fazer algo com as variáveis retornadas, utilizando
o mesmo objeto LoadVars c para enviar e receber. Para entender o código da função showContent, é necessário
lembrar que ele apresenta maneiras equivalentes de acessar a propriedade phone3 do objeto c.
c.phone3

and

c["phone"+3]
and

i=3
c["phone"+i]
and

i=3
this["phone"+i] //se o código estiver dentro de uma função atribuída a c

(Para obter mais informações a esse respeito, consulte a página Addressing Movieclips (Trabalho com Clipes de
Filmes), no site my actionscript-toolbox.com, que se aplica a todos os objetos ActionScript, e não apenas a clipes de
filmes.)

Assim, basta tomar cada propriedade retornada e exibi-la conforme desejado, no campo de texto criado.

asfunction

format = asfunction:functionname,param //onde param é uma expressão

Há outros dois pontos interessantes nesta amostra. Um é o uso de asfunction para chamar uma função no próprio
Macromedia Flash; o outro é o carregamento direto de um JPEG no Macromedia Flash. Como se pode ver no código
de showContent, acima, asfunction possibilita o estabelecimento de um link semelhante a HTML de um campo de
texto do Macromedia Flash a uma outra rotina Macromedia Flash. Nesse caso, ele chama a função showjpg e envia
um parâmetro (só pode enviar um) que contém o nome do arquivo JPEG e a legenda, separados por um #.
Oshowjpg terá a seguinte aparência:

function showjpg(paramString) {
// para obter os parâmetros individuais:
// params[0] = nome do arquivo de imagem
// params[1] = legenda
var params = paramString.split("#");
picHolder.loadMovie(params[0]);
caption.text = unescape(params[1]);
}

Primeiro, é necessário dividir o parâmetro enviado nos dois parâmetros que se deseja, usando a função string split
para produzir um array de dois elementos. O primeiro elemento agora contém o nome do JPEG; o segundo, a
legenda.

Carregamento de JPEGs

format = mcInstanceName.loadMovie(jpgfile) //onde jpgfile é uma expressão

A linha seguinte
picHolder.loadMovie(params[0]);

dá instrução para carregar a imagem especificada pelo nome de arquivo armazenado em params[0] no clipe de filme
picHolder. Como picHolder foi criado com um ponto de registro superior esquerdo (0,0), e redimensionamos todas as
fotos para corresponder a seu tamanho, a foto é carregada no lugar exato, e não é necessário fazer mais nada a
respeito. Após carregar o JPEG em seu alocador de espaço, preencha a legenda com o texto de legenda enviado. A
função unescape é usada para decodificar o valor URL (observe que usamos a função de escape para codificar o
valor como URL antes de enviá-lo - caso contrário, caracteres como ":" e "," contidos na legenda não seriam
reproduzidos corretamente).

É só isso. O objeto LoadVars envia dados, o script PHP os usa e envia dados de volta, e a função showContents
processa os dados, quando estes são recebidos pelo Macromedia Flash.