<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MXStudio &#187; hugo</title>
	<atom:link href="http://www.mxstudio.com.br/author/hugo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mxstudio.com.br</link>
	<description>Macromedia e Adobe - Artigos, colunas, tutorias e muito mais...</description>
	<lastBuildDate>Sun, 29 Jan 2012 11:31:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Catálogo de Produtos em Flash &#8211; Parte 3</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_3/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_3/#comments</comments>
		<pubDate>Wed, 17 Jan 2007 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Na coluna de hoje abordaremos um estudo falando sobre gera&#231;&#227;o din&#226;mica de arquivos XML.&#60;br /&#62;<br />
&#60;br /&#62;<br />
]]></description>
			<content:encoded><![CDATA[<link rel="stylesheet" type="text/css" href="http://www.mxstudio.com.br/_css/PadraoCss.css" /><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script><br />
<table border="0" width="100%" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" id="colunaTexto">
<h1>Catálogo de Produtos em Flash &#8211; Parte 3</h1>
<p>Olá amigos do MXSTUDIO!</p>
<p>Na <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=989">coluna anterior</a>, coloquei no final que nesta iríamos estudar sobre a parte da interface em Flash, porém lembei-me que também temos que fazer com que os dados cadastrados sejam passíveis de leitura a partir do Flash. Portanto, na coluna de hoje abordaremos um estudo falando sobre geração dinâmica de arquivos XML.</p>
<h2>Pré-requisitos</h2>
<p>Ter concluído as etapas anteriores:</p>
<ul>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=982">Catálogo de Produtos em Flash &#8211; Parte 1 </a></li>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=989">Catálogo de Produtos em Flash &#8211; Parte 2 </a></li>
</ul>
<p>Como na coluna anterior, veremos várias linhas de código, mas veremos também que com o auxílio de <a target="_blank" href="http://www.hufersil.com.br/lumine">Lumine </a>fazendo a integração com o banco de dados, fica bem mais fácil o desenvolvimento.</p>
<h2>Preparando a pasta dos arquivos.</h2>
<p>Primeiro, iremos criar uma pasta chamada <em>xml</em>, onde armazenaremos os arquivos escritos em PHP que irão gerar dinamicamente o conteúdo XML para recuperarmos através do Flash.<br />
<img border="1" width="296" src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_catalogoProdutos_jan07_parte3_imagens/pasta_xml.gif" height="284" /><br />
<em>Pasta chamada &#8220;xml&#8221;, destacada em azul </em></p>
<p>Depois de criada a pasta, vamos criar um arquivo PHP responsável por gerar um XML listando todas as categorias, para possamos posteriormente criar uma lista de categorias dinamicamente dentro de nosso arquivo em Flash. Abaixo segue o código para geração do mesmo, salve-o com o nome de <em>categorias.php</em> dentro da pasta <em>xml</em>:</p>
<pre class="brush: php; title: ; notranslate">&amp;lt;?php

// incluimos o arquivo de configuração config.php
// que está dentro da pasta admin
require_once '../admin/config.php';

// importamos a classe de categoria
Util::Import('entidades.Categoria');

// criamos um objeto para recuperar as categorias
$objCategorias = new Categoria;
// ordenamos pelo nome em ordem crescente
$objCategorias-&amp;gt;orderBy('nome asc');
// recuperamos todas as categorias
$total = $objCategorias-&amp;gt;find();

// iniciamos um XML
$xml = '&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?'.'&amp;gt;';

// se encontrou categorias
if($total &amp;gt; 0) {
// inicia o nó principal com o atributo
// indicando o total de categorias
$xml .= '&amp;lt;lista total=&quot;'.$total.'&quot;&amp;gt;';

// enquanto houver categorias na lista
while($objCategorias-&amp;gt;fetch()) {
// cria um nó XML para exibição no arquivo
$xml .= '&amp;lt;categoria nome=&quot;'. utf8_encode($objCategorias-&amp;gt;nome).'&quot;';
$xml .= ' id=&quot;'.$objCategorias-&amp;gt;idcategoria.'&quot; /&amp;gt;';
}

// fecha o arquivo XML
$xml .= '&amp;lt;/lista&amp;gt;';

} else { // senão encontrou categorias

// informamos que não há categorias com um elemento vazio
// com o atributo total com valor 0
$xml .= '&amp;lt;lista total=&quot;0&quot; /&amp;gt;';
}

// mudamos o header
header(&quot;Content-Type: text/xml&quot;);
// enviamos o xml
echo $xml;

?&amp;gt;</pre>
<p>Abaixo, vemos uma imagem de exemplo mostrando o arquivo XML gerado sendo exibido no Firefox</p>
<p><img border="1" width="366" src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_catalogoProdutos_jan07_parte3_imagens/xml_gerado.gif" height="129" /><br />
<em>XML gerado dinamicamente utilizando o código mostrado.</em></p>
<p>Como pudemos observar, o processo de geração do código é bem simples. Através do método <em>fetch</em> herdado da classe LumineBase, nossa classe chamada <em>Categoria</em> gerada através da engenharia reversa do Lumine, faz com que possamos recuperar todos os registros da tabela, efetuar um laço do tipo <em>while</em>, atualizando os valores a cada chamada, facilitando assim o desenvolvimento.</p>
<p>Agora que nosso arquivo de geração de XML está completo, iremos criar um arquivo para recuperarmos os produtos do banco de dados, porém com um nível de dificuldade a mais: neste iremos também implementar filtros para que possamos recuperar os produtos de conformidade com a página atual, nome do produto e categoria selecionada. Salve-o como <em>produtos.php</em> dentro da pasta <em>xml</em>.</p>
<pre class="brush: php; title: ; notranslate">&amp;lt;?php

// incluimos o arquivo de configuração config.php
// que está dentro da pasta admin
require_once '../admin/config.php';

// importamos a classe de produto
Util::Import('entidades.Produto');

// criamos um objeto para recuperar os produtos
$objProdutos = new Produto;

// se a pessoa enviou um nome para filtrar
if(isset($_POST['nome']) &amp;amp;&amp;amp; $_POST['nome'] != '') {
// colocamos uma instrução do tipo where no objeto
// para filtrarmos pelos registros que contém
// no nome o informado pelo usuário

// o método escape evita o ataque do tipo SQL injection de pessoas
// mal intencionadas
$objProdutos-&amp;gt;whereAdd(&quot;nome like '%&quot;. $objProdutos-&amp;gt;escape( $_POST['nome'] ).&quot;%'&quot;);
}

// se a pessoa selecionou uma categoria
if(isset($_POST['categoria']) &amp;amp;&amp;amp; $_POST['categoria'] != '') {
// informa a categoria no objeto.
// fazemos um cast do tipo int para termos certeza
// que será passado um valor numérico
// para a classe
$objProdutos-&amp;gt;categoria = (int) $_POST['categoria'];
}

// limite de registros por consulta
// se a pessoa não informar pelo método do POST, o padrão é 10
// se informar, utilizamos o informado pela pessoa
$limit = !isset($_POST['limit']) ? 10 : (int)$_POST['limit'];

// registro atual
// se não for informado, começamos no zero,
// do contrário, utilizamos o informado
$offset = !isset($_POST['offset']) ? 0 : (int)$_POST['offset'];

// contamos quantos registros foram encontrados
// com os critérios (mesmo não sendo usados)
$total_registros = $objProdutos-&amp;gt;count();

// ordenamos pela data de cadastro em ordem decrescente,
// assim o mais recente aparece primeiro
$objProdutos-&amp;gt;orderBy('data_cadastro desc');

// limite a quantidade de registros
$objProdutos-&amp;gt;limit( $offset, $limit );

// recuperamos todos os produtos
$objProdutos-&amp;gt;find();

// iniciamos um XML
$xml = '&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?'.'&amp;gt;';

// se encontrou produtos
if($total_registros &amp;gt; 0) {
// inicia o nó principal com o atributo
// indicando o total de produtos encontrados
$xml .= '&amp;lt;lista total=&quot;'.$total_registros.'&quot;&amp;gt;';

// enquanto houver produtos na lista
while($objProdutos-&amp;gt;fetch()) {
// cria um nó XML para exibição no arquivo
$xml .= '&amp;lt;'.'produto nome=&quot;'. utf8_encode($objProdutos-&amp;gt;nome).'&quot; ';
$xml .= 'valor=&quot;'.$objProdutos-&amp;gt;valor.'&quot; ';
$xml .= 'foto=&quot;'.utf8_encode($objProdutos-&amp;gt;foto).'&quot; ';
$xml .= 'id=&quot;'.$objProdutos-&amp;gt;idproduto.'&quot;&amp;gt;';

// iniciamos uma seção CDATA dentro do nó do produto
// para colocarmos a descrição
$xml .='&amp;lt;![CDATA['.utf8_encode($objProdutos-&amp;gt;descricao).']]&amp;gt;';

// fechamos o nó do produto atual
$xml .= '&amp;lt;'.'/produto&amp;gt;';
}

// fecha o arquivo XML
$xml .= '&amp;lt;/lista&amp;gt;';

} else { // senão encontrou produtos

// informamos que não há produtos
// com o atributo total com valor 0
$xml .= '&amp;lt;lista total=&quot;0&quot; /&amp;gt;';
}

// mudamos o header
header(&quot;Content-Type: text/xml&quot;);
// enviamos o xml
echo $xml;

?&amp;gt;</pre>
<p><img border="1" width="502" src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_catalogoProdutos_jan07_parte3_imagens/xml_produto_gerado.gif" height="309" /><br />
<em>Imagem mostrando o XML gerado para os produtos</em></p>
<p>Espero que tenham gostado, na próxima iremos finalmente integrar com o Flash.</p>
<p>@braços e fique com Deus!</p>
<p><strong>Autor: Hugo Ferreira da Silva &#8211; Administrador do Portal MXSTUDIO </strong></p>
<p>Qualquer dúvida envie um e-mail para <a target="new" href="maito:hugo@mxstudio.com.br">hugo@mxstudio.com.br</a> ou acesse nosso <a target="forum" href="http://forum.mxstudio.com.br">fórum</a></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Catálogo de Produtos em Flash &#8211; Parte 2</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_2/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_2/#comments</comments>
		<pubDate>Sun, 31 Dec 2006 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Segunda parte do tutorial sobre criar um cat&#225;logo de produtos em Flash]]></description>
			<content:encoded><![CDATA[<link rel="stylesheet" type="text/css" href="http://www.mxstudio.com.br/webgerenciador/_css/PadraoCss.css" /><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script><br />
<table border="0" width="100%" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" id="colunaTexto">
<h1>Catálogo de Produtos em Flash &#8211; Parte 2</h1>
<p>Olá pessoal!</p>
<p>Nesta segunda parte, iremos desenvolver dois formulários simples: um para cadastro de categorias e outro para cadastro de produtos em nosso catálogo. Serão aplicações bem simples, para que possamos atualizar nossa base de dados com os produtos desejados, enviando também um arquivo para foto.</p>
<p>Para desenvolver esta parte, você deve ter desenvolvido a parte da <a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=982">primeira coluna sobre catalogo de produtos em flash</a>.</p>
<p>Vejamos agora como ficará nosso formulário de cadastro de categorias quando terminarmos. Para exemplo, fiz um formulário bem simples, sem muitos estilos visuais, somente para cadastro rápido de categorias e produtos. Crie uma pasta chamada &#8220;admin&#8221;, sem aspas, para que possamos armazenar nossos arquivos de administração.</p>
<p>Para facilitar o desenvolvimento, vamos criar outros dois arquivos que iremos utilizar em nossos formulários, ou até mesmo em outros arquivos que você necessite utilizar, caso deseje desenvolver outras aplicações a partir das que iremos criar nesta coluna.</p>
<p>O primeiro arquivo, é um arquivo de configuração, onde iremos inicializar a configuração do Lumine e de outras variáveis e constantes que poderemos utilizar mais adiante em nossa aplicação. Segue abaixo o código do arquivo. Salve-o como &#8220;config.php&#8221; dentro da pasta &#8220;admin&#8221;:</p>
<pre class="brush: php; title: ; notranslate">&amp;lt;?php

if(!defined('BASEDIR')) {
define('BASEDIR', dirname(dirname(__FILE__)));
}

require_once 'lumineado/LumineConfiguration.php';
require_once BASEDIR . '/lumine-conf.php';

$cfg = new LumineConfiguration( $lumineConfig );

?&amp;gt;</pre>
<p>Nas primeiras linhas, será testado se a constante <em>BASEDIR</em> já está criada. Caso não esteje, iremos criar uma constante com este nome, no qual pegamos dinamicamente onde está o diretório base de nossa aplicação. Lembre que este arquivo foi salvo dentro da pasta &#8220;admin&#8221;, que está dentro da pasta raiz de nossa aplicação, então para pegarmos o diretório absoluto efetuamos uma chamada dupla à função <em>dirname</em> a qual recupera o nome do diretório do arquivo/pasta. A primeira chamada remove o nome do arquivo (no caso, config.php), deixando somente a pasta, a segunda, retira o nome da última pasta (no caso, admin), deixando assim somente o nome do diretório da base de nossa aplicação.</p>
<p>Nas linhas seguintes, incluimos os arquivos de configuração. O primeiro é o de configuração do Lumine, e o segundo são as váriaveis necessárias para conexão com o banco, também utilizadas pelo Lumine. Logo em seguida, instanciamos a classe de configuração utilizando a matriz associativa, contida no arquivo <em>lumine-conf.php</em>, a qual contém os dados necessários para conexão com o banco.</p>
<p>Pronto! agora sempre que quisermos utilizar as classes do Lumine, não precisamos ficar fazendo todas as vezes a configuração com o banco, e sim somente incluir o arquivo <em>config.php</em> para que carreguemos as configurações básicas de nossa aplicação.</p>
<p>O segundo arquivo serve para fazermos uma simples paginação, caso tenhamos vários registros em nossa base de dados. Salve-o com o nome <em>paginacao.php</em> dentro da pasta <em>admin</em>.</p>
<pre class="brush: php; title: ; notranslate">&amp;lt;?php

$pages = $total / $limit;

$vars = '&amp;amp;';
foreach($_GET as $key=&amp;gt;$value) {
if($key != 'offset') {
$vars .= $key.'='.$value.'&amp;amp;';
}
}

for($i=0; $i&amp;lt;$pages; $i++) {
$start = $i * $limit;
$exibir = $i+1;

echo '&amp;lt;a href=&quot;'.$_SERVER['PHP_SELF'].'?offset='.$start.$vars.'&quot; mce_href=&quot;'.$_SERVER['PHP_SELF'].'?offset='.$start.$vars.'&quot;&amp;gt;'.$exibir. '&amp;lt;/a&amp;gt; ';
}

?&amp;gt;</pre>
<p>Na linha 3, definimos quantas páginas serão necessárias para nossa paginação. As variáveis <em>$total </em>e <em>$limit</em> vem de nossos próximos arquivos. A variável <em>$vars</em> irá armazenar os dados que serão utilizados para a paginação e armazenará também os dados enviados anteriormente pelo método GET. Poderíamos também pegar os dados vindos por POST ou REQUEST, porém, os dados poderiam ser muitíssimos e acabar quebrando nossa paginação, assim limitamos a quantidade de informação. Recuperamos as variáveis e colocamos na variável<em> $vars </em>efetuando o <em>foreach</em>. Posteriormente, efetuamos um loop do tipo <em>for,</em> indicando que deve começar de 0 e ter no máximo no número de páginas armazenado na variável <em>$pages</em>. Na variável <em>$start</em>, armazenamos o número que será enviado na URL indicando onde deve começar a paginação quando a pessoa clicar no número a ser exibido na tela. Na variável <em>$exibir</em>, armazenamos o número a ser exibido para o usuário na paginação. Finalmente, utilizamos o <em>echo</em> para exibir o conteúdo para o usuário.</p>
<p>Pronto, nosso arquivo para efetuar a paginação está feito.</p>
<p>Faremos agora um arquivo para cadastrarmos as categorias de nossos produtos. Salve o arquivo como <strong><em>categorias.php</em> </strong>dentro da pasta <em><strong>admin</strong></em>. Não se assustem com o tamanho do código, porque a maior parte é HTML.</p>
<pre class="brush: php; title: ; notranslate">&amp;lt;?php

require_once 'config.php';
Util::Import('entidades.Categoria');

// faz um switch para saber a ação escolhida
if(isset($_REQUEST['acao'])) {
$obj = new Categoria;
switch(strtolower($_REQUEST['acao'])) {
case 'salvar':
$obj-&amp;gt;setFrom($_POST);
if($obj-&amp;gt;validate() === true) {
$obj-&amp;gt;save();
header(&quot;Location: &quot;.$_SERVER['PHP_SELF']);
exit;
}
break;

case 'editar':
if($obj-&amp;gt;get(@$_GET['id']) != 0) {
$_POST = $obj-&amp;gt;toArray();
}
break;

case 'remover selecionados':
if(isset($_POST['lista']) &amp;amp;&amp;amp; is_array($_POST['lista'])) {
foreach($_POST['lista'] as $id) {
$obj = new Categoria;
$obj-&amp;gt;get((int)$id);
$obj-&amp;gt;delete();
}
}
break;
}
}

?&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;
&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&amp;gt;
&amp;lt;title&amp;gt;Cadastro de categorias&amp;lt;/title&amp;gt;
&amp;lt;link href=&quot;master.css&quot; mce_href=&quot;master.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
&amp;lt;form id=&quot;form1&quot; name=&quot;form1&quot; method=&quot;post&quot; action=&quot;&amp;lt;?php echo $_SERVER['PHP_SELF']; ?&amp;gt;&quot;&amp;gt;
&amp;lt;table width=&quot;450&quot; border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot; class=&quot;borda&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;2&quot; align=&quot;center&quot;&amp;gt;&amp;lt;h1&amp;gt;Cadastro de categorias &amp;lt;/h1&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td width=&quot;186&quot; align=&quot;right&quot;&amp;gt;Nome da categoria: &amp;lt;/td&amp;gt;
&amp;lt;td width=&quot;253&quot;&amp;gt;&amp;lt;input name=&quot;nome&quot; type=&quot;text&quot; id=&quot;nome&quot; value=&quot;&amp;lt;?php echo @$_POST['nome']; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot;&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;input name=&quot;acao&quot; type=&quot;submit&quot; id=&quot;acao&quot; value=&quot;Salvar&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; name=&quot;Button&quot; value=&quot;Cancelar&quot; /&amp;gt;
&amp;lt;input name=&quot;idcategoria&quot; type=&quot;hidden&quot; id=&quot;idcategoria&quot; value=&quot;&amp;lt;?php echo @$_POST['idcategoria']; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;table width=&quot;450&quot; border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot; class=&quot;borda&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot; align=&quot;center&quot;&amp;gt;&amp;lt;h1&amp;gt;Categorias cadastradas &amp;lt;/h1&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td width=&quot;20&quot;&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Nome da categoria &amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td width=&quot;60&quot;&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php

$lista = new Categoria;

$total = $lista-&amp;gt;count();
$limit = 20;
$offset = (int)@$_REQUEST['offset'];

$lista-&amp;gt;orderBy('nome asc');
$lista-&amp;gt;limit($offset, $limit);
$lista-&amp;gt;find();

if($total &amp;gt; 0) {
while($lista-&amp;gt;fetch()) {
?&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;center&quot;&amp;gt;&amp;lt;input name=&quot;lista[]&quot; type=&quot;checkbox&quot; id=&quot;lista[]&quot; value=&quot;&amp;lt;?php echo $lista-&amp;gt;idcategoria; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;?php echo $lista-&amp;gt;nome;?&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;[ &amp;lt;a href=&quot;?acao=editar&amp;amp;id=&amp;lt;?php echo $lista-&amp;gt;idcategoria; ?&amp;gt;&quot;&amp;gt;editar&amp;lt;/a&amp;gt; ] &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php
}
?&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot; align=&quot;center&quot;&amp;gt;&amp;lt;input name=&quot;acao&quot; type=&quot;submit&quot; id=&quot;acao&quot; value=&quot;Remover selecionados&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot;&amp;gt;Páginas:
&amp;lt;?php include(&quot;paginacao.php&quot;); ?&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php
} else {
?&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot;&amp;gt;Nenhuma categoria encontrada &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php
}
?&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<p>Os blocos mais importantes do código acima compreendem as linhas 1 até 35, onde são efetuadas as ações de adicionar, editar e remover as categorias. O segundo bloco importante compreende as linhas 74 a 112, onde listamos as categorias previamente cadastradas, para podermos editá-las ou removê-las.</p>
<p>Para saber qual ação tomar nas linhas 1-35, primeiramente verificamos se a variável <em>$_REQUEST['acao']</em> foi enviada. Ela pode ser enviada tanto por POST como por GET, por isso utilizamos a REQUEST. Em seguida, iniciamos um SWITCH, o qual testa o valor informado dentro da variável <em>$_REQUEST['acao']</em>. Nas instruções CASE, notamos 3 valores possíveis: <em>salvar, editar</em> e <em>remover selecionados</em>. No bloco <strong>salvar</strong>, pegamos o valores enviados através do formulário, e colocamos dentro de um objeto <em>categoria</em>, setado na linha 8, através do método <em>setFrom</em>, que recupera os valores da matriz associativa <em>$_POST</em> e os coloca dentro do objeto. Após isso, testamos para ver se os valores foram colocados corretamente, na linha 12, com o método <em>validate. </em>Para ajustar corretamente suas regras de validação, <a target="_blank" href="http://www.hufersil.com.br/lumine/enduser/validacoes.html">visite a documentação de Lumine para criar o seu arquivo de validação personalizado</a>. Se o objeto passar corretamente pela validação, o método <em>save</em> será chamado. Caso a variável <em>idcategoria </em>estiver com algum valor, ele será passado para o objeto, então a instrução SQL <em>update</em> será executada no objeto, pois ele possui uma chave primária e contém um valor, do contrário, o registro será inserido com os valores no banco.</p>
<p>No bloco <em>editar</em>, recuperamos o valores do objeto no banco de dados e colocamos na matriz associativa e super-global <em>$_POST</em>, desta forma, os valores também aparecerão no formulário, porque se notarmos nos elementos do formulário, os valores estão sendo colocados dinamicamente através desta matriz.</p>
<p>Finalmente, na parte de edição dos objetos, no bloco <em>remover selecionados</em>, verificamos se está setado e se existe uma lista de ID&#8217;s na matriz <em>$_POST</em>, chamado de <em>$_POST['lista'].</em> Esta lista é contruída quando algum elemento do tipo <em>checkbox</em> no formulário for selecionado, na lista de edição / remoção. Ela é criada por que os elementos <em>checkbox</em> tem a propriedade name setada como <em>lista[]</em>. Note que há colchetes após o sufixo <em>lista</em>. Isto faz com que seja gerada uma matriz dentro da matriz $_POST. Assim podemos executar um laço do tipo <em>foreach</em> (para cada&#8230;), recuperando assim os ID&#8217;s selecionados para remoção.</p>
<p>Das linhas 76-84, recuperamos os registros no banco de dados para montarmos nossa lista de edição / remoção. Notem que nos elementos dentro do HTML, utilizamos o próprio objeto criado para exibirmos os valores para o usuário. Isso ocorre porque a cada chamada de <em>$lista-&gt;fetch()</em>, os valores são atualizados para o próximo registro encontrado. Assim, podemos fazer um laço do tipo WHILE, porque quando não houver mais registros para ser exibido, o método <em>fetch</em> retorna <em>false</em>, assim o laço será interrompido.</p>
<p><img width="454" src="http://www.mxstudio.com.br/imagens_artigos/imagens/admin_categorias.gif" height="240" /><br />
<em>Imagem do formulário de cadastro de categorias exibido no browser</em>.</p>
<p>Sei que são muitas linhas para estudar, mas vocês verão que é bem fácil o seu desenvolvimento, ainda mais utilizando Lumine, evita um bom trabalho com instruções SQL.</p>
<p>Abaixo temos o código para inserção de produtos. Salve-o como <em><strong>produtos.php</strong></em> dentro da pasta <em><strong>admin</strong></em>:</p>
<pre class="brush: php; title: ; notranslate">&amp;lt;?php

require_once 'config.php';
Util::Import('entidades.Produto');

// faz um switch para saber a ação escolhida
if(isset($_REQUEST['acao'])) {
$obj = new Produto;
switch(strtolower($_REQUEST['acao'])) {
case 'salvar':
if($obj-&amp;gt;get(@$_POST['data_cadastro']) == 0) {
$obj-&amp;gt;data_cadastro = time();
}
$obj-&amp;gt;setFrom($_POST);

// se a pessoa enviou um arquivo
if(is_uploaded_file($_FILES['foto']['tmp_name'])) {
// coloca o nome do arquivo no objeto
$obj-&amp;gt;foto = $_FILES['foto']['name'];
// coloca o arquivo na pasta de imagens
// lembre-se do chmod 0777 na pasta
move_uploaded_file($_FILES['foto']['tmp_name'], '../imagens/'.$_FILES['foto']['name']);
// muda as permissões do arquivo
chmod('../imagens/'.$_FILES['foto']['name'], 0777);
}

// se passar na validação
if($obj-&amp;gt;validate() === true) {
// salva o produto
$obj-&amp;gt;save();
header(&quot;Location: &quot;.$_SERVER['PHP_SELF']);
exit;
}
break;

case 'editar':
if($obj-&amp;gt;get(@$_GET['id']) != 0) {
$_POST = $obj-&amp;gt;toArray();
}
break;

case 'remover selecionados':
if(isset($_POST['lista']) &amp;amp;&amp;amp; is_array($_POST['lista'])) {
foreach($_POST['lista'] as $id) {
$obj = new Produto;
$obj-&amp;gt;get((int)$id);
$obj-&amp;gt;delete();

// remove a foto do produto
@unlink('../imagens/'.$obj-&amp;gt;foto);
}
}
break;
}
}

?&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;
&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&amp;gt;
&amp;lt;title&amp;gt;Cadastro de produto&amp;lt;/title&amp;gt;
&amp;lt;link href=&quot;master.css&quot; mce_href=&quot;master.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;&amp;lt;?php echo $_SERVER['PHP_SELF']; ?&amp;gt;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; name=&quot;form1&quot; id=&quot;form1&quot;&amp;gt;
&amp;lt;table width=&quot;450&quot; border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot; class=&quot;borda&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;2&quot; align=&quot;center&quot;&amp;gt;&amp;lt;h1&amp;gt;Cadastro de produtos &amp;lt;/h1&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td width=&quot;186&quot; align=&quot;right&quot;&amp;gt;Nome do produto: &amp;lt;/td&amp;gt;
&amp;lt;td width=&quot;253&quot;&amp;gt;&amp;lt;input name=&quot;nome&quot; type=&quot;text&quot; id=&quot;nome&quot; value=&quot;&amp;lt;?php echo @$_POST['nome']; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot;&amp;gt;Categoria:&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;select name=&quot;categoria&quot; id=&quot;categoria&quot;&amp;gt;
&amp;lt;option value=&quot;&quot;&amp;gt;-- selecione&amp;lt;/option&amp;gt;
&amp;lt;?php echo Util::buildOptions('entidades.Categoria', 'idcategoria','nome', @$_POST['categoria']); ?&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot;&amp;gt;Valor:&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;input name=&quot;valor&quot; type=&quot;text&quot; id=&quot;valor&quot; value=&quot;&amp;lt;?php echo @$_POST['valor']; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot; valign=&quot;top&quot;&amp;gt;Descrição:&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;textarea name=&quot;descricao&quot; cols=&quot;35&quot; rows=&quot;6&quot; id=&quot;descricao&quot;&amp;gt;&amp;lt;?php echo @$_POST['descricao']; ?&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot;&amp;gt;Foto:&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;input name=&quot;foto&quot; type=&quot;file&quot; id=&quot;foto&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot;&amp;gt;É um produto destaque:&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;select name=&quot;destaque&quot; id=&quot;destaque&quot;&amp;gt;
&amp;lt;option value=&quot;0&quot;&amp;lt;?php if(@$_POST['destaque'] == '0') echo 'selected=&quot;selected&quot;'; ?&amp;gt;&amp;gt;não&amp;lt;/option&amp;gt;
&amp;lt;option value=&quot;1&quot;&amp;lt;?php if(@$_POST['destaque'] == '1') echo 'selected=&quot;selected&quot;'; ?&amp;gt;&amp;gt;sim&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;right&quot;&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;input name=&quot;acao&quot; type=&quot;submit&quot; id=&quot;acao&quot; value=&quot;Salvar&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; name=&quot;Button&quot; value=&quot;Cancelar&quot; /&amp;gt;
&amp;lt;input name=&quot;idproduto&quot; type=&quot;hidden&quot; id=&quot;idproduto&quot; value=&quot;&amp;lt;?php echo @$_POST['idproduto']; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;table width=&quot;450&quot; border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot; class=&quot;borda&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot; align=&quot;center&quot;&amp;gt;&amp;lt;h1&amp;gt;Produtos cadastrados &amp;lt;/h1&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td width=&quot;20&quot;&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Nome do produto&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td width=&quot;60&quot;&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php

$lista = new Produto;

$total = $lista-&amp;gt;count();
$limit = 20;
$offset = (int)@$_REQUEST['offset'];

$lista-&amp;gt;orderBy('nome asc');
$lista-&amp;gt;limit($offset, $limit);
$lista-&amp;gt;find();

if($total &amp;gt; 0) {
while($lista-&amp;gt;fetch()) {
?&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td align=&quot;center&quot;&amp;gt;&amp;lt;input name=&quot;lista[]&quot; type=&quot;checkbox&quot; id=&quot;lista[]&quot; value=&quot;&amp;lt;?php echo $lista-&amp;gt;idproduto; ?&amp;gt;&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;?php echo $lista-&amp;gt;nome;?&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;[ &amp;lt;a href=&quot;?acao=editar&amp;amp;id=&amp;lt;?php echo $lista-&amp;gt;idproduto; ?&amp;gt;&quot;&amp;gt;editar&amp;lt;/a&amp;gt; ] &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php
}
?&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot; align=&quot;center&quot;&amp;gt;&amp;lt;input name=&quot;acao&quot; type=&quot;submit&quot; id=&quot;acao&quot; value=&quot;Remover selecionados&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot;&amp;gt;Páginas:
&amp;lt;?php include(&quot;paginacao.php&quot;); ?&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php
} else {
?&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td colspan=&quot;3&quot;&amp;gt;Nenhum produto encontrado &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;?php
}
?&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<p>O cadastro de produtos é praticamente igual ao cadastro de categorias, exceto por detalhes a mais: o envio de fotos e o relacionamento com a tabela de categorias. Nas linhas 13 a 22, fazemos o upload da imagem e referenciamos o nome do arquivo dentro do objeto de produto. Para que esta parte funcione corretamente, não esqueça de criar uma pasta chamada <em>imagens </em>no mesmo nível da pasta <em>admin</em> e não dentro, como mostra a imagem abaixo:<br />
<img border="1" width="210" src="http://www.mxstudio.com.br/imagens_artigos/imagens/admin_pastas.gif" height="106" /><br />
<em>A pasta admin, destacada em verde, e pasta de imagens, destacada em azul, ambas no mesmo nível</em>.</p>
<p>Outro detalhe importante, é que o PHP deve ter direito de escrita na pasta imagens. Para isto, utilize o comando de permissões do seu gerenciador FTP (também conhecido por CHMOD). Mude as permissões para que o grupo <em>public </em>(público) tenha direito de escrita nesta pasta.</p>
<p>Outro detalhe a mais que tem neste formulário de cadastro, é a presença do método estático da classe <em>Util</em> que acompanha o pacote Lumine. Ele gera, na linha 77, os elementos <em>options</em> de um elemento <em>select </em>baseado nos registro encontrados de uma determinada classe.</p>
<p>Util::buildOptions(&#8216;entidades.Categorias&#8217;, &#8216;idcategoria&#8217;,'nome&#8217;, @$_POST['categoria']);</p>
<p>O primeiro parâmetro é o nome da classe ou o objeto que deseja recuperar os valores. Caso você deseje passar objetos como parâmetro, não esqueça de ter executado o método <em>find</em> antes. O segundo o parâmetro, é o nome do campo que será usado para preencher o atributo <em>value</em> de um elemento <em>option</em>. O terceiro, o que será exibido para o usuário. O quarto, é o valor que será comparado com o segundo para saber se o elemento terá a propriedade <em>selected</em> ou não. Abaixo um exemplo do resultado:</p>
<p id="codigo">&lt;option value=&#8221;6&#8243;&gt;Artigos para presentes&lt;/option&gt;<br />
&lt;option value=&#8221;5&#8243;&gt;Cama mesa e banho&lt;/option&gt;<br />
&lt;option value=&#8221;4&#8243;&gt;Eletrônicos&lt;/option&gt;</p>
<p><img width="456" src="http://www.mxstudio.com.br/imagens_artigos/imagens/admin_produtos.gif" height="339" /><br />
<em>Imagem do formulário de cadastro de produtos sendo exibido no navegador</em>.</p>
<p>Sei que ficou um pouco extensa esta coluna, mas nela estão todos os códigos necessários para o simples administrador de produtos e categorias para nosso exemplo.</p>
<p>Na próxima coluna, iremos exibir os produtos cadastrados em uma interface em Flash.</p>
<p>@braços e fique com Deus!</p>
<p><strong>Autor: Hugo Ferreira da Silva &#8211; Administrador do Portal MXSTUDIO </strong></p>
<p>Qualquer dúvida envie um e-mail para <a target="new" href="maito:hugo@mxstudio.com.br">hugo@mxstudio.com.br</a> ou acesse nosso <a target="forum" href="http://forum.mxstudio.com.br">fórum</a></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Catálogo de Produtos em Flash &#8211; Parte 1</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_1/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_1/#comments</comments>
		<pubDate>Tue, 12 Dec 2006 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cria&#231;&#227;o de um simples catal&#243;go em PHP + MySQL e Flash.]]></description>
			<content:encoded><![CDATA[<link rel="stylesheet" type="text/css" href="http://www.mxstudio.com.br/webgerenciador/_css/PadraoCss.css" /><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script><br />
<table border="0" width="100%" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" id="colunaTexto">
<h1>Catálogo de Produtos em Flash &#8211; Parte 1</h1>
<p>Após um bom período sem colocar novidades no ar, estou voltando para poder contribui com o crescimento da comunidade. Estamos bem atarefados criandos novas coisas para vocês, usuários do Portal, por isso, aguardem excelentes novidades para este próximo ano <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>Veremos nesta série de colunas, como gerar um simples catálogo de produtos, utilizando PHP, MySQL e Flash. Para fazer a interface PHP e MySQL, utilizaremos um framework chamado <strong><a href="http://www.hufersil.com.br/lumine">Lumine</a></strong>. Para que os exemplos funcionem corretamente, faça primeiro a análise dos pré-requisitos abaixo:</p>
<ul>
<li>Servidor Web com PHP 4.3.1 ou superior;</li>
<li>Servidor MySQL 4.0 ou superior, com suporte a tabelas InnoDB;</li>
<li>Framework Lumine.</li>
<li>Flash MX 2004 ou Flash 8.</li>
</ul>
<p>Após analisados e confirmados estes pré-requisitos, vamos começar pela parte do banco de dados.</p>
<h2>Gerando as tabelas no banco de dados</h2>
<p>Abaixo segue a instrução SQL para criarmos nossas tabelas no banco de dados:</p>
<p>[SQL]<br />
Create table coluna_categoria (<br />
idcategoria Int NOT NULL AUTO_INCREMENT,<br />
nome Varchar(255) NOT NULL,<br />
Primary Key (idcategoria)) TYPE = InnoDB;</p>
<p>Create table coluna_produto (<br />
idproduto Int NOT NULL AUTO_INCREMENT,<br />
idcategoria Int NOT NULL,<br />
nome Varchar(255) NOT NULL,<br />
descricao Text NOT NULL,<br />
valor Float NOT NULL,<br />
foto Varchar(255),<br />
destaque Bool NOT NULL,<br />
data_cadastro Datetime NOT NULL,<br />
Primary Key (idproduto)) TYPE = InnoDB;</p>
<p>Alter table coluna_produto add Index IX_Relationship1 (idcategoria);<br />
Alter table coluna_produto add Foreign Key (idcategoria) references coluna_categoria (idcategoria) on delete cascade on update cascade;<br />
[/SQL]</p>
<p><strong>Obs:</strong> as tabelas tem o prefixo <strong>coluna_</strong> porque não posso criar outros bancos de dados em meu servidor, e para que os exemplos dados neste artigo funcionem corretamente, eles deverão ser feitos como mostrado <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h2>Gerando as classes do Lumine em PHP</h2>
<p>Após criar as tabelas no seu banco de dados com as instruções acima, vamos criar, através de engenharia reversa, as classes e mapeamentos através do Framework Lumine. Este framework serve para trabalharmos com os registros do banco de dados como se fossem objetos, minimizando drásticamente a uilização de instruções SQL que devemos digitar. Em sua versão atual, este framework suporta engenharia reversa para os bancos de dados MySQL e PostgreSQL.</p>
<p>Baixando o pacote Lumine, descompacte-o em um diretório que você tenha acesso via seu browser, para que possa acessar o arquivo de engenharia reversa. Após descompactado, você verá que o mesmo possui um arquivo chamado <strong>lumine_reverse.php</strong>. Acesse este arquivo através de seu browser para gerarmos a engenharia reversa.</p>
<p><img border="1" width="445" src="http://www.mxstudio.com.br/imagens_artigos/coluna_imagens/reverse.gif" height="428" /></p>
<p>Acima você podem conferir o exemplo que utlizei para este artigo. Vamos analisar cada item deste formulário.</p>
<p id="destaque">Atenção: para que a engenharia reversa funcione corretamente, é necessário que o usuário WEB tenha acesso de escrita na pasta informada em Class-Path (chmod 0777)!</p>
<ul>
<li><strong>Class-Path</strong>: raiz da sua aplicação (site). Deve ser a pasta local física de onde está o seu site, por exemplo /www/seusite/public_html para sistemas *nix e c:/www/seusite/public_html para sistemas Windows. Note que para Windows é utilizada a barra, e não contra-barras (\);</li>
<li><strong>Host:</strong> nome do host onde está localizado o banco de dados;</li>
<li><strong>Banco de dados</strong>: nome do banco de dados;</li>
<li><strong>Dialeto:</strong> Existem vários dialetos disponíveis, mas nesta versão os suportados atualmente são os que possuem prefixo mysql* e posgres*. Como iremos utilizar tabelas InnoDB, utilize o dialeto <strong>mysqlt</strong>, que suporta InnoDB e transações;</li>
<li><strong>Porta:</strong> porta de conexão com o banco;</li>
<li><strong>Usuário:</strong> nome de usuário para conexão;</li>
<li><strong>Senha:</strong> senha para conexão com o banco;</li>
<li><strong>Pacote:</strong> pacote onde estarão as suas classes em PHP que serão criadas através da engenharia reversa. Ela deve ser escrita em padrão de pacotes Java (por exemplo, br.com.hufersil.classes irá gerar c:/www/seusite/public_html/br/com/hufersil/classes). Neste exemplo, estou usando o valor <em>entidades.</em></li>
<li><strong>Mapeamentos:</strong> idêntico ao item pacotes, porém esta é a pasta onde serão armazenados os mapeamentos em XML. Neste exemplo, estou utilizando o valor <em>entidades.mapeamentos</em>.</li>
<li><strong>Nome do arquivo de cache</strong>: quando se utiliza um grande número de tabelas, é interessante gerar um arquivo de cache para que Lumine não precise ficar lendo os seus arquivos XML a cada chamada. Isso trará um grande ganho em performance. <strong>Atenção:</strong> o usuário web DEVE ter o direito de escrita sobre o arquivo (chmod 0777).</li>
<li><strong>Remover prefixo das tabelas</strong>: em nosso exemplo, estamos utilizando prefixo nas tabelas, que é o <strong>coluna_</strong>. Caso você não utilize prefixos, deixe esta opção em branco;</li>
<li><strong>Tipo de arquivo de configuração</strong>: nesta versão de Lumine, você poder gerar um arquivo XML para configuração ou um arquivo PHP. Neste exemplo utilizaremos o PHP;</li>
<li><strong>Criar controles básicos</strong>: irá criar controles básicos para que possamos manipular nossas classes de maneira bem simples. Estes formulários devem ser utilizados somente para testes com o banco, e não para produção de sites para clientes.</li>
</ul>
<p>Após definidas as configurações acima, clique em <strong>Iniciar</strong></p>
<p>Após o processo, Lumine irá criar os arquivos na pasta informada em <strong>class-path.</strong></p>
<p><img border="1" width="199" src="http://www.mxstudio.com.br/imagens_artigos/coluna_imagens/arquivos.gif" height="121" /></p>
<p>O arquivo de configuração com o banco é o arquivo chamado <strong>lumine-conf.php</strong>, que estará dentro da pasta inforamda no item <strong>class-path.</strong></p>
<h2>Primeiro contato com Lumine</h2>
<p>Após geradas as classes, vamos criar um arquivo para inserção de teste de uma categoria. Salve este arquivo na mesma pasta onde se encontra o arquivo <strong>lumine-conf.php</strong>.</p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;?php
// incluindo o arquivo de configuração do banco
include_once(&quot;lumine-conf.php&quot;);
// incluindo o arquivo de configuração do Lumine
include_once(&quot;pasta/do/lumine/LumineConfiguration.php&quot;);
// instanciando uma nova configuração do Lumine
$lumineConfiguration = new LumineConfiguration( $lumineConfig );

// Importando a classe de Categoria
Util::Import('entidades.Categoria');

// criando um novo objeto de categoria
$objCategoria = new Categoria;
// atribuindo um nome a esta categoria
$objCategoria-&amp;gt;nome = 'Eletronicos';
// salvando no banco
echo $objCategoria-&amp;gt;save();
?&amp;gt;
</pre>
<p>Caso linha 17 mostre algum resultado (maior que zero) significa que o objeto foi salvo corretamente no banco de dados. Como vocês puderam notar, não escrevemos nenhuma linha de instruções SQL para que o objeto fosse salvo no banco de dados!</p>
<p>Na próxima coluna, iremos desenvolver uma aplicação simples para cadastrarmos categorias e produtos.</p>
<p>@braços e fique com Deus!</p>
<p><strong>Autor: Hugo Ferreira da Silva &#8211; Administrador do Portal MXSTUDIO </strong></p>
<p>Qualquer dúvida envie um e-mail para <a target="new" href="maito:hugo@mxstudio.com.br">hugo@mxstudio.com.br</a> ou acesse nosso <a target="forum" href="http://forum.mxstudio.com.br">fórum</a></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/catalogo_de_produtos_em_flash___parte_1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando um quizz em Flash e XML</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/criando_um_quizz_em_flash_e_xml/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/criando_um_quizz_em_flash_e_xml/#comments</comments>
		<pubDate>Mon, 20 Mar 2006 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Iremos desenvolver um simples joguinoh de quizz em Flash 8 e XML]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td id="colunaTexto" valign="top">
<h1>Criando um quizz em Flash e XML</h1>
<p>Vamos estudar neste artigo como criar um simples joguinho de peruntas e respostas, utilizando XML e Flash.</p>
<p>Pré-requisitos:</p>
<ul>
<li>Flash 8;</li>
<li>Editor de texto para escrever o XML.</li>
</ul>
<p>Ao longo deste estudo, iremos abordar:</p>
<ul>
<li>Duplicação de MovieClip;</li>
<li>Trabalhar com XML;</li>
<li>Posicionamento de elementos duplicados;</li>
<li>Acesso a elementos duplicados.</li>
</ul>
<p>Para auxiliar e facilitar o seu estudo deste artigo, estude também os artigos falando sobre XML:</p>
<ul>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=475">Estudo de XML &#8211; Parte 1 </a></li>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=479">Estudo de XML &#8211; Parte 2 </a></li>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=517">Estudo de XML &#8211; Parte 3</a></li>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=789" target="_blank">Criando um caça-palavras</a></li>
</ul>
<h2>Criando a interface</h2>
<p>Iremos trabalhar com uma interface bem simples. Para começar, crie um campo de texto dinâmico, e coloque o nome de instância como <strong>pergunta</strong>.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_01.jpg" alt="" width="375" height="138" /></p>
<p>Em seguida crie um campo de texto dinâmico com o nome de instância de <strong>opcao.</strong></p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_02.jpg" alt="" width="375" height="138" /></p>
<p>Após criar este campo de texto, selecione-o e converta-o para movie clip (F8 ou Modify &gt; Convert to symbol). Coloque o nome do objeto na bilioteca de <strong>opcao_quizz</strong>, para ficar mais fácil caso precisamos pega-lo novamente da bilbioteca. Coloque também o ponto de registro (registration) como indicado na figura abaixo.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_03.jpg" alt="" width="414" height="215" /></p>
<p>Após converte-lo para movie clip, coloque como nome de instância deste como <strong>opcao_mc.</strong></p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_04.jpg" alt="" width="414" height="139" /></p>
<p>Iremos agora criar agora uma janela de alerta, para quando o usuário escolher uma resposta, seja ela certa ou errada.<br />
Crie um retangulo (o formato realmente não importa, contato que os passos seguintes sejam seguidos), converta-o em movieclip (F8 ou modify &gt; convert to symbol) e dê o nome na biblioteca e de instância como <strong>fundo_janela</strong>.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_06.jpg" alt="" width="408" height="130" /></p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_07.jpg" alt="" width="408" height="130" /></p>
<p>Crie agora acima deste movieclip um campo de texto dinâmico e coloque como nome de instância <strong>msg</strong>.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_08.jpg" alt="" width="408" height="130" /></p>
<p>Crie agora um botão, e coloque o nome de instância do mesmo de <strong>btn_fecha</strong>.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_09.jpg" alt="" width="408" height="130" /></p>
<p>Selecione o movieclip de fundo (<strong>fundo_janela</strong>), o campo de texto dinâmico (<strong>msg</strong>) e o botão (<strong>btn_fecha</strong>)  e converta todos em um só movieclip, chamado <strong>janela_aviso</strong> (instância e na biblioteca).</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_10.jpg" alt="" width="408" height="130" /></p>
<p>Feito isto, crie uma nova camada sobre e existente e coloque o nome desta nova camada como <strong>acoes</strong> e a camada anterior como <strong>interface</strong>.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashQuizz_mar06_imagens/hugosilva_FlashQuizz_mar06_05.jpg" alt="" width="414" height="139" /></p>
<p>Agora na camada <strong>acoes</strong>, coloque as ações abaixo:</p>
<div id="codigo" title="ActionScript">/* url do arquivo XML */<br />
var urlXML:String = &#8216;quizz.xml&#8217;;<br />
/* objeto XML */<br />
var xmlDoc:XML = new XML();<br />
xmlDoc.ignoreWhite = true;<br />
/* array que ira guardar os dados do XML apos carregado */<br />
var arrQuizz:Array = new Array();<br />
/* pergunta já feitas */<br />
var arrUsed:Array = new Array();<br />
/* deixa o opcao_mc invisivel */<br />
opcao_mc._visible = false;<br />
/* deixa a janela invisiveel  */<br />
janela_aviso._visible = false;<br />
/* mensagem de resposta certa */<br />
var msg_certo:String = &#8216;Muito bem! Resposta correta!&#8217;<br />
/* mensagem de resposta errada */<br />
var msg_errado:String = &#8216;Ah não! tudo errado&#8230;.&#8217;;<br />
/* quando terminar de carregar o XML */<br />
xmlDoc.onLoad = function():Void  {<br />
/* pega a primeira pergunta */<br />
var node:XMLNode = this.firstChild.firstChild;<br />
for (node; node != null; node=node.nextSibling) {<br />
/* cria um novo objeto para colocar no array */<br />
var obj:Object = new Object();<br />
/* guarda a pergunta dentro dele */<br />
obj.pergunta = node.attributes.texto;<br />
/* array com as respostas */<br />
var arr:Array = new Array();<br />
/* para cada resposta dentro dele */<br />
for (var item:XMLNode = node.firstChild; item != null; item=item.nextSibling) {<br />
/* coloca os atributos dentro de um array */<br />
arr.push(item.attributes);<br />
}<br />
/* coloca este array dentro do objeto */<br />
obj.respostas = arr;<br />
/* coloca este objeto dentro do array principal */<br />
arrQuizz.push(obj);<br />
}<br />
/* chama a função que sorteia a pergunta e mostra para o usuário */<br />
showQuizz();<br />
};<br />
function showQuizz():Void {<br />
/* se todas as perguntas já foram utilizadas */<br />
if (arrUsed.length == arrQuizz.length) {<br />
//zera as usadas<br />
arrUsed = new Array();<br />
}<br />
do {<br />
/* sorteia uma pergunta */<br />
var item:Object = arrQuizz[(Math.floor(Math.random()*arrQuizz.length))];<br />
/* efetua o loop enquanto esta pergunta não estiver na lista de usadas */<br />
} while (_usado(item.pergunta) == true);<br />
/* coloca esta pergunta na lista de usadas */<br />
arrUsed.push(item.pergunta);<br />
/* mostra a pergunta */<br />
pergunta.text = item.pergunta;<br />
/* limpa os movieclip anteriores */<br />
clearOptions();<br />
/* para cada opção */<br />
for (var i:Number = 0; i&lt;item.respostas.length; i++) {<br />
/* pega um novo_nivel  */<br />
var n:Number = this.getNextHighestDepth();<br />
/* duplica o item de opções */<br />
var it:MovieClip = opcao_mc.duplicateMovieClip(&#8216;_opcao&#8217;+n, n);<br />
/* coloca na posição certa */<br />
it._y = opcao_mc._y + (i*it._height);<br />
/* coloca o texto */<br />
it.opcao.text = item.respostas[i].texto;<br />
/* indica se é a resposta certa ou não */<br />
it.certo = Number( item.respostas[i].verdadeiro );<br />
/* quando a pessoa clicar */<br />
it.onRelease = function():Void {<br />
/* muda o level da janela */<br />
janela_aviso.swapDepths( _root.getNextHighestDepth() );<br />
/* exibe a janela */<br />
janela_aviso._visible = true;<br />
//se for a verdadeira<br />
if(this.certo == 1) {<br />
/* mostra a mensagem de certo */<br />
janela_aviso.msg.text = msg_certo;<br />
} else {<br />
/* do contrario, mostra a mensagem de errado */<br />
janela_aviso.msg.text = msg_errado;<br />
}<br />
}<br />
}<br />
}<br />
function _usado(per:String):Boolean {<br />
for (var i:Number = 0; i&lt;arrUsed.length; i++) {<br />
if (per == arrUsed[i]) {<br />
return true;<br />
}<br />
}<br />
return false;<br />
}<br />
function clearOptions():Void {<br />
for (var i in this) {<br />
if (i.substr(0, 6) == &#8216;_opcao&#8217;) {<br />
this[i].removeMovieClip();<br />
}<br />
}<br />
}<br />
janela_aviso.fundo.onRelease=function():Void {};<br />
janela_aviso.fundo.useHandCursor = false;<br />
janela_aviso.btn_fecha.onRelease = function ():Void {<br />
this._parent._visible = false;<br />
showQuizz();<br />
}<br />
/* carrega o XML */<br />
xmlDoc.load(urlXML);</div>
<p>E agora, o modelo de XML para o quizz</p>
<div id="div" title="XML">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;flash-quizz&gt;<br />
&lt;pergunta texto=&#8221;Qual o nome do filtro que cria uma sombra?&#8221;&gt;<br />
&lt;opcao texto=&#8221;Shadow&#8221; verdadeiro=&#8221;1&#8243;/&gt;<br />
&lt;opcao texto=&#8221;Bevel&#8221; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;Glow&#8221; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;/pergunta&gt;<br />
&lt;pergunta texto=&#8221;Pergunta 2&#8243;&gt;<br />
&lt;opcao texto=&#8221;opcao 1&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 2&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 3&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 4&#8243; verdadeiro=&#8221;1&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 5&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;/pergunta&gt;<br />
&lt;pergunta texto=&#8221;Pergunta 3&#8243;&gt;<br />
&lt;opcao texto=&#8221;opcao 1&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 2&#8243; verdadeiro=&#8221;1&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 3&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 4&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;/pergunta&gt;<br />
&lt;pergunta texto=&#8221;pergunta 4&#8243;&gt;<br />
&lt;opcao texto=&#8221;opcao 1&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 2&#8243; verdadeiro=&#8221;0&#8243;/&gt;<br />
&lt;opcao texto=&#8221;opcao 3&#8243; verdadeiro=&#8221;1&#8243;/&gt;<br />
&lt;/pergunta&gt;<br />
&lt;/flash-quizz&gt;</div>
<p>Espero que tenham gostado de mais este tutorial!</p>
<p><a href="http://www.hufersil.com.br/mx/jogos/quizz/" target="_blank">Confira um exemplo do jogo funcionando!</a></p>
<p>@braços e fiquem com Deus!</p>
<p><strong>Hugo Ferreira da Silva &#8211; Administrador do Portal MXSTUDIO</strong></p>
<p>Qualquer dúvida, envie um e-mail para <a href="mailto: hufersil@mxstudio.com.br">hufersil@mxstudio.com.br</a> ou acesse nosso <a href="http://forum.mxstudio.com.br" target="_blank">fórum</a>.</td>
</tr>
</tbody>
</table>
<p><script type="text/javascript"><!--
FormatXML(new Array('XML'));
FormatAS(new Array('ActionScript'));
// --></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/criando_um_quizz_em_flash_e_xml/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Caça-Palavras</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/caca_palavras/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/caca_palavras/#comments</comments>
		<pubDate>Mon, 06 Feb 2006 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Um jogo simples de ca&#231;a-palavras em Flash]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td id="colunaTexto" valign="top">
<h1>Criando um caça-palavras</h1>
<p>Neste<br />
artigo, iremos desenvolver um caça-palavras, utilizando também arquivos XML para que possamos criar dinamismo e facilitar a troca de palavras do jogo.</p>
<p>Pré-requisitos:</p>
<ul>
<li>Flash 8;</li>
<li>Editor de Texto (para escrever o XML).</li>
</ul>
<p>Ao longo deste estudo, veremos os seguintes itens que lhes auxiliarão  em outras tarefas:</p>
<ul>
<li>Trabalhar com duplicação de MovieClip;</li>
<li>Trabalhar com Array;</li>
<li>Trabalhar com XML;</li>
<li>Posicionamento de elementos duplicados;</li>
<li>Acesso a elementos duplicados.</li>
</ul>
<p>Para auxiliar e facilitar o seu estudo deste artigo, estude também os artigos falando sobre XML:</p>
<ul>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=475">Estudo de XML &#8211; Parte 1 </a></li>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=479">Estudo de XML &#8211; Parte 2 </a></li>
<li><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=517">Estudo de XML &#8211; Parte 3 </a></li>
</ul>
<h2>Criando a interface</h2>
<p>Nossa primeira tarefa, é desenvolver o layout do nosso jogo de caça-palavras. Fiz o meu de uma maneira bem simples, para ficar mais fácil o entendimento. Coloque o palco nas dimensões 750 x 300 (aperte CTRL + J ou vá em Modify -&gt; Document&#8230; para alterar as dimensões do palco). Como um jogo de caça-palavras consiste em um aglomerado de quadrinhos com letras no meio, vamos fazer somente um quadrinho (MovieClip) com uma letra dentro (Dynamic Text/Texto dinâmico).</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashPalavraCruzada_fev06_imagens/hugosilva_FlashPalavraCruzada_fev06-img1.jpg" border="1" alt="" width="400" height="300" /></p>
<p>O quadro laranja (à esquerda) mostra nosso MovieClip no primeiro quadro. O quadro azul (à direita), no segundo quadro. Há três camadas: a primeira camada (de cima para baixo) é para ações. A segunda, o campo de texto dinâmico (note que não há quadros chaves). A terceira, o fundo dos quadrinhos (o primeiro quadro do MovieClip exibe o quadro normal e o segundo quadro, o estado deste selecionado). Coloque o nome de instância do texto dinâmico como <strong>letra</strong>. A única ação a ser colocada neste primeiro quadro, como mostra a figura é <strong>stop();</strong> para que o nosso MovieClip fique parado.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashPalavraCruzada_fev06_imagens/hugosilva_FlashPalavraCruzada_fev06-img2.jpg" border="1" alt="" width="400" height="250" /></p>
<p>Depois da edição do MovieClip, volte para a linha de tempo principal, e coloque o nome de instância de<strong> q1 </strong>(letra &#8220;q&#8221; e número 1) para o MovieClip.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashPalavraCruzada_fev06_imagens/hugosilva_FlashPalavraCruzada_fev06-img3.jpg" border="1" alt="" width="400" height="250" /></p>
<p>Após isso, crie uma nova camada para colocarmos a lista com as palavras e outra para as ações. Deverá ficar parecido com isso:</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashPalavraCruzada_fev06_imagens/hugosilva_FlashPalavraCruzada_fev06-img4.jpg" border="1" alt="" width="271" height="247" /></p>
<p>Na camada lista palavras, iremos criar um campo de texto dinâmico, com o nome de instância <strong>palavra</strong>. Coloque-o na posição em x: 550 e y: 10.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashPalavraCruzada_fev06_imagens/hugosilva_FlashPalavraCruzada_fev06-img5.jpg" border="1" alt="" width="271" height="207" /></p>
<p>Clique sobre este campo de texto e pressione F8 ou clique em Modify &gt; Convert to Symbol. Depois, coloque o nome de instância deste novo MovieClip como <strong>lista_palavra</strong>.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/hugosilva_FlashPalavraCruzada_fev06_imagens/hugosilva_FlashPalavraCruzada_fev06-img6.jpg" border="1" alt="" width="271" height="207" /></p>
<p>Pronto, nossa interface está pronta. Depois se você quiser acrescentar desenhos e outras coisas fique a vontade.</p>
<h2>Criando o XML</h2>
<p>Iremos armazenar a lista de palavras em um arquivo XML, para ficar mais organizado e facilitar a troca de palavras. Abaixo segue um XML de exemplo:</p>
<div id="codigo" title="XML">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;caca-palavra&gt;<br />
&lt;config linhas=&#8221;10&#8243; colunas=&#8221;17&#8243; x=&#8221;10&#8243; y=&#8221;10&#8243; espaco=&#8221;2&#8243;/&gt;<br />
&lt;palavras&gt;<br />
&lt;palavra orientacao=&#8221;vertical&#8221; coluna=&#8221;1&#8243; linha=&#8221;1&#8243;&gt;MXSTUDIO&lt;/palavra&gt;<br />
&lt;palavra orientacao=&#8221;horizontal&#8221; coluna=&#8221;3&#8243; linha=&#8221;5&#8243;&gt;FLASH&lt;/palavra&gt;<br />
&lt;palavra orientacao=&#8221;diagonal_direita&#8221; coluna=&#8221;5&#8243; linha=&#8221;2&#8243;&gt;FIREWORKS&lt;/palavra&gt;<br />
&lt;palavra orientacao=&#8221;vertical_inverso&#8221; coluna=&#8221;3&#8243; linha=&#8221;10&#8243;&gt;RIA&lt;/palavra&gt;<br />
&lt;palavra orientacao=&#8221;vertical&#8221; coluna=&#8221;16&#8243; linha=&#8221;2&#8243;&gt;FORUM&lt;/palavra&gt;<br />
&lt;/palavras&gt;<br />
&lt;/caca-palavra&gt;</div>
<p>As possíveis posições você pode conferir nos comentários do código de ActionScript, mais abaixo. É necessário que seja seguido esta ordem na montagem do arquivo XML, para o código abaixo o interprete corretamente. Primeiro o nó de <strong>caca-palavra</strong>, depois o <strong>config</strong> e em seguida o nó <strong>palavras</strong> que contém vários nós <strong>palavra</strong>.</p>
<h2>O ActionScript</h2>
<p>No quadro 1 da camada ações, coloque as ações abaixo.</p>
<div id="div" title="ActionScript">/* alinhamos o stage pelo topo e esquerda */<br />
Stage.align=&#8221;LT&#8221;;<br />
/* colocamos o quadrinho inicial invisivel */<br />
q1._visible=false;<br />
/* deixa a lista de palavras invisivel */<br />
lista_palavras._visible=false;<br />
/* armazena as palavras */<br />
var holder:Object = {};<br />
/* número de tentativas do usuário */<br />
var tentativas:Number = 0;<br />
/* letras que irão compor o jogo */<br />
var alfabeto:Array = (new String(&#8216;A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,X,W,Y,Z,1,2,3,4,5,6,7,8,9,0&#8242;)).split(&#8216;,&#8217;);<br />
/* carrega o XML */<br />
var doc:XML = new XML();<br />
/* remove espaços em branco do XML */<br />
doc.ignoreWhite=true;<br />
/* quando carregar o XML */<br />
doc.onLoad = function () {<br />
/* pega o nó de configuração */<br />
var conf:XMLNode=this.firstChild.firstChild;<br />
/* coloca o primeiro quadrinho na posição informada em x */<br />
q1._x = conf.attributes.x;<br />
/* coloca o primeiro quadrinho na posição informada em y */<br />
q1._y = conf.attributes.y;<br />
/* pega o numero de colunas */<br />
var cols:Number = Number(conf.attributes.colunas);<br />
/* pega o numero de linhas */<br />
var rows:Number = Number(conf.attributes.linhas);<br />
/* pega o espaço entre os quadrinhos */<br />
var espaco:Number = Number(conf.attributes.espaco);<br />
/* calcula o total de quadrinhos a serem criados */<br />
var total:Number = cols * rows;</p>
<p>// monta o caça-palavras<br />
for(var i=0, row=0, col=0; i&lt;total; i++) {<br />
/* duplica o quadrinho */<br />
var d:MovieClip = q1.duplicateMovieClip(&#8216;itc&#8217;+col+&#8217;l'+row, i);<br />
/* coloca na posição em X correta */<br />
d._x = q1._x + ((d._width+espaco)*col);<br />
/* coloca na posição em Y correta */<br />
d._y = q1._y + ((d._height+espaco)*row);<br />
/* coloca uma letra aleatoriamente */<br />
d.letra.text = alfabeto[ Math.floor(Math.random()*alfabeto.length) ];<br />
/* quando o usuário clicar na letra */<br />
d.onRelease = function () {<br />
/* verifica: se está no primeiro vai para o segundo, do contrário, para o primeiro */<br />
this.gotoAndStop( this._currentframe == 1 ? 2 : 1);<br />
/* aumenta o numero de tentativas */<br />
tentativas++;<br />
}<br />
/* se chegou na ultima coluna */<br />
if(++col == cols) {<br />
/* vai para a proxima linha */<br />
row++;<br />
/* volta para a primeira coluna */<br />
col=0;<br />
}<br />
}</p>
<p>/* pega a primeira palavra */<br />
var pal:XMLNode = this.firstChild.lastChild.firstChild<br />
/* para cada palavra */<br />
for(pal, l=0; pal!=null; pal=pal.nextSibling) {<br />
/* pega o proximo level */<br />
var n:Number = getNextHighestDepth();<br />
/* duplica a proxima palavra na lista */<br />
var p:MovieClip = lista_palavras.duplicateMovieClip(&#8216;lis&#8217;+n, n);<br />
/* colca na linha correta */<br />
p._y = lista_palavras._y + (p._height*(l++));<br />
/* coloca a palavra */<br />
p.palavra.text = pal.firstChild.toString();<br />
/* pega a coluna que irá iniciar */<br />
var col:Number=Number(pal.attributes.coluna)-1;<br />
/* pega a linha que irá iniciar */<br />
var row:Number=Number(pal.attributes.linha)-1;<br />
/* pega a palavra */<br />
var palavra:String = pal.firstChild.toString();<br />
/* pega a direção para montar a palavra */<br />
var dir:String=pal.attributes.orientacao;<br />
/* coloca o numero de letras encontradas desta palavra */<br />
holder[ palavra ] = 0;<br />
/* para cada letra desta palavra */<br />
for(var i=0; i&lt;palavra.length; i++) {<br />
/* pega o quadrinho relativo a esta letra */<br />
var d:MovieClip = eval(&#8216;itc&#8217;+col+&#8217;l'+row);<br />
/* coloca a letra no quadrinho */<br />
d.letra.text = palavra.substr(i, 1);<br />
/* coloca a palavra inteira para um teste posterior dentro do quadrinho */<br />
d.palavra = palavra;<br />
/* quando o usuário clicar neste quadrinho */<br />
d.onRelease = function () {<br />
/* se for o primeiro quadro */<br />
if(this._currentframe == 1) {<br />
/* vai para o proximo quadro */<br />
this.nextFrame();<br />
/* aumenta o numero de letras desta palavra que foram encontradas */<br />
holder[ this.palavra ]++;<br />
/* se encontrou todas as letras desta palavra */<br />
if(holder[ this.palavra ] == this.palavra.length) {<br />
/* desativa os quadrinhos dela */<br />
deactivate( this.palavra );<br />
}<br />
/* mas se estiver no segundo quadro */<br />
} else  {<br />
/* vai para o primeiro quadrinho */<br />
this.prevFrame();<br />
/* decrementa o numero de letras encontradas */<br />
holder[ this.palavra ]&#8211;;<br />
}<br />
/* aumenta o numero de tentativas */<br />
tentativas++;<br />
}<br />
/* conforme a direção escolhida */<br />
switch(dir) {<br />
/* se foi verticalmente, vai para linha debaixo */<br />
case &#8220;vertical&#8221;: row++; break;<br />
/* se foi horizontal, para a coluna da direita */<br />
case &#8220;horizontal&#8221;: col++; break;<br />
/* para a linha de cima */<br />
case &#8220;vertical_inverso&#8221;: row&#8211;; break;<br />
/* para a coluna da esquerda */<br />
case &#8220;horizontal_inverso&#8221;: col&#8211;; break;<br />
/* para a linha de baixo e coluna da direita */<br />
case &#8220;diagonal_direita&#8221;: row++; col++; break;<br />
/* para a linha de cima e coluna da esquerda */<br />
case &#8220;diagonal_direita_inverso&#8221;: row&#8211;; col&#8211;; break;<br />
/* para a linha da baixo e coluna da esquerda */<br />
case &#8220;diagonal_esquerda&#8221;: row++; col&#8211;; break;<br />
/* para a linha de cima e coluna da direita */<br />
case &#8220;diagonal_esquerda_inverso&#8221;: row&#8211;; col++; break;<br />
}<br />
}<br />
}<br />
}<br />
/* função para desativar os quadrinhos que tem a palavra &#8220;p&#8221; como parametro */<br />
function deactivate( p ) {<br />
/* para cada quadrinho */<br />
for(var i in this) {<br />
/* se tiver a palavra a P */<br />
if(this[i].palavra == p) {<br />
/* remove o onRelease */<br />
delete this[i].onRelease;<br />
}<br />
/* se encontra na lista */<br />
if(this[i].palavra.text == p) {<br />
/* acrescenta um OK */<br />
this[i].palavra.text += &#8216; &#8211; OK &#8216;;<br />
}<br />
}<br />
}<br />
/* carrega a lista de palavras */<br />
doc.load(&#8216;palavras.xml&#8217;);</p>
</div>
<p>Como falei anteriormente, ficou bem simples, para que fosse mais fácil o entendimento.<br />
Lembre-se: <strong> as palavras não podem cruzar!</strong> Neste jogo, fiz para as palavras não pudessem cruzar, para ficar mais fácil o código.</p>
<p><a href="http://www.hufersil.com.br/mx/jogos/caca_palavra/" target="_blank">Confira um exemplo do jogo funcionando!</a></p>
<p>@braços e fiquem com Deus!</p>
<p><strong>Hugo Ferreira da Silva &#8211; Administrador do Portal MXSTUDIO</strong></p>
<p>Qualquer dúvida, envie um e-mail para <a href="mailto: hufersil@mxstudio.com.br">hufersil@mxstudio.com.br</a> ou acesse nosso <a href="http://forum.mxstudio.com.br" target="_blank">fórum</a>.</td>
</tr>
</tbody>
</table>
<p><script type="text/javascript"><!--
FormatXML(new Array('XML'));
FormatAS(new Array('ActionScript'));
// --></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/caca_palavras/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Enquete PHP + MySQL + Flash</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/enquete_php___mysql___flash/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/enquete_php___mysql___flash/#comments</comments>
		<pubDate>Tue, 03 Jan 2006 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Vamos criar uma enquete em PHP + MySQL + Flash, utilizando o framework Lumine para conex&#227;o com o banco de dados.]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%"></table>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td id="colunaTexto" valign="top">
<h1>Flash &#8211; Criando uma enquete com Lumine + Flash</h1>
<p>Vamos fazer hoje uma interação com PHP, MySQL e Flash. Para fazer a parte de PHP e MySQL, vou utilizar <a href="http://www.hufersil.com.br/lumine/" target="_blank">Lumine</a> como framework, para facilitar na manipulação dos dados vindos do banco. Com ele a vida fica realmente mais fácil <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>Pré-requisitos para este tutorial</p>
<ul>
<li>Servidor rodando PHP 4.2;</li>
<li>MySQL 4.x ou superior com uma base de dados criada;</li>
<li>Flash 8.</li>
</ul>
<h3>Criando as entidades</h3>
<p>Entidades são as classes que representam as nossas tabelas no banco de dados. Por exemplo: vamos supor que você tenha uma tabela chamada pessoas, e tenha os campos <strong>idpessoa, nome, data_nascimento, email</strong>. Para acessar estes dados através de uma entidade, basta você instanciar a entidade, buscar no banco e trabalhar com o registro como se fosse um objeto. Exemplo:</p>
<div id="codigo" title="Lumine">/* iniciando uma configuração de Lumine  */<br />
$conf = new LumineConfiguration( &#8216;lumine-conf.xml&#8217; );<br />
/* incluindo a classe Pessoa */<br />
Util::Import(&#8216;entidades.Pessoa&#8217;);<br />
/* Instanciando */<br />
$pessoa = new Pessoa;<br />
/* pegando a pessoa com o código 1<br />
Nota: caso você não saiba o código mas o email, por exemplo, você poderá usar, por exemplo<br />
$pessoa-&gt;get(&#8216;email&#8217;, &#8216;eu@hufersil.com,br&#8217;);<br />
*/<br />
$pessoa-&gt;get( 1 );<br />
/* mostrando o nome da pessoa */<br />
echo $pessoa-&gt;nome;</div>
<p>Para baixar o pacote, acesse <a href="http://www.hufersil.com.br/lumine/" target="_blank">http://www.hufersil.com.br/lumine/</a><br />
Para mais exemplos e documentação, acesse <a href="http://www.hufersil.com.br/lumine/lumine/documentation/enduser/" target="_blank">http://www.hufersil.com.br/lumine/lumine/documentation/enduser/</a>.</p>
<p>Iremos utilizar o <a href="http://www.hufersil.com.br/lumine/editor/" target="_blank">editor visual de Lumine</a> para criarmos os arquivos base para trabalharmos com o banco de dados. Vamos precisar de duas tabelas: uma para armazenar as enquetes e outra para armazenar as opções das enquetes. Em nosso exemplo, as entidades devem ficar assim:</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/enquete_flash_imagens/imagem1.jpg" border="1" alt="Entidades no LumineEditor" width="556" height="382" /></p>
<p>No final desta coluna, tem um arquivo zip com todos os arquivos deste tutorial. Para ver estas entidades, abra no LumineEditor o arquivo chamado <strong>LumineEditor.xml</strong>.</p>
<p>Na lado direito do editor visual, altere os dados necessários para conexão com o banco de dados.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/enquete_flash_imagens/imagem2.jpg" border="1" alt="Configurações de conexão" width="556" height="382" /></p>
<p>Para uma explicação sobre as configurações, acesse a <a href="http://www.hufersil.com.br/lumine/lumine/documentation/enduser/">documentação de Lumine</a>.</p>
<p>Depois de terminar de fazer as alterações necessárias, clique no ícone da engrenagem laranja <img src="http://www.mxstudio.com.br/imagens_artigos/enquete_flash_imagens/imagem3.jpg" alt="Gerar os arquivos" width="29" height="23" /> para gerar os arquivos de mapeamentos, entidades e configuração. Lumine solicitará a você que efetue o download do arquivo. Salve-o em um lugar desejado e descompacte-o na mesma pasta informada na opção <strong>class-path</strong>.</p>
<p>Juntamente com os outros arquivos, irá vir um arquivo chamado <strong>createSchema.php</strong>. Basta você acessa-lo pelo seu navegador (tipo, http://localhost/mx/enquete/createSchema.php) para ele gerar suas tabelas no banco de dados corretamente.</p>
<p>Pronto! Já temos nossas entidades, mapeamentos, tabelas e arquivo de configuração criados! Agora, é só utilizar as classes!</p>
<h3>Inserindo uma enquete no banco</h3>
<p>Eu vou fazer um exemplo bem simples. Depois vocês podem fazer um gerenciador para o mesmo. Salve como <strong>inserir.php</strong>.</p>
<div id="div" title="Criando a primeira enquete">require_once &#8216;lumine/LumineConfiguration.php&#8217;;<br />
/* iniciando uma configuração de Lumine  */<br />
$conf = new LumineConfiguration( &#8216;lumine-conf.xml&#8217; );<br />
/* incluindo a classe Enquete e Opcao*/<br />
Util::Import(&#8216;entidades.Enquete&#8217;);<br />
Util::Import(&#8216;entidades.Opcao&#8217;);<br />
/* instancia a classe Enquete */<br />
$enquete = new Enquete;<br />
/* criando 3 opções de enquete */<br />
$opt1 = new Opcao;<br />
$opt2 = new Opcao;<br />
$opt3 = new Opcao;<br />
/* colocando os dados da enquete */<br />
$enquete-&gt;pergunta = &#8216;O que você achou do novo site?&#8217;;<br />
$enquete-&gt;data_cadastro = time();<br />
/* dados das opções */<br />
$opt1-&gt;opcao = &#8216;Excelente&#8217;;<br />
$opt1-&gt;votos = 0;<br />
$opt2-&gt;opcao = &#8216;Bom&#8217;;<br />
$opt2-&gt;votos = 0;<br />
$opt3-&gt;opcao = &#8216;Horrível!&#8217;;<br />
$opt3-&gt;votos = 0;<br />
/* colocando essas opções na enquete */<br />
$enquete-&gt;opcao_list = array( $opt1, $opt2, $opt3);</p>
<p>/* Salvando tudo no banco de dados */<br />
$enquete-&gt;save();</p></div>
<p>Viram como é fácil? Dessa forma, não precisamos nos preocupar com as SQL. Ele já insere tudo certinho.</p>
<div id="destaque"><strong>Importante:</strong> se você quiser inserir valores com aspas simples ou duplas, é necessário colocar uma opção a mais no arquivo lumine-conf.xml, a opção <strong>escape</strong>. Acesse a <a href="http://www.hufersil.com.br/lumine/lumine/documentation/enduser/">documentação do Lumine</a> para maiores informações e como usá-la</div>
<h3>Criando o arquivo que gera o XML da enquete</h3>
<p>Vamos criar agora o arquivo que recupera os dados da enquete e gera o XML. Salve como <strong>enquete.php</strong>.</p>
<div id="div2" title="Gerando o XML da enquete">require_once &#8216;lumine/LumineConfiguration.php&#8217;;<br />
/* inicia a configuração */<br />
$conf = new LumineConfiguration( &#8216;lumine-conf.xml&#8217; );<br />
/* incluindo a classe Enquete*/<br />
Util::Import(&#8216;entidades.Enquete&#8217;);</p>
<p>/* recuperando a última enquete adicionada */<br />
$enquete = new Enquete;<br />
$enquete-&gt;orderby(&#8216;idenquete desc&#8217;);<br />
$enquete-&gt;limit( 1 );</p>
<p>/* inicia o XML */<br />
$xml = &#8216;&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;&#8217;;</p>
<p>$xml .= &#8216;&lt;enquete&gt;&#8217;;</p>
<p>/* procura e já testa se encontrou alguma */<br />
if($enquete-&gt;find( true ) &gt; 0) {</p>
<p>/* coloca a pergunta no XML */<br />
$xml .= &#8216;&lt;pergunta&gt;&lt;![CDATA['.$enquete-&gt;pergunta.']]&gt;&lt;/pergunta&gt;&#8217;;</p>
<p>$xml .= &#8216;&lt;opcoes&gt;&#8217;;<br />
/* recupera as opções */<br />
$opcoes = $enquete-&gt;getLink(&#8216;opcao_list&#8217;);<br />
/* para cada opção encontrada */</p>
<p>foreach($opcoes as $opcao) {<br />
/* coloca no XML */<br />
$xml .= &#8216;&lt;opcao id=&#8221;&#8216;.$opcao-&gt;idopcao.&#8217;&#8221;&gt;&lt;![CDATA['.$opcao-&gt;opcao.']]&gt;&lt;/opcao&gt;&#8217;;<br />
}<br />
/* fecha o bloco de opções */<br />
$xml .= &#8216;&lt;/opcoes&gt;&#8217;;<br />
} else {<br />
/* se não encontrou, coloca um nó de erro informando que não encontrou */<br />
$xml .= &#8216;&lt;erro&gt;&#8217;.'Enquete não encontrada&#8217;.'&lt;/erro&gt;&#8217;;<br />
}<br />
/* fecha o bloco da enquete */<br />
$xml .= &#8216;&lt;/enquete&gt;&#8217;;</p>
<p>/* muda o header para XML */<br />
header(&#8220;Content-Type: text/xml&#8221;);<br />
/* envia o XML */<br />
echo $xml;</p>
</div>
<h3>Criando o arquivo que salva a opção escolhida no Flash</h3>
<p>Este arquivo será chamado quando o usuário clicar em uma das opções. Após salvar a opção escolhida pelo usuário, já retorna os valores atualizados para mostrar os resultados da enquete. Salve-o como <strong>salva_opcao.php</strong>.</p>
<div id="div3" title="Salva o voto">require_once &#8216;lumine/LumineConfiguration.php&#8217;;<br />
/* inicia a configuração */<br />
$conf = new LumineConfiguration( &#8216;lumine-conf.xml&#8217; );<br />
/* inclui a Classe de opção */<br />
Util::Import(&#8216;entidades.Opcao&#8217;);</p>
<p>/* instância a classe */<br />
$opt = new Opcao;</p>
<p>/* inicia o XML */<br />
$xml .= &#8216;&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;<br />
?&gt;&#8217;;<br />
$xml .= &#8216;&lt;enquete&gt;&#8217;;<br />
/* recupera a opção escolhida e já testa se encontrou */<br />
if( $opt-&gt;get( sprintf(&#8220;%d&#8221;, $_POST['id']) ) &gt; 0) {<br />
/* adiciona o voto escolhido */<br />
$opt-&gt;votos++;<br />
/* salva os dados */<br />
$opt-&gt;save();<br />
/* recupera a enquete */<br />
$enquete = $opt-&gt;getLink(&#8216;enquete&#8217;);</p>
<p>/* adiciona no XML */<br />
$xml .= &#8216;&lt;pergunta&gt;&lt;![CDATA['.$enquete-&gt;pergunta.']]&gt;&lt;/pergunta&gt;&#8217;;</p>
<p>/* pega as opções */<br />
$opts = $enquete-&gt;getLink<br />
(&#8216;opcao_list&#8217;);<br />
/* guarda o total de votos */<br />
$total = 0;</p>
<p>/* acrescenta as opções encontradas no XML com o respectivo numero de votos */<br />
$xml .= &#8216;&lt;opcoes&gt;&#8217;;<br />
foreach($opts as $opcao) {<br />
/* soma o total mais os votos da opção atual */<br />
$total += $opcao-&gt;votos;<br />
$xml<br />
.= &#8216;&lt;opcao votos=&#8221;&#8216;.$opcao-&gt;votos.&#8217;&#8221; id=&#8221;&#8216;.$opcao-&gt;idopcao.&#8217;&#8221;&gt;&lt;![CDATA['.$opcao-&gt;opcao.']]&gt;&lt;/opcao&gt;&#8217;;<br />
}</p>
<p>$xml .= &#8216;&lt;/opcoes&gt;&#8217;;<br />
}</p>
<p>/* coloca o nó do total de votos */<br />
$xml .= &#8216;&lt;total_votos&gt;&#8217;.$total.&#8217;&lt;/total_votos&gt;&#8217;;<br />
$xml .= &#8216;&lt;/enquete&gt;&#8217;;<br />
/* muda o header */</p>
<p>header(&#8220;Content-Type: text/xml&#8221;);<br />
echo $xml;</p></div>
<h3>Criando a interface em Flash</h3>
<p>Essa parte eu acho um pouco mais complicada que a anterior, portanto vou ceder os arquivos em Flash 8, mas da mesma forma, explicarei como fazer a interface para funcionar certinho.</p>
<p>Crie um campo de texto dinâmico no palco, com o nome de instância  <strong>pergunta</strong>. Abaixo dele, crie um movie clip com dois quadros. O campo de texto pergunta <strong>não</strong> deve estar dentro deste movieclip. Este servirá como nosso radio button. No primeiro quadro, faça os desenhos dele não checado, e no segundo, dele como se estivesse checado. Quando você for converte-lo para movieclip, coloque as opções como mostrado abaixo:</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/enquete_flash_imagens/imagem4.jpg" alt="Propriedades" width="414" height="470" /></p>
<p>Ainda dentro deste mesmo movieclip, coloque um campo de texto dinâmico com nome de instancia <strong>opcao</strong>. Ele deve estar presente nos dois quadros. A maneira mais fácil é colocar ele no quadro e sem quadro chave no segundo segundo, o que irá fazer com ele fique presente nos dois.<br />
Volte a linha de tempo principal e dê o nome deste movieclip como <strong>opt</strong>.</p>
<p>Agora selecione o campo de texto dinâmico <strong>pergunta</strong> e o movieclip <strong>opt</strong> e crie um novo movie clip, chamado<strong> enquete</strong>, com as opções abaixo:</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/enquete_flash_imagens/imagem5.jpg" alt="" width="414" height="470" /></p>
<p>Dentro deste novo movieclip, crie uma nova camada. Nesta nova camada, crie um texto dinâmico na mesma posição x e y do movieclip opt (que está na camada de baixo). Selecione este campo de texto recém criado e dê-lhe o nome de instância <strong>texto</strong>. Selecione-o novamente e converta-o em movieclip. Dê lhe o nome de instância de <strong>item_resultado</strong>. Pronto! a interface está feita! Agora basta criarmos os AS&#8217;s para eles.</p>
<p>Se vocês notarem nas duas imagens anteriores, temos a opção AS 2.0 class marcada. Estes são os nomes das classes que criaremos para o movieclip de opções da enquete e para a enquete, respectivamente.</p>
<h4>Criando o arquivo Opcao.as</h4>
<p>Basta pegar o código abaixo e salva-lo como <strong>Opcao.as</strong> na pasta do arquivo FLA.</p>
<div id="div4" title="Opcao.as">/* importa a classe EventDispatcher */<br />
import mx.events.EventDispatcher;<br />
class Opcao extends MovieClip {<br />
/* text field que irá aparecer o texto */<br />
var opcao:TextField;<br />
/* tipo do objeto */<br />
var tipo:String;<br />
/* se está checado ou não */<br />
var checado:Boolean;<br />
/* valor do objeto */<br />
var valor:String;<br />
/* métodos da classe EventDispatcher */<br />
var addEventListener:Function;<br />
var removeEventListener:Function;<br />
private var dispatchEvent:Function;<br />
/* construtor */<br />
function Opcao() {<br />
/* inicializa a EventDispatcher */<br />
mx.events.EventDispatcher.initialize(this);<br />
/* coloca como não checado */<br />
this.setChecado(false);<br />
/* indica o tipo de objeto */<br />
tipo = &#8216;__opcao_enquete&#8217;;<br />
/* quando a pessoa clicar nessa opção */<br />
this.onRelease = function() {<br />
/* todos os outros itens serão de-checados */<br />
for (var i in _parent) {<br />
if (_parent[i].tipo == this.tipo) {<br />
_parent[i].setChecado(false);<br />
}<br />
}<br />
/* seta esta opção como checada */<br />
this.setChecado(true);<br />
/* dispara o evento informando qual opção foi checada */<br />
this.dispatchEvent({type:&#8217;click&#8217;});<br />
};<br />
}<br />
/* pega o valor */<br />
function getValor():String {<br />
return valor;<br />
}<br />
/* altera o valor */<br />
function setValor(s:String):Void {<br />
this.valor = s;<br />
}<br />
/* coloca como checado ou não */<br />
function setChecado(b:Boolean):Void {<br />
this.checado = b;<br />
if (b == true) {<br />
this.gotoAndStop(2);<br />
} else {<br />
this.gotoAndStop(1);<br />
}<br />
}<br />
/* altera o texto */<br />
function setOpcao(t:String):Void {<br />
this.opcao.text = t;<br />
}<br />
/* pega o texto */<br />
function getOpcao():String {<br />
return this.opcao.text;<br />
}<br />
}</div>
<h3>Criando o arquivo Enquete.as</h3>
<p>Finalmente, basta criarmos o arquivo <strong>Enquete.as</strong>. Igualmente ao Opcao.as, salve-o na mesma pasta que o FLA:</p>
<div id="div5" title="Enquete.as">class Enquete extends MovieClip {<br />
/* url base */<br />
var baseurl:String;<br />
/* url que pega a enquete */<br />
var pega_enquete:String;<br />
/* url que salva os dados */<br />
var salva_dados:String;<br />
/* movie clip da opção */<br />
var opt:MovieClip;<br />
/* movie clip de resultado */<br />
var item_resultado:MovieClip;<br />
/* valor escolhido pelo usuário */<br />
var valorEscolhido:String;<br />
/* botão de votar */<br />
var btnVotar:Button;<br />
/* construtor */<br />
function Enquete() {<br />
baseurl = &#8216;http://webmaster/mx/enquete/&#8217;;<br />
pega_enquete = baseurl+&#8217;enquete.php&#8217;;<br />
salva_dados = baseurl+&#8217;salva_opcao.php&#8217;;<br />
valorEscolhido = &#8221;;<br />
opt._visible = false;<br />
item_resultado._visible = false;<br />
/* pega a enquete */<br />
this.recuperaEnquete();<br />
/* coloca a ação no botão de votar */<br />
btnVotar.onRelease = this.votar;<br />
}<br />
/* função que recupera a enquete */<br />
function recuperaEnquete():Void {<br />
var recebe:LoadVars = new LoadVars();<br />
var envia:LoadVars = new LoadVars();<br />
/* referencia a este objeto */<br />
recebe.ref = this;<br />
recebe.onData = function(str:String) {<br />
/* XML para tratar o retorno recebido */<br />
var xdoc:XML = new XML();<br />
xdoc.ignoreWhite = true;<br />
xdoc.parseXML(str);<br />
/* listener */<br />
var list:Object = new Object();<br />
/* referencia a este objeto */<br />
list.ref = this.ref;<br />
/* função de retorno */<br />
list.click = function(evt) {<br />
this.ref.valorEscolhido = evt.target.getValor();<br />
};<br />
/* coloca a pergunta */<br />
this.ref.pergunta.text = xdoc.firstChild.firstChild.firstChild.toString();<br />
/* pega o nó da primeira opção */<br />
var node:XMLNode = xdoc.firstChild.lastChild.firstChild;<br />
/* contador para acertar a posição */<br />
var c:Number = 0;<br />
/* para cada opção */<br />
for (node; node != null; node=node.nextSibling) {<br />
/* duplica o movieclip da opção */<br />
var d:MovieClip = this.ref.opt.duplicateMovieClip(&#8216;opt&#8217;+node.attributes.id, this.ref.getNextHighestDepth());<br />
/* seta o valor */<br />
d.setValor(node.attributes.id);<br />
/* seta o texto */<br />
d.setOpcao(node.firstChild.toString());<br />
/* coloca na linha de baixo */<br />
d._y = this.ref.opt._y+(d._height*(c++));<br />
/* adiciona o listener */<br />
d.addEventListener(&#8216;click&#8217;, list);<br />
}<br />
/* posiciona o botao de votar mais abaixo */<br />
this.ref.btnVotar._y = Math.round(d._y + d._height);<br />
};<br />
/* envia um dado qualquer para não guardar o xml no cache */<br />
envia.sendAndLoad(pega_enquete, recebe, &#8216;post&#8217;);<br />
}<br />
/* ação de votar */<br />
function votar():Void {<br />
/* remove as opções */<br />
for(var i:String in this._parent) {<br />
this._parent[i].removeMovieClip();<br />
}<br />
/* deixa o botão de votar invisivel */<br />
this._visible = false;<br />
/* cria os objetos de envio e recebimento de dados */<br />
var recebe:LoadVars = new LoadVars();<br />
var envia:LoadVars = new LoadVars();<br />
/* referencia ao objeto da enquete */<br />
recebe.ref = this._parent;<br />
/* quando receber o retorno */<br />
recebe.onData = function(str:String):Void  {<br />
/* cria um XML de retorno */<br />
var xdoc:XML = new XML();<br />
xdoc.ignoreWhite = true;<br />
xdoc.parseXML(str);<br />
/* pega a primeira opção da enquete com os respectivos votos */<br />
var node:XMLNode = xdoc.firstChild.childNodes[1].firstChild;<br />
/* total de votos */<br />
var total:Number = new Number( xdoc.firstChild.lastChild.firstChild.toString() );<br />
/* contador para mudar a posição */<br />
var c:Number = 0;<br />
/* para cada opção */<br />
for(node; node != null; node = node.nextSibling) {<br />
/* duplica o movie clip de resultado */<br />
var d:MovieClip = this.ref.item_resultado.duplicateMovieClip(&#8216;res&#8217;+node.attributes.id,this.ref.getNextHighestDepth());<br />
/* calcula a porcentagem */<br />
var p:String = Math.round((node.attributes.votos/total)*100)+&#8217;%';<br />
/* altera o texto */<br />
d.texto.text = node.firstChild.toString() + &#8216; &#8211; &#8216; + node.attributes.votos + &#8216; votos (&#8216; + p + &#8216;)&#8217;;<br />
/* ajusta o campo de texto */<br />
d.texto.autoSize=&#8217;left&#8217;;<br />
/* coloca na posição certa */<br />
d._y = this.ref.item_resultado._y + (d._height * (c++));<br />
}<br />
};<br />
/* coloca a opção escolhida */<br />
envia.id = this._parent.valorEscolhido;<br />
envia.sendAndLoad(this._parent.salva_dados, recebe, &#8216;post&#8217;);<br />
}<br />
}</div>
<p>Ufa! Acho que essa foi uma das colunas mais longas que já escrevi heheheh.<br />
Vocês podem baixar os arquivos <a href="http://www.hufersil.com.br/mx/enquete.zip">aqui</a></p>
<p>E por favor: DÚVIDAS, POSTEM NO <a href="http://forum.mxstudio.com.br/index.php?showforum=8">FÓRUM</a>!</p>
<p>@braços e fiquem com Deus!</td>
</tr>
</tbody>
</table>
<p><script type="text/javascript"><!--
FormatPHP(new Array('Lumine','Criando a primeira enquete','Gerando o XML da enquete','Salva o voto'));
FormatAS(new Array('Opcao.as','Enquete.as'));
// --></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/enquete_php___mysql___flash/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Redimensionamento dinâmico</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/redimensionamento_dinamico/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/redimensionamento_dinamico/#comments</comments>
		<pubDate>Mon, 12 Dec 2005 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Veja como permitir que seus usu&#225;rios redimensionem os movieclips facilmente]]></description>
			<content:encoded><![CDATA[<h1>Para descontrair</h1>
<p>Fala galera!</p>
<p>Hoje resolvi colocar uma coisa diferente, para que vocês possam fazer uso em algum joguinho que queiram implementar. Aparentemente é uma coisa bem simples, mas acreditem, dá para fazer muitos sistemas interessantes com que vamos estudar hoje.</p>
<p>Ele não tem arquivos fonte! É só dar um CTRL+C &gt; CTRL+V em um quadro e pronto. O lance  estará funcionando.</p>
<p>Trata-se de um sistema de redimensionamento dos objetos no palco, onde o usuário irá poder aumentar ou diminuir o tamanho dos objetos, bem como mudar suas posições. Não implementei o lance de poder enviar para frente e para trás, mas como dica, estude as funções MovieClip.getDepth e MovieClip.swapDepths.</p>
<p>Todos os objetos no palco devem ter o seu ponto de registro 0, 0 e devem ser do tipo MovieClip.</p>
<p>Abaixo segue o código (é só copiar e colar):</p>
<div id="codigo">/* objeto ativo quando a pessoa clicar em cima de algum */<br />
var ActiveObject:MovieClip = null;/* modelo para servir de botões de resize para os objetos selecionados */<br />
var d1:MovieClip = _root.createEmptyMovieClip(&#8216;d1&#8242;,_root.getNextHighestDepth());<br />
/* coloca um preenchimento no mesmo */<br />
d1.beginFill(0&#215;000000,100);<br />
/* ele terá 5 x 5 pixels */<br />
d1.lineTo(5,0);<br />
d1.lineTo(5,5);<br />
d1.lineTo(0,5);<br />
d1.lineTo(0,0);<br />
/* termina o preenchimento */<br />
d1.endFill();</p>
<p>/* duplica para mais 3 botões de resize */<br />
var d2:MovieClip=d1.duplicateMovieClip(&#8216;d2&#8242;,_root.getNextHighestDepth());<br />
var d3:MovieClip=d1.duplicateMovieClip(&#8216;d3&#8242;,_root.getNextHighestDepth());<br />
var d4:MovieClip=d1.duplicateMovieClip(&#8216;d4&#8242;,_root.getNextHighestDepth());<br />
/* indica que deve ser pulado na inicialização,<br />
tratando-se de um objeto que não será redimensionado */<br />
d1.jump=d2.jump=d3.jump=d4.jump=true;</p>
<p>/* exibe/oculta os botoes de resize */<br />
function setVisible (b:Boolean):Void {<br />
d1._visible=d2._visible=d3._visible=d4._visible = b;<br />
}<br />
/* coloca os botoes na suas devidas posições<br />
quando um objeto é selecionado */<br />
function setPosition (alvo:MovieClip):Void {<br />
d1._x = alvo._x-d1._width;<br />
d1._y = alvo._y-d1._height;</p>
<p>d2._x = alvo._x-d2._width;<br />
d2._y = alvo._y+alvo._height;</p>
<p>d3._x = alvo._x + alvo._width;<br />
d3._y = alvo._y &#8211; d3._height;</p>
<p>d4._x = alvo._x + alvo._width;<br />
d4._y = alvo._y + alvo._height;<br />
setVisible( true );<br />
activateResize();<br />
}<br />
/* ativa os botões para calcular o<br />
tamanho e posição do objeto alvo */<br />
function activateResize ():Void {<br />
d1.onPress = d2.onPress = d3.onPress = d4.onPress = function ():Void {<br />
ativaCalcularTamanho(this);<br />
this.startDrag(false);<br />
}<br />
}<br />
/* calcula a posicao e tamanho do objeto alvo */<br />
function ativaCalcularTamanho (b:MovieClip):Void {<br />
b.onMouseMove = function():Void {<br />
switch(this._name) {<br />
case &#8220;d1&#8243;:<br />
d2._x = d1._x;<br />
d3._y = d1._y;<br />
break;<br />
case &#8220;d2&#8243;:<br />
d1._x = d2._x;<br />
d4._y = d2._y;<br />
break;<br />
case &#8220;d3&#8243;:<br />
d1._y = this._y;<br />
d4._x = this._x;<br />
break;<br />
case &#8220;d4&#8243;:<br />
d3._x = this._x;<br />
d2._y = this._y;<br />
break;<br />
}<br />
ActiveObject._x = d1._x + d1._width;<br />
ActiveObject._width = d3._x &#8211; (d1._x + d1._width);<br />
ActiveObject._y = d1._y + d1._height;<br />
ActiveObject._height = d2._y &#8211; d1._y &#8211; d1._height;<br />
updateAfterEvent();<br />
}<br />
b.onRelease = b.onReleaseOutside = function () {<br />
this.stopDrag();<br />
setPosition( ActiveObject );<br />
delete this.onMouseMove;<br />
}<br />
}</p>
<p>/* faz com que todos os movieclips<br />
do palco (exceto os que tem a propriedade jump=true)<br />
sejam habilitados para serem redimensionados e movidos */<br />
function initialize() {<br />
for(var i:String in _root) {<br />
if(typeof(_root[i]) == &#8216;movieclip&#8217; &amp;&amp; _root[i].jump == undefined) {<br />
_root[i].onPress = function():Void {<br />
ActiveObject = this;</p>
<p>this.onMouseMove = function ():Void {<br />
setPosition( this );<br />
updateAfterEvent();<br />
}<br />
setPosition( this );<br />
this.startDrag( false );<br />
}<br />
_root[i].onRelease = function():Void {<br />
this.onMouseMove = undefined;<br />
this.stopDrag();<br />
setPosition( this );<br />
}<br />
}<br />
}<br />
}<br />
/* oculta os botoes de resize */<br />
setVisible( false );<br />
/* inicializa os objetos */<br />
initialize();</p>
</div>
<p>E aqui você confere um exemplo de seu uso!</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="high" /><param name="menu" value="false" /><param name="src" value="http://www.mxstudio.com.br/mx_novo/wp-admin/resize-mx_imagens/resize.swf" /><embed type="application/x-shockwave-flash" width="550" height="400" src="http://www.mxstudio.com.br/mx_novo/wp-admin/resize-mx_imagens/resize.swf" menu="false" quality="high"></embed></object></p>
<p>@braços e fiquem com Deus! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/redimensionamento_dinamico/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Estudo da Classe FileReference (Flash 8)</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/estudo_da_classe_filereference__flash_8_/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/estudo_da_classe_filereference__flash_8_/#comments</comments>
		<pubDate>Fri, 04 Nov 2005 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Vamos estudar como enviar e receber arquivos utilizando a classe FileReference dispon&#237;vel no Flash 8 Professional]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td id="colunaTexto" valign="top">
<h1>Classe FileReference</h1>
<p>Fala galera!</p>
<p>Primeiramente, gostaria de pedir desculpas pelo tempo que fiquei sumido&#8230; é que estou trabalhando em um projeto meio (bastante) complexo, correndo atrás de construir minha casinha e estou escrevendo esta coluna agora com a mão direita machucada&#8230; quem não sabe jogar bola é assim: escorrega na bola e cai em cima da própria mão!!</p>
<p>Mas vamos partir para o que interessa. No Flash 8, encontramos uma classe muito interessante, para que possamos trabalhar com upload e download de arquivos (lembra do input do tipo file no HTML???)</p>
<p>Uma das grandes diferenças da classe FileReference em relação ao tradicional upload por form de um HTML, é que ela possibilita saber a quantas anda nosso download/upload do arquivo!</p>
<p>A maior parte do trabalho com a classe é feita através de listeners. Aqui vão os eventos disparados pela classe que podem ser recuperados e tratados através de listeners:</p>
<ul>
<li><strong>onSelect (file:FileReference) </strong>: disparado quando o usuário seleciona o arquivo na caixa de diálogo;</li>
<li><strong>onCancel</strong> <strong>(file:FileReference)</strong>: disparado quando o usuário clica em cancelar na caixa de diálogo;</li>
<li><strong>onOpen</strong> <strong>(file:FileReference)</strong>: disparado quando se inicia um download ou upload de arquivo;</li>
<li><strong>onProgress (bytesLoaded:Number, bytesTotal:Number, file:FileReference) </strong>: Informa a quantidade de bytes carregados/enviados, a quantidade de bytes total e o arquivo que está sendo feito upload/download;</li>
<li><strong>onComplete</strong>: disparado ao completar um download / upload;</li>
<li><strong>onHTTPError</strong>: disparado quando há algum erro no envio (upload) do arquivo;</li>
<li><strong>onIOError</strong>: disparado quando há algum erro no recebimento (download) do arquivo;</li>
<li><strong>onSecurityError</strong>: disparado quando há erros de segurança (por exemplo, tentando salvar em servidores diferentes);</li>
</ul>
<p>Os métodos que podem ser invocados com uma instância de FileReference são:</p>
<ul>
<li><strong>addListener (listener:Object)</strong>: objeto que servirá de ouvinte (listener);</li>
<li><strong>browse ( [listadeTipos:Array] ): </strong>exibe a caixa de diálogo para procura de um arquivo para upload. O parâmetro lista de tipos, é um array de objetos contendo duas propriedades: description e extension. Por exemplovar img:Object = {description: &#8220;JPG Files (*.jpg)&#8221;, extension:&#8221;*.jpg; *.jpeg&#8221;};
<p>var txt:Object = {description: &#8220;Plain text files  (*.txt)&#8221;, extension:&#8221;*.txt&#8221;};</p>
<p>var listTypes:Array = new Array(img, txt);</li>
<li><strong>cancel (void)</strong>: cancela o download  ou upload do arquivo;</li>
<li><strong>download (url:String, [defaultName:String] ): </strong>inicia um download do arquivo. O parâmetro URL informa de onde está sendo feito o download do arquivo, e o parâmetro defaultName (opcional) informa um nome padrão para o arquivo.</li>
<li><strong>removeListener (listener:Object):</strong> remove um ouvinte (listener) da lista de listeners do objeto FileReference.</li>
<li><strong>upload (url:String)</strong>: inicia o upload do arquivo para o endereço informado em URL.</li>
</ul>
<p>E, finalmente, suas propriedades são:</p>
<ul>
<li><strong>creationDate:Date</strong> &#8211; Data de criação do arquivo ;</li>
<li><strong>creator:String</strong> &#8211; Tipo de criador do arquivo (para Macintosh) ;</li>
<li><strong>modificationDate:Date</strong> &#8211; Data de modificação do arquivo ;</li>
<li><strong>name:String</strong> &#8211; Nome do arquivo ;</li>
<li><strong>size:Number</strong> &#8211; Tamanho do arquivo ;</li>
<li><strong>type:String</strong> &#8211; Tipo do arquivo.</li>
</ul>
<p>Todas as propriedades são somente leitura.</p>
<p>Bom, agora que vimos o que temos para usufruir na classe FileReference, vamos trabalhar um pequeno exemplo com ela.</p>
<p>Abaixo, estão os links para os arquivos PHP que criei para esta coluna. Para não ficar muito extensa, resolvi colocar um link para o fonte deles, formatado pelo próprio PHP.</p>
<ul>
<li><a href="http://www.hufersil.com.br/mx/FileReference/upload.phps">Upload de arquivos</a>;</li>
<li><a href="http://www.hufersil.com.br/mx/FileReference/lista.phps">Lista os arquivos</a>;</li>
</ul>
<p>Você poderá fazer o layout da maneira que desejar. Fiz um layout bem simples para que possamos realizar nosso estudo. Todos os desenhos abaixos estão em uma única camada. Todos os botões são componentes <strong>Button</strong>. Os nomes em vermelho são os <strong>NOMES DE INSTÂNCIA</strong> de cada objeto.</p>
<p><img src="http://www.mxstudio.com.br/imagens_artigos/htmlE14E59_fr-mx_imagens/interface.gif" border="1" alt="" width="551" height="450" /></p>
<p>Depois de nomear CORRETAMENTE os objetos no palco, iremos colocar as ações abaixo em uma NOVA CAMADA, para não misturar objetos com ações.</p>
<div id="codigo">/** URL que serão usadas */</p>
<p>listaURL = &#8220;http://www.hufersil.com.br/mx/FileReference/lista.php&#8221;;</p>
<p>uploadURL = &#8220;http://www.hufersil.com.br/mx/FileReference/upload.php&#8221;;</p>
<p>downloadURL = &#8220;http://www.hufersil.com.br/mx/FileReference/arquivos/&#8221;;</p>
<p>/** importa a classe FileReference */</p>
<p>import flash.net.FileReference;</p>
<p>/** importa a classe para coluna de datagrid */</p>
<p>import mx.controls.gridclasses.DataGridColumn;</p>
<p>/** Var que checa se o está sendo feito download ou upload */</p>
<p>var busy:Boolean = false;</p>
<p>/** listener para upload de arquivos */</p>
<p>var lfr:Object = new Object();</p>
<p>/** tipos que podem ser feitos o upload */</p>
<p>var types:Array = new Array();</p>
<p>var imgFiles:Object = {description:&#8221;Imagens (*.jpg, *.jpeg, *.gif, *.png)&#8221;,extension:&#8221;*.jpg; *.jpeg; *.gif; *.png&#8221;};</p>
<p>/** coloca o tipo na matriz de tipos */</p>
<p>types.push(imgFiles);</p>
<p>/** quando o usuário selecionar o arquivo */</p>
<p>lfr.onSelect = function (file:FileReference):Void {</p>
<p>error.text += &#8220;Arquivo &#8221; + file.name + &#8221; selecionado, fazendo upload&#8230;&#8221; + newline;</p>
<p>/** já tenta fazer o upload */</p>
<p>if(busy == false) {</p>
<p>if(!file.upload(uploadURL)) {</p>
<p>error.text += &#8220;Falha na tentativa de upload do arquivo&#8221; + newline;</p>
<p>} else {</p>
<p>btn_cancela_upload.enabled = true;</p>
<p>busy = true;</p>
<p>btn_escolhe_arquivo.enabled = false;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>lfr.onCancel = function (file:FileReference) {</p>
<p>error.text += &#8220;upload cancelado&#8221; + newline;</p>
<p>btn_cancela_upload.enabled = false;</p>
<p>btn_escolhe_arquivo = true;</p>
<p>busy = false;</p>
<p>barra_upload._xscale = 0;</p>
<p>}</p>
<p>lfr.onOpen = function(file:FileReference) {</p>
<p>error.text += &#8220;Arquivo aberto para download: &#8221; + file.name + newline;</p>
<p>}</p>
<p>lfr.onProgress = function (f:FileReference, bl:Number, bt:Number):Void {</p>
<p>barra_upload._xscale = (bl/bt)*100;</p>
<p>}</p>
<p>lfr.onComplete= function (file:FileReference):Void {</p>
<p>error.text += &#8220;upload de &#8221; + file.name+ &#8221; completado&#8221; + newline;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>btn_cancela_upload.enabled = false;</p>
<p>busy = false;</p>
<p>barra_upload._xscale = 0;</p>
<p>_loadXML.sendAndLoad(listaURL, lista_arquivos, &#8220;POST&#8221;);</p>
<p>}</p>
<p>lfr.onHTTPError = function(file:FileReference):Void {</p>
<p>error.text += &#8220;Erro de HTTP&#8221; + newline;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>btn_cancela_upload.enabled = false;</p>
<p>busy = false;</p>
<p>barra_upload._xscale = 0;</p>
<p>}</p>
<p>lfr.onIOError = function(file:FileReference):Void {</p>
<p>error.text += &#8220;Erro de I/O&#8221; + newline;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>btn_cancela_upload.enabled = false;</p>
<p>busy = false;</p>
<p>barra_upload._xscale = 0;</p>
<p>}</p>
<p>lfr.onSecurityError = function(file:FileReference, errorString:String):Void {</p>
<p>error.text += &#8220;Erro de segurança&#8221; + newline;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>btn_cancela_upload.enabled = false;</p>
<p>busy = false;</p>
<p>barra_upload._xscale = 0;</p>
<p>}</p>
<p>var fr:FileReference = new FileReference();</p>
<p>fr.addListener(lfr);</p>
<p>/** cria uma instancia do FileReference para download */</p>
<p>var filedown:FileReference = new FileReference();</p>
<p>/** listener do filedownload */</p>
<p>var filedown_listener:Object = new Object();</p>
<p>filedown_listener.onProgress = function(obj:FileReference, bl:Number, bt:Number):Void {</p>
<p>barra_download._xscale = (bl/bt)*100;</p>
<p>}</p>
<p>filedown_listener.onIOError = function(obj:FileReference):Void {</p>
<p>error.text += &#8220;Erro de IO&#8221;;</p>
<p>btn_cancela_download.enabled = false;</p>
<p>busy = false;</p>
<p>barra_download._xscale = 0;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>}</p>
<p>filedown_listener.onHTTPError = function(obj:FileReference):Void {</p>
<p>error.text += &#8220;Erro de HTTP&#8221;;</p>
<p>btn_cancela_download.enabled = false;</p>
<p>busy = false;</p>
<p>barra_download._xscale = 0;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>}</p>
<p>filedown_listener.onSecurityError = function (obj:FileReference):Void {</p>
<p>error.text += &#8220;Falha de segurança para download&#8221;;</p>
<p>btn_cancela_download.enabled = false;</p>
<p>busy = false;</p>
<p>barra_download._xscale = 0;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>}</p>
<p>filedown_listener.onCancel = function (obj:FileReference):Void {</p>
<p>error.text += &#8220;O download de &#8221; + obj.name + &#8221; foi cancelado&#8221;;</p>
<p>btn_cancela_download.enabled = false;</p>
<p>busy = false;</p>
<p>barra_download._xscale = 0;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>}</p>
<p>filedown_listener.onComplete = function(obj:FileReference):Void {</p>
<p>error.text += &#8220;Download de &#8221; + obj.name + &#8221; completado&#8221;;</p>
<p>btn_cancela_download.enabled = false;</p>
<p>busy = false;</p>
<p>barra_download._xscale = 0;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>}</p>
<p>filedown.addListener(filedown_listener);</p>
<p>/** listener do DataGrid */</p>
<p>var lista_listener:Object={};</p>
<p>lista_listener.cellPress = function (evt:Object) {</p>
<p>var it:Object = lista.getItemAt(Number(evt.itemIndex));</p>
<p>/** se encontrar o objeto que foi selecionado na lista */</p>
<p>if(it &amp;&amp; busy == false) {</p>
<p>/** tenta inicia o download */</p>
<p>if(! filedown.download(downloadURL + it.name, it.name) ) {</p>
<p>error.text =  &#8220;Não foi possível abrir a caixa de dialogo para salvar o arquivo&#8221;;</p>
<p>} else {</p>
<p>btn_cancela_download.enabled = true;</p>
<p>btn_escolhe_arquivo.enabled = false;</p>
<p>busy = true;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>/** adiciona o listener */</p>
<p>lista.addEventListener(&#8220;cellPress&#8221;,lista_listener);</p>
<p>/** Cria as colunas desejamos que apareçam */</p>
<p>var c_name:DataGridColumn = new DataGridColumn(&#8220;name&#8221;);</p>
<p>c_name.headerText = &#8220;Nome&#8221;;</p>
<p>c_name.width = 150;</p>
<p>var c_date:DataGridColumn = new DataGridColumn(&#8220;creation&#8221;);</p>
<p>c_date.headerText = &#8220;Data de criação&#8221;;</p>
<p>c_date.width = 250;</p>
<p>/** Adiciona as colunas */</p>
<p>lista.addColumn(c_name);</p>
<p>lista.addColumn(c_date);</p>
<p>/** deixa os botões de cancelar inativos */</p>
<p>btn_cancela_download.enabled = btn_cancela_upload.enabled = false;</p>
<p>/** coloca as barras de progressão com 0 de _xscale */</p>
<p>barra_download._xscale = barra_upload._xscale = 0;</p>
<p>/** ações para o botão de cancelar o download */</p>
<p>var cancela_download:Function = function ():Void {</p>
<p>filedown.cancel();</p>
<p>btn_cancela_download.enabled = false;</p>
<p>busy = false;</p>
<p>barra_download._xscale = 0;</p>
<p>}</p>
<p>btn_cancela_download.addEventListener(&#8220;click&#8221;, cancela_download);</p>
<p>/** ações para o botão de cancelar o upload */</p>
<p>var cancela_upload:Function = function ():Void {</p>
<p>fr.cancel();</p>
<p>btn_cancela_upload.enabled = false;</p>
<p>btn_escolhe_arquivo.enabled = true;</p>
<p>busy = false;</p>
<p>barra_upload._xscale = 0;</p>
<p>}</p>
<p>btn_cancela_upload.addEventListener(&#8220;click&#8221;, cancela_upload);</p>
<p>/** botão para escolher o arquivo para upload */</p>
<p>var escolhe_arquivo:Function = function ():Void {</p>
<p>fr.browse( types );</p>
<p>}</p>
<p>btn_escolhe_arquivo.addEventListener(&#8220;click&#8221;, escolhe_arquivo);</p>
<p>/** XML para carregar a lista de arquivos */</p>
<p>var lista_arquivos:XML = new XML();</p>
<p>lista_arquivos.ignoreWhite = true;</p>
<p>lista_arquivos.onLoad = function () {</p>
<p>lista.removeAll();</p>
<p>var node:XMLNode = this.firstChild.firstChild;</p>
<p>for(node; node!=null; node=node.nextSibling) {</p>
<p>lista.addItem(node.attributes);</p>
<p>}</p>
<p>}</p>
<p>/** utilizamos um objeto loadvars para não ficar no cache */</p>
<p>var _loadXML:LoadVars = new LoadVars();</p>
<p>_loadXML.sendAndLoad( listaURL, lista_arquivos, &#8220;POST&#8221;);</p>
</div>
<p>E aqui, está um exemplo dele funcionando!</p>
<p><a href="http://www.hufersil.com.br/mx/FileReference/">http://www.hufersil.com.br/mx/FileReference/ </a></p>
<p>@braços e fiquem com Deus!</td>
</tr>
</tbody>
</table>
<p><script type="text/javascript"><!--
FormatAS();
// --></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/estudo_da_classe_filereference__flash_8_/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Scrollbar para MovieClips e TextFields</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/scrollbar_para_movieclips_e_textfields/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/scrollbar_para_movieclips_e_textfields/#comments</comments>
		<pubDate>Thu, 18 Aug 2005 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Veremos como fazer um scrollbar para MovieClips e TextFields]]></description>
			<content:encoded><![CDATA[<p>Fala Comunidade! Estamos na área futebol clube mais uma vez para trazer algo de utilidade públic =D. Iremos ver dois pontos na coluna de hoje:</p>
<ul>
<li>Como criar um scrollbar que serve tanto para MovieClip quanto TextFields</li>
<li>Criar nossos próprios componentes.</li>
</ul>
<h3>Criando um ScrollBar</h3>
<p>Primeiramente, vamos criar nosso esqueleto de scrollbar, eu fiz um bem simples, para não perder muito tempo com layout e partir mais para a prática.</p>
<p> <img src="http://www.mxstudio.com.br/imagens_artigos/htmlO406_scrollbar_MX_imagens/img_scrollbar_1.gif" border="1" alt="" width="276" height="191" align="&gt;Crie o layout que desejar. Os objetos utilizados como botões (btn_cima, btn_baixo e pan) podem ser tanto MovieClips como Buttons. O objeto utilizado como caminho (track) deve ser do tipo MovieClip. &lt;/p&gt; &lt;p&gt;Obs.: Todos os objetos devem ter como ponto de registro a posição 0 x 0! Ou seja, escolha o quadradinho do canto superior esquerdo, como mostrado na figura ao lado.&lt;/p&gt; &lt;p&gt;Depois que você criou todos os objetos, selecione todos eles novamente para podermos colocar tudo num movieclip só. O nome solicitado na hora que você pressionar F8 (convert to symbol) não é realmente tão importante. Ele servirá mais para sua organização na biblioteca. Eu coloquei o meu como &lt;b&gt;scrollbar &lt;/b&gt;(sugestivo, não acham??).&lt;/p&gt; &lt;p&gt;Depois de ter transformado tudo em um movieclip só, abra o mesmo para edição e crie uma nova camada para colocarmos nossas ações.&lt;/p&gt; &lt;p&gt;Nessa nova camada, coloque as ações abaixo:&lt;/p&gt; &lt;div id=" /></p>
<pre lang="actionscript"> // coloca no tamanho normal
_xscale = _yscale = 100;
// pode ser um movieclip ou um textfield
var alvo = _parent[alvo];
// posição inicial do movieclip em y
var sy:Number = alvo._y;
// altera o tamanho da barra
track._height = track_height;
// coloca o botão de baixo abaixo da barra
btn_baixo._y = track._y + track._height;
// tira a maozinha dos botões
btn_baixo.useHandCursor = btn_cima.useHandCursor = pan.useHandCursor = false;

// mínimo em _y q o pan pode ir
var miny:Number = Math.round( track._y );
// máximo em _y q o pan pode ir
var maxy:Number = Math.round( track._y + track._height - pan._height );

// quando o cara pressionar o botão de cima
btn_cima.onPress = function () {
subindo = true;
descendo = false;
}
// quando tirar o mouse
btn_cima.onRelease = btn_cima.onReleaseOutside = function () {
subindo = descendo = false;
}
// quando o cara pressionar o botão de baixo
btn_baixo.onPress = function () {
subindo = false;
descendo = true;
}
// quando tirar o mouse
btn_baixo.onRelease = btn_baixo.onReleaseOutside = function () {
subindo = descendo = false;
}

// quando pressionar o pan
pan.onPress = function () {
// inicia o arrastamento
startDrag(this,false,this._x,miny,this._x,maxy);
}

// quando soltar o mouse
pan.onRelease = pan.onReleaseOutside = function () {
// para o arrastamento
stopDrag();
}

// cria o onEnterFrame
this.onEnterFrame = function () {
// se estiver subindo
if(subindo) {
// se não estiver a ponto de ir além do que pode
if(pan._y - 1 &gt; miny) {
pan._y–;
} else {
pan._y = miny;
}
}
// se estiver descendo
if(descendo) {
// se não estiver a ponto de ir além do que pode
if(pan._y + 1 &lt; maxy) {
pan._y++;
} else {
pan._y = maxy;
}
}
// faz um switch para saber qual o tipo de objeto que estamos usando
switch(typeof(alvo)) {
// se for um movieclip
case “movieclip”:
// Calcula
var s:Number = ((pan._y-miny)/(maxy-miny))*100;
var p:Number = (alvo._height - mascara)/100;
// move o objeto
alvo._y = sy - (p*s);
break;
// se for um TextField (padrão)
default:
// cacula
var s:Number = ((pan._y-miny)/(maxy-miny))*100;
var p:Number = alvo.maxscroll/100;
// move o objeto
alvo.scroll = p * s;
break;
}
}</pre>
<p>Após isso, chegou a hora de convertermos nosso movieclip para um componente!</p>
<h3>Criando nossos próprios componentes</h3>
<p>Caso você nunca tenha criado um componente, irei mostrar agora a forma mais simples de se criar um. É bem fácil.</p>
<ol>
<li>Clique com o botão direito em cima do objeto na biblioteca e selecione a opção <strong>Component definition</strong>;</li>
<li>Abrir-se-á uma nova janela solicitando as opções do novo componente. <img src="http://www.mxstudio.com.br/imagens_artigos/htmlO406_scrollbar_MX_imagens/img_scrollbar_2.gif" alt="" width="504" /></li>
</ol>
<p>As opções a cima são:</p>
<ul>
<li>Name: nome a ser exibido para o usuário na barra Componente Inspector;</li>
<li>Variable: nome real da variável a ser usada dentro do ActionScript;</li>
<li>Value: valor padrão da variável;</li>
<li>Type: tipo da variável.</li>
</ul>
<p>Os parâmetros colocados neste exemplo são:</p>
<ul>
<li>Alvo: nome de instância do objeto. Pode ser um movieclip ou um textfield. Não é necessário colocar o caminho absoluto no nome (_root.objeto). Se eles estiverem na mesma linha de tempo, coloque somente o nome de instancia, pois em nosso ActionScript colocamos: <strong>var alvo = _parent[alvo]</strong>, indicando que estamos pegando na linha de tempo anterior a que a action foi colocada;</li>
<li>Altura da mascara: altura da mascara que está sendo utilizada para cobrir parte do movie clip;</li>
<li>Altura da barra: altura desejada para a barra do scrollbar.</li>
</ul>
<p>Clique em OK. Você notará que o ícone do objeto na biblioteca mudará, indicando que se trata de um componente. Pronto! Agora é só você arrastar para o palco e testar!</p>
<p>@braços e fiquem com Deus! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/scrollbar_para_movieclips_e_textfields/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Integração mySQL + PHP + Flash &#8211; Parte 3</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/flash/integracao_mysql___php___flash___parte_3/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/flash/integracao_mysql___php___flash___parte_3/#comments</comments>
		<pubDate>Fri, 15 Jul 2005 00:00:00 +0000</pubDate>
		<dc:creator>hugo</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Nessa &#250;ltima parte, veremos como pegar os XML's gerado na coluna anterior e coloc&#225;-los dentro do Flash.]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.mxstudio.com.br/js/ColorCode.js"></script></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td id="colunaTexto">Fala Comunidade!</p>
<p>Essa terceira e última parte do estudo sobre como integrar MySQL + PHP + Flash fiz a uma violenta dor de cabeça, garganta inflamada e absolutamente sem voz nenhuma! Por isso, peço que perdoem se tiver muito erro de digitação! =D</p>
<p>Nessa última parte, veremos como pegar os XML&#8217;s gerado na coluna anterior e colocá-los dentro do Flash.<br />
Caso você não tenha feito ainda a coluna anterior, abaixo seguem os links para você poder fazer e acompanhar nosso estudo:</p>
<p><a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=582" target="_blank">Integração mySQL + PHP + Flash</a><br />
<a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=596" target="_blank">Integração mySQL + PHP + Flash &#8211; Parte 2</a></p>
<p>Iremos fazer uma pequena alteração em nosso PHP da coluna anterior, para que o XML gerado seja baseado no tipo de produto que desejamos. Altere as linhas mostradas abaixo no arquivo que gera o XML de produtos:</p>
<div id="codigo" title="XML Produtos Antigo">$sql = &#8220;SELECT p.idproduto,p.nome,p.valor,p.descricao,t.nome as tipo &#8220;;<br />
$sql .= &#8220;FROM produtos p INNER JOIN tipos t on (t.idtipo=p.idtipo) &#8220;;<br />
$sql .= &#8220;ORDER BY p.idproduto desc&#8221;;</div>
<p>Por isto:</p>
<div id="codigo" title="XML Produtos Novo">$sql = &#8220;SELECT p.idproduto,p.nome,p.valor,p.descricao,t.nome as tipo &#8220;;<br />
$sql .= &#8220;FROM produtos p INNER JOIN tipos t on (t.idtipo=p.idtipo) &#8220;;<br />
if(($x = sprintf(&#8216;%d&#8217;,$_REQUEST['idtipo'])) &gt; 0) {<br />
$sql .= &#8220;WHERE p.idtipo=$x &#8220;;<br />
}<br />
$sql .= &#8220;ORDER BY rand() LIMIT 8&#8243;;</div>
<p>Isto fará com que nossa consulta ao banco de dados seja baseada no tipo de produto clicado. Se nenhum tipo de produto for selecionado, será feita uma consulta ao banco pegando produtos de qualquer tipo em uma ordem aleatória. Esta consulta também limita o resultado em 8 registros, que é máximo de produtos que cabe no meu exemplo.</p>
<p>Agora que fizemos nossas alterações, vamos fazer um PHP que gera um XML dos tipos de produtos. Salve como <strong>tipos.php</strong>.</p>
<div id="codigo" title="Tipos de Produtos">&lt;?php<br />
/* pega o arquivo de configuração */<br />
require_once &#8216;config.php&#8217;;</p>
<p>/* inicia um XML para retorno */<br />
$xml = &#8216;&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;&#8217;;<br />
/* inicia a lista de tipos de produtos */<br />
$xml .= &#8216;&lt;tipos&gt;&#8217;;</p>
<p>/* monta a SQL */<br />
$sql = &#8220;SELECT * FROM tipos ORDER BY nome ASC&#8221;;</p>
<p>/* seleciona os tipos */<br />
$rs = mysql_query($sql);</p>
<p>/* para cada item encontrado, coloca dentro de um array associativo */<br />
while($row = mysql_fetch_assoc($rs)) {<br />
/* codifica os nomes, descrição, etc para UTF-8 */<br />
$nome = utf8_encode($row['nome']);</p>
<p>/* acrescenta este item no XML */<br />
$xml .= &#8216;&lt;item idtipo=&#8221;&#8216;.$row['idtipo'].&#8217;&#8221; nome=&#8221;&#8216;.$nome.&#8217;&#8221; /&gt;&#8217;;</p>
<p>}<br />
/* fecha o XML */<br />
$xml .= &#8216;&lt;/tipos&gt;&#8217;;</p>
<p>/* fecha a conexão com o banco */<br />
mysql_close($cn);</p>
<p>/* muda o header HTTP para XML */<br />
header(&#8220;Content-Type: text/xml&#8221;);</p>
<p>/* escreve o XML */<br />
echo $xml;<br />
?&gt;</p>
</div>
<p>Bom, agora que você já fez as primeiras partes, vamos partir para a etapa final.<br />
<a href="http://www.hufersil.com.br/mx/catalogo_1/arquivos/lojinha.html" target="_blank">Neste meu exemplo</a>, fiz um palco de 450 x 500 pixels. Daeh você fica a vontade para criar. Abaixo seguem as configurações necessárias para que possamos fazer nosso carro andar:</p>
<p><img title="AS" src="http://www.mxstudio.com.br/imagens_artigos/catalogo_3_MX_imagens/esquema_lojinha.gif" alt="" width="452" height="&gt; &lt;/p&gt; &lt;p&gt;A estrutura para este exemplo tem que ser seguida como mostrado na figura acima. É imprescíndivel que esteja conforme o mostrado para que tudo corra bem. &lt;/p&gt; &lt;p&gt; Obs.: nome de instância (Instance Name) é o nome que é declarado para o objeto no lado esquerdo da barra de propriedades do Flash de um objeto que está no palco, e não o nome que é dado ao objeto quando ele é convertido para movie clip! &lt;/p&gt; &lt;p&gt;Neste meu exemplo coloquei, também, uma mascára dentro do MovieClip do item 2, acima do MovieClip &lt;b&gt;loader&lt;/b&gt;, para que as fotos não &lt;/p&gt; &lt;p&gt; extrapolassem&lt;/p&gt; &lt;p&gt; o tamanho desejado. &lt;/p&gt; &lt;p&gt;Agora que você já fez o seu arquivo Flash com os dados mostados acima, abaixo segue as ações utilizadas, e elas devem estar no primeiro quadro (se você fez tudo certinho conforme mostrado acima, um CTRL + C, CTRL + V irá funcionar para testar):&lt;/p&gt; &lt;div id=" />/* MovieClip de modelo para os tipos */<br />
var it_tipo:String = &#8216;item_tipos&#8217;;<br />
/* MovieClip de modelo para os produtos */<br />
var it_produto:String = &#8216;item_produtos&#8217;;<br />
/* número de colunas para os produtos */<br />
var colunas:Number = 2;<br />
/* numero da coluna atual (indice 0)*/<br />
var coluna:Number = 0;<br />
/* número da linha atual */<br />
var linha:Number = 0;<br />
/* espaco entre os produtos */<br />
var espaco:Number = 10;<br />
/* url base dos PHPs */<br />
var urlbase:String = &#8216;http://www.hufersil.com.br/mx/catalogo_1/arquivos/&#8217;;<br />
/* documento XML para os tipos */<br />
var tipos:XML = new XML();<br />
/* documento XML para os produtos */<br />
var produtos:XML = new XML();<br />
/* ignora espaços em branco */<br />
tipos.ignoreWhite = produtos.ignoreWhite=true;<br />
/* assim que terminar de carregar os tipos */<br />
tipos.onLoad = function(b:Boolean) {<br />
/* oculta o movie clip de modelo */<br />
_root[it_tipo]._visible = false;<br />
/* pega o nó que contém a lista */<br />
var node:XMLNode = tipos.firstChild;<br />
/* para cada nó dentro deste */<br />
for (node=node.firstChild; node != null; node=node.nextSibling) {<br />
/* pega o próxima nível a ser usado */<br />
var n:Number = _root.getNextHighestDepth();<br />
/* duplica o item */<br />
_root[it_tipo].duplicateMovieClip(&#8216;it_tipo&#8217;+n, n);<br />
/* pega o item duplicado */<br />
var mc:MovieClip = _root['it_tipo'+n];<br />
/* coloca o rótulo certo */<br />
mc.rotulo.text = node.attributes.nome;<br />
/* coloca o código do tipo */<br />
mc.idtipo = node.attributes.idtipo;<br />
/* coloca o item abaixo do anterior */<br />
mc._y = _root[it_tipo]._y+((mc._height + 5 ) * n);<br />
/* quando o cara clicar no item */<br />
mc.onRelease = function() {<br />
/* chama a função que carrega somente os itens deste tipo */<br />
recarregar(this.idtipo);<br />
};<br />
}<br />
/* chama função que carrega o XML de produtos */<br />
recarregar(0);<br />
};<br />
/* quando terminar de carregar os produtos */<br />
produtos.onLoad = function(b:Boolean):Void {<br />
/* zera linha e coluna */<br />
linha = coluna = 0;<br />
/* limpa os produtos */<br />
limpaProdutos();<br />
/* deixa o item de modelo invisivel */<br />
_root[it_produto]._visible = false;<br />
/* pega o nó raiz */<br />
var node:XMLNode = this.firstChild;<br />
/* para cada nó dentro do nó raiz */<br />
for(node = node.firstChild; node != null; node=node.nextSibling) {<br />
/* pega a largura do item */<br />
var w:Number = _root[it_produto]._width;<br />
/* pega a altura do item */<br />
var h:Number = _root[it_produto]._height;<br />
/* pega o próximo depth a ser usado */<br />
var n:Number = _root.getNextHighestDepth();<br />
/* duplica o modelo */<br />
_root[it_produto].duplicateMovieClip(&#8216;produto_&#8217;+n, n);<br />
/* pega o produto duplicado */<br />
var mc:MovieClip = _root['produto_' + n];<br />
/* coloca na coluna certa */<br />
mc._x = _root[it_produto]._x + ((w + espaco) * coluna) ;<br />
/* coloca na linha certa */<br />
mc._y = _root[it_produto]._y + ((h + espaco) * linha);<br />
/* ID do produto */<br />
mc.idproduto = node.attributes.idproduto;<br />
/* carrega a foto deste produto */<br />
mc.loader.loadMovie(urlbase + &#8216;fotos.php?idproduto=&#8217; + mc.idproduto);<br />
/* coloca o nome do produto */<br />
mc.nome.text = node.attributes.nome;<br />
/* se a próxima coluna for maior que o permitido */<br />
if(++coluna &gt;= colunas) {<br />
/* volta para a primeira coluna */<br />
coluna = 0;<br />
/* aumenta a linha utilizada */<br />
linha++;<br />
}<br />
}<br />
}<br />
/* função que remove os produtos que já estão sendo exibidos */<br />
function limpaProdutos ():Void {<br />
/* para cada movie clip na linha de tempo principal */<br />
for(var x:String in _root) {<br />
/* se começar com o prefixo produto_ */<br />
if(x.substr(0, <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> == &#8216;produto_&#8217;) {<br />
/* remove ele */<br />
_root[x].removeMovieClip();<br />
}<br />
}<br />
}<br />
/* função que carrega a XML de produtos */<br />
function recarregar(idTipo:Number):Void {<br />
/* carrega o XML */<br />
produtos.load(urlbase + &#8216;produtos.php?idtipo=&#8217;+idTipo);<br />
}<br />
/* carrega o XML de tipos */<br />
tipos.load(urlbase+&#8217;tipos.php&#8217;);</p>
<p>Se você fez tudo conforme acima, <a href="http://www.hufersil.com.br/mx/catalogo_1/arquivos/lojinha.html" target="_blank">o resultado deve ser semelhante a este exemplo aqui =D.</a></p>
<p>@braços para todos e fiquem com Deus!</td>
</tr>
</tbody>
</table>
<p><script type="text/javascript"><!--
FormatAS(new Array("AS"));
FormatPHP(new Array('XML Produtos Novo','XML Produtos Antigo','Tipos de Produtos'));
// --></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/flash/integracao_mysql___php___flash___parte_3/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

