<?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>Debugando.com &#187; Programação</title>
	<atom:link href="http://www.debugando.com/tag/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.debugando.com</link>
	<description>Noticias, dicas e tutorias do mundo da Tecnologia.</description>
	<lastBuildDate>Thu, 01 Dec 2011 23:44:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Criando um Data Grid com POO e PHP5</title>
		<link>http://www.debugando.com/criando-um-data-grid-com-poo-e-php5/</link>
		<comments>http://www.debugando.com/criando-um-data-grid-com-poo-e-php5/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 13:18:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Data Grid]]></category>
		<category><![CDATA[PHP5]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=649</guid>
		<description><![CDATA[


Um data grid nada mais é do que a apresentação de dados em forma de tabela (lembra das &#60;table&#62;&#60;/table&#62;? Algo assim). Cada conjunto de registros é mostrado em uma linha, e o data grid pode ter funcionalidades de ordenação dos dados e opções para sua edição ou exclusão.
Classe Data Grid PHP
Com esta simples classe é [...]]]></description>
			<content:encoded><![CDATA[<p>Um data grid nada mais é do que a apresentação de dados em forma de tabela (lembra das &lt;table&gt;&lt;/table&gt;? Algo assim). Cada conjunto de registros é mostrado em uma linha, e o data grid pode ter funcionalidades de ordenação dos dados e opções para sua edição ou exclusão.</p>
<h4><strong>Classe Data Grid PHP</strong></h4>
<p>Com esta simples classe é possível criar um data grid a partir de um array com os dados que queremos apresentar na tabela. É simples criar e configurar e, com alguns comandos avançados, é possível alterar o seu comportamento para que seja possível implementar as necessidades habituais em uma estrutura desse tipo.</p>
<p>Essa classe foi criada com POO (Programação Orientada a Objetos) e características que estão disponíveis somente a partir do PHP5. Ela pode ser baixada <a class="ext" href="http://www.phpclasses.org/browse/package/5476.html">clicando aqui</a>.</p>
<p>Vamos começar a ver como funciona a classe utilizando um exemplo simples e inserindo funcionalidades no decorrer do artigo, para deixar nosso exemplo mais robusto.</p>
<p>Para começar é necessário inserir a classe nos scripts PHP antes de utilizá-la.</p>
<div class="codigo">
<pre><em><code><span class="com">//incluimos a classe</span><span class="pln">

</span><span class="kwd">require</span><span class="pln"> </span><span class="str">'DataGrid.php'</span><span class="pun">;</span></code></em></pre>
</div>
<p>Agora temos que criar um Array com os dados que serão apresentados no Data Grid. Será um array associativo, duas dimensões, onde a primeira, o array principal, receberá todos os registros a serem mostrados no data Grid, e na segunda estão cada um dos registros definidos como um array associativo.</p>
<p>Agora construímos o array com um algumas informações, mais adiante veremos como construir esse array através de uma consulta ao banco de dados.</p>
<div class="codigo">
<pre><em><code><span class="com">//criamos o array com os dados a serem apresentados no Data Grid</span><span class="pln">

$alunos </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Pepe Perez"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Informática básica"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">),</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"María Suarez"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Informática avançada"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">),</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Roberto Soriano"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Sistemas operacionais"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">),</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Alberto Rodriguez"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Inglés técnico"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">),</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Julia Marcos"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Sociologia"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">),</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Socorro Rozas"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Informática básica"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">),</span><span class="pln">

array</span><span class="pun">(</span><span class="str">"id"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nome"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Pablo Reñones"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"curso"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Informática básica"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"nivel"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln">

</span><span class="pun">);</span></code></em></pre>
</div>
<p>Agora, antes de continuarmos com a construção da estrutura, temos que criar alguns estilos CSS para podermos melhorar o aspecto do Data Grid</p>
<div class="codigo">
<pre><em><code><span class="pun">&lt;</span><span class="tag">style</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/css"</span><span class="pun">&gt;</span><span class="pln">

</span><span class="pun">.</span><span class="pln">linhaI</span><span class="pun">{</span><span class="pln">background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="com">#ffffcc;}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">linhaP</span><span class="pun">{</span><span class="pln">background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="com">#ffcc99;}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">fdg_sortable </span><span class="pun">{</span><span class="pln">cursor</span><span class="pun">:</span><span class="pln">pointer</span><span class="pun">;</span><span class="pln">text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln">underline</span><span class="pun">;</span><span class="pln">color</span><span class="pun">:</span><span class="com">#00c;}</span><span class="pln">

</span><span class="pun">&lt;/</span><span class="tag">style</span><span class="pun">&gt;</span></code></em></pre>
</div>
<p>Foram criadas três classes CSS, com seus respectivos estilos. As classes &#8220;linhaI&#8221; (linha ímpar) e &#8220;linhaP&#8221; (linha par) aplicaram estilo às linhas do Data Grid e a classe &#8220;fdg_sortable&#8221; é responsável por estilizar os títulos de cada coluna do Data Grid.</p>
<p>Vamos criar o data grid a partir dos dados que temos no array.</p>
<div class="codigo">
<pre><em><code><span class="com">//instanciamos o objeto data grid, passando como parâmetro o array anterior</span><span class="pln">

Fete_ViewControl_DataGrid</span><span class="pun">::</span><span class="pln">getInstance</span><span class="pun">(</span><span class="pln">$alunos</span><span class="pun">)</span><span class="pln">

</span><span class="com">//VAMOS LANÇANDO DIVERSOS MÉTODOS SOBRE O OBJETO INSTANCIADO</span><span class="pln">

</span><span class="com">//atributos gerais para a tabela</span><span class="pln">

</span><span class="pun">-&gt;</span><span class="pln">setGridAttributes</span><span class="pun">(</span><span class="pln">array</span><span class="pun">(</span><span class="str">'cellspacing'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'3?, '</span><span class="pln">cellpadding</span><span class="str">' =&gt; '</span><span class="lit">4</span><span class="pun">?,</span><span class="pln"> </span><span class="str">'border'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'0?))

//permitimos que hajam características de ordenação

-&gt;enableSorting(true)

//fazemos um setup das colunas do data grid, indicando o valor que será mostrado na primeira linha do data grid

-&gt;setup(array(

'</span><span class="pln">id</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">ID</span><span class="str">'),

'</span><span class="pln">nome</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">Nome</span><span class="str">'),

'</span><span class="pln">curso</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">Curso</span><span class="str">'),

'</span><span class="pln">nivel</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="typ">Nivel</span><span class="pln"> curso</span><span class="str">')

))

//definimos os estilos para as linhas ímpares

-&gt;setRowClass('</span><span class="pln">linhaI</span><span class="str">')

//definimos os estilos para as linhas pares

-&gt;setAlterRowClass('</span><span class="pln">linhasP</span><span class="str">')

//chamamos o método que construirá o data grid

-&gt;render();</span></code></em></pre>
</div>
<p>Todas as linhas foram comentadas para que o entendimento se torne mais simples.</p>
<p>Agora vejamos como inserir ou apagar coisas do data grid, para personalizá-lo. Faremos algumas coisas como:</p>
<ol>
<li>Vamos ocultar o &#8220;ID&#8221; do array associativo, para que não seja mostrado.</li>
<li>No campo de nível do cursos, vamos mostrar o nível com alguns asteriscos usando uma função que converterá os números em uma cadeia de asteriscos.</li>
<li>Vamos coluna no data grid, que aparecerá antes de qualquer outra, para mostrar um contador que indicará a quantidade de registros apresentados.</li>
</ol>
<p>Destas três coisas, a mais complicada é fazer um modelo para alterar a forma como é mostrado um campo. Para começar, precisaremos de uma função que devolva o dado que se quer mostrar, com o formato desejado.</p>
<div class="codigo">
<pre><em><code><span class="kwd">function</span><span class="pln"> nivel_estrelas</span><span class="pun">(</span><span class="pln">$num</span><span class="pun">){</span><span class="pln">

$estrelas </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">&lt;</span><span class="pln">$num</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++){</span><span class="pln">

$estrelas </span><span class="pun">.=</span><span class="pln"> </span><span class="str">"*"</span><span class="pun">;</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> $estrelas</span><span class="pun">;</span><span class="pln">

</span><span class="pun">}</span></code></em></pre>
</div>
<p>Utilizaremos essa função para atribuir como &#8220;template&#8221; para o campo nível de curso.</p>
<p>Vamos agora ao código utilizado para implementar todas as funcionalidades citadas no data grid:</p>
<div class="codigo">
<pre><em><code><span class="com">//OCULTAR UM CAMPO NO DATA GRID</span><span class="pln">

</span><span class="com">//COLOCAR UMA FUNÇÂO PARA MOSTRAR UM CAMPO</span><span class="pln">

</span><span class="com">//COLOCAR UM CAMPO ANTES DAS COLUNAS DO ARRAY DO DATA GRID</span><span class="pln">

Fete_ViewControl_DataGrid</span><span class="pun">::</span><span class="pln">getInstance</span><span class="pun">(</span><span class="pln">$alunos</span><span class="pun">)</span><span class="pln">

</span><span class="pun">-&gt;</span><span class="pln">setGridAttributes</span><span class="pun">(</span><span class="pln">array</span><span class="pun">(</span><span class="str">'cellspacing'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'3?, '</span><span class="pln">cellpadding</span><span class="str">' =&gt; '</span><span class="lit">4</span><span class="pun">?,</span><span class="pln"> </span><span class="str">'border'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'0?))

-&gt;enableSorting(true)

//fazemos com que o campo "id" do array associativo não seja mostrado

-&gt;removeColumn('</span><span class="pln">id</span><span class="str">')

-&gt;setup(array(

'</span><span class="pln">nome</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">Nome</span><span class="str">'),

'</span><span class="pln">curso</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">Curso</span><span class="str">'),

//utilizamos a função template para mostrar o nivel do curso com umas estrelas

'</span><span class="pln">nivel</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="typ">Nivel</span><span class="pln"> curso</span><span class="str">', '</span><span class="pln">cellTemplate</span><span class="str">' =&gt; '</span><span class="pun">[[</span><span class="pln">nivel_estrelas</span><span class="pun">:%</span><span class="pln">data</span><span class="pun">%]]</span><span class="str">')

))

//inserimos uma coluna em todos os registros do data grid(a primeira coluna será esta)

//nesta coluna mostramos um contador de registros

-&gt;addColumnBefore('</span><span class="pln">Contador</span><span class="str">', '</span><span class="pun">%</span><span class="pln">counter</span><span class="pun">%</span><span class="pln">.</span><span class="str">', '</span><span class="pln">Num</span><span class="str">', array('</span><span class="pln">align</span><span class="str">' =&gt; '</span><span class="pln">right</span><span class="str">'))

//definimos a partir de que número será iniciado o contador

-&gt;setStartingCounter(1)

-&gt;setRowClass('</span><span class="pln">linhaI</span><span class="str">')

-&gt;setAlterRowClass('</span><span class="pln">linhaP</span><span class="str">')

-&gt;render();</span></code></em></pre>
</div>
<p>Novamente as linhas foram comentadas para facilitar o entendimento. Chamo a atenção sobre a linha que faz uso da função anterior como um template para um campo.</p>
<div class="codigo">
<pre><em><code><span class="str">'nivel'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'header'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Nivel curso'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cellTemplate'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'[[nivel_estrelas:%data%]]'</span><span class="pun">)</span></code></em></pre>
</div>
<p>Isto faz com que o campo &#8220;nivel&#8221;, quando for mostrado em linhas distintas do data grid, chame a função nivel_estrelas(), passando como parâmetro %data%, que é o valor que tem cada um dos registros do array associativo, no campo &#8220;nível&#8221;.</p>
<p>Por último vamos ver outro exemplo, um pouco mais desenvolvido, para mostrar os dados do mesmo array. Neste caso vamos simplesmente mostrar uma coluna adicional ao final de cada registro do data grid, onde iremos inserir uns links para editar e/ou apagar o registro atual.</p>
<div class="codigo">
<pre><em><code><span class="com">//PARA COLOCAR UM BOTÃO PARA EDITAR OU APAGAR</span><span class="pln">
Fete_ViewControl_DataGrid</span><span class="pun">::</span><span class="pln">getInstance</span><span class="pun">(</span><span class="pln">$alunos</span><span class="pun">)</span><span class="pln">
</span><span class="pun">-&gt;</span><span class="pln">setGridAttributes</span><span class="pun">(</span><span class="pln">array</span><span class="pun">(</span><span class="str">'cellspacing'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'3?, '</span><span class="pln">cellpadding</span><span class="str">' =&gt; '</span><span class="lit">4</span><span class="pun">?,</span><span class="pln"> </span><span class="str">'border'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'0?))
-&gt;enableSorting(true)
-&gt;removeColumn('</span><span class="pln">id</span><span class="str">')
-&gt;setup(array(
'</span><span class="pln">nome</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">Nome</span><span class="str">'),
'</span><span class="pln">curso</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="pln">Curso</span><span class="str">'),
'</span><span class="pln">nivel</span><span class="str">' =&gt; array('</span><span class="pln">header</span><span class="str">' =&gt; '</span><span class="typ">Nivel</span><span class="pln"> curso</span><span class="str">', '</span><span class="pln">cellTemplate</span><span class="str">' =&gt; '</span><span class="pun">[[</span><span class="pln">nivel_estrelas</span><span class="pun">:%</span><span class="pln">data</span><span class="pun">%]]</span><span class="str">')
))
-&gt;addColumnBefore('</span><span class="pln">Contador</span><span class="str">', '</span><span class="pun">%</span><span class="pln">counter</span><span class="pun">%</span><span class="pln">.</span><span class="str">', '</span><span class="pln">Num</span><span class="str">', array('</span><span class="pln">align</span><span class="str">' =&gt; '</span><span class="pln">right</span><span class="str">'))
//agora mostro um campo depois de cada elelemto, com links para editar ou apagar o registro
//no interior deste campo utilizo $id$ para enviar o valor "id" do array
-&gt;addColumnAfter('</span><span class="pln">actions</span><span class="str">', '</span><span class="pun">&lt;</span><span class="pln">a href</span><span class="pun">=</span><span class="str">"exemplo3.php?editar=$id$"</span><span class="pun">&gt;</span><span class="typ">Editar</span><span class="pun">&lt;</span><span class="str">/a&gt; ?
&lt;a href="exemplo3.php?apagar=$id$" onclick="return confirm('Está certo que quer apagar $nome$?')"&gt;Apagar&lt;/</span><span class="pln">a</span><span class="pun">&gt;</span><span class="str">', '</span><span class="pln">Actions</span><span class="str">', array('</span><span class="pln">align</span><span class="str">' =&gt; '</span><span class="pln">center</span><span class="str">'))
-&gt;setStartingCounter(1)
-&gt;setRowClass('</span><span class="pln">linhaI</span><span class="str">')
-&gt;setAlterRowClass('</span><span class="pln">linhaP</span><span class="str">')
-&gt;render();</span></code></em></pre>
</div>
<p>Neste exemplo apenas inserimos uma linha de código para fazer uma chamada ao método addColumnAfter(), que serve para inserir uma coluna depois das colunas que formamos com o array.</p>
<div class="codigo">
<pre><em><code><span class="pun">-&gt;</span><span class="pln">addColumnAfter</span><span class="pun">(</span><span class="str">'actions'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'&lt;a href="exemplo3.php?editar=$id$"&gt;Editar&lt;/a&gt; ? &lt;a
href="exemplo3.php?apagar=$id$" onclick="return confirm('</span><span class="typ">Est</span><span class="pun">á</span><span class="pln"> certo que
quer apagar $nome$</span><span class="pun">?</span><span class="str">')"&gt;Apagar&lt;/a&gt;'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Actions'</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'align'</span><span class="pln">
</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'center'</span><span class="pun">))</span></code></em></pre>
</div>
<p>Neste caso simplesmente temos que indicar como parâmetro a addColumnAfter() dois dados: o primeiro para especificar um título para a coluna e o segundo para especificar o seu conteúdo. O conteúdo dessa coluna, neste caso, são os links para editar e apagar, onde são utilizadas urls que enviam os dados por GET, que é o identificador do registro.</p>
<h4><strong>Montando o data grid a partir de um banco de dados</strong></h4>
<p>Só falta agora falar sobre como extrair os dados de uma base de dados para fazer o array de elementos que será utilizado na montagem do data grid.</p>
<p>No exemplo que acompanha a classe data_grid há um código para extrair a informação do MySQL, como pode ser visto nas linhas abaixo.</p>
<div class="codigo">
<pre><em><code><span class="pln">$users </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

$result </span><span class="pun">=</span><span class="pln"> mysql_query</span><span class="pun">(</span><span class="str">"SELECT * FROM user"</span><span class="pun">,</span><span class="pln"> $dbLinkId</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$row </span><span class="pun">=</span><span class="pln"> mysql_fetch_assoc</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">))</span><span class="pln">

</span><span class="pun">{</span><span class="pln">

$users</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $row</span><span class="pun">;</span><span class="pln">

</span><span class="pun">}</span></code></em></pre>
</div>
<p>Como se pode ver, primeiro se cria um array e logo se faz um looping pelos resultados da consulta. Cada um dos elementos retornados pela consulta será introduzido no array criado anteriormente e para ele assinalamos o array associativo que nos devolverá mysql_fetch_assoc() desse primeiro array.</p>
<p>Bom, pessoal, espero que esse artigo possa ser útil a vocês. Clique abaixo para poder fazer o download da classe e de um exemplo.<br />
<strong><br />
<a href="http://www.jlamim.com.br/downloads/php_datagrid.zip">Clique aqui para baixar a classe data grid junto com um exemplo</a></strong></p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/13951/php/criando_um_data_grid_com_poo_e_php5/" target="_blank">Imasters</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/criando-um-data-grid-com-poo-e-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frameworks no PHP: O que, quando, por que e qual?</title>
		<link>http://www.debugando.com/frameworks-no-php-o-que-quando-por-que-e-qual/</link>
		<comments>http://www.debugando.com/frameworks-no-php-o-que-quando-por-que-e-qual/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 20:45:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Codelgniter]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=637</guid>
		<description><![CDATA[
PHP é a linguagem de programação mais famosa do mundo por várias razões: flexibilidade, facilidade de uso e vários outros fatores. Mas algumas vezes a programação se torna monótona e/ou repetitiva, e é aí que um framework pode ajudar.
O que é um framework de PHP?
De forma resumida o framework é uma estrutura, uma fundação para [...]]]></description>
			<content:encoded><![CDATA[<div id="strConteudo">
<p>PHP é a linguagem de programação mais famosa do mundo por várias razões: flexibilidade, facilidade de uso e vários outros fatores. Mas algumas vezes a programação se torna monótona e/ou repetitiva, e é aí que um <strong>framework</strong> pode ajudar.</p>
<h4>O que é um <em>framework</em> de PHP?</h4>
<p>De forma resumida o framework é uma estrutura, uma fundação para você criar a sua aplicação. Em outras palavras o framework te permite o desenvolvimento rápido de aplicações (RAD), o que faz economizar tempo, ajuda a criar aplicações mais sólidas e seguras além de reduzir a quantidade de código repetido. Os frameworks também permitem que os iniciantes criem aplicações mais estáveis garantindo uma boa relação entre o banco de dados e a camada externa de exibição. Isso tudo te permite gastar mais tempo desenvolvendo a aplicação em si do que repetindo os códigos que todas as aplicações têm.</p>
<p>A idéia padrão de trabalho por trás de um framework no PHP está ligada ao modelo MVC (Model View Controller). MVC é uma forma de programação que isola a <strong>lógica de negócio</strong> (como a aplicação funciona) da <strong>camada de exibição</strong> (a parte visual). O <strong>Model</strong> cuida do banco de dados, o <strong>View</strong> cuida da camada de exibição e o <strong>Controller</strong> cuida da lógica de negócio. Isso tudo faz com que você trabalhe mais rápido e de forma setorizada.</p>
<h4>Por que usar um <em>framework</em> de PHP?</h4>
<p>Os desenvolvedores utilizam frameworks por vários motivos, e o maior deles é para agilizar o processo de desenvolvimento. A re-utilização de código em vários projetos vai economizar muito tempo e trabalho? Isso é garantido, pois o framework já traz uma série de módulos pré-configurados (e funcionando) para fazer as mais variadas e comuns tarefas como envio de e-mails, conexão com o banco de dados, sanitização (limpeza) de dados e proteção contra ataques.</p>
<p>Estabilidade é outra grande vantagem dos frameworks. A simplicidade, que é um dos grandes &#8220;feitos&#8221; do PHP, também é o que possibilita inúmeros erros e falhas pelos principiantes? Nem todo código que funciona necessariamente está correto e bem desenvolvido.</p>
<h4>Quando usar um <em>framework</em> de PHP?</h4>
<p>Essa é uma dúvida muito comum em todos os níveis de desenvolvimento. Para a maioria dos iniciantes, usar um framework, além de ser mais fácil, vai ser mais estável, então é bom usá-los sempre que possível.</p>
<p>Em contrapartida vários programadores experientes vêem os frameworks como ferramentas usadas por programadores fracos, que não sabem como criar um código limpo, sólido e seguro.</p>
<p>Quando se trabalha com projetos que têm um prazo muito curto (o que eu chamo de &#8220;prazo Jack Bauer&#8221;) é sempre bom usar um framework, pois ele vai agilizar todo o processo. Outro motivo forte para o uso do framework é que você não está criando &#8220;código artesanal&#8221;? Há todo um padrão que você deve seguir para que as coisas funcionem, e está tudo documentado e explicado em uma vasta comunidade de suporte.</p>
<h3>CakePHP</h3>
<p>O <a href="http://www.cakephp.com.br/">CakePHP</a> é uma grande opção para iniciantes e desenvolvedores avançados. Ele foi criado usando as bases e modelos do Ruby on Rails e é pesadamente focado no desenvolvimento ágil e rápido. Recentemente ele tem se tornado muito famoso por sua simplicidade e facilidade de uso.</p>
<p>Eu <strong>pessoalmente</strong> recomendo o CakePHP. Minha vida de programador mudou depois que eu comecei a usar ele.</p>
<h4>Zend Framework</h4>
<p>O <a class="ext" href="http://framework.zend.com/">Zend Framework</a> é um framework focado no desenvolvimento de aplicações pra web 2.0. Ele tem um grande número de seguidores, fontes de suporte e uma comunidade cheia de usuários ativos e participativos. O Zend é o framework mais famoso hoje em dia, ele é robusto e permite a criação de aplicações <em>enterprise</em> (de grande porte) mas seu uso exige um conhecimento vasto do PHP.</p>
<h4>CodeIgniter</h4>
<p>Já o <a class="ext" href="http://codeigniter.com/">CodeIgniter</a> é bastante conhecido pela sua facilidade de uso, performance e rapidez. É ideal para aplicações rodando em servidores compartilhados. Ele oferece soluções simples e de pequeno porte, com um grande número de tutoriais em vídeo, fóruns e wikis.</p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/13718/php/frameworks_no_php_o_que_quando_por_que_e_qual/" target="_blank">Imasters</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/frameworks-no-php-o-que-quando-por-que-e-qual/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conectando C# ao MySQL</title>
		<link>http://www.debugando.com/conectando-c-ao-mysql/</link>
		<comments>http://www.debugando.com/conectando-c-ao-mysql/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 20:42:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=635</guid>
		<description><![CDATA[Quem está habituado a programar C# normalmente utiliza SQL Server como banco de dados, uma vez que ela está integrada no Visual Studio e, por isso mesmo, existe grande facilidade em trabalhar com as duas ferramentas.
Por vezes existem projetos em que se torna conveniente (por várias razões) utilizar outro tipo de base de dados. Seja [...]]]></description>
			<content:encoded><![CDATA[<p>Quem está habituado a programar C# normalmente utiliza SQL Server como banco de dados, uma vez que ela está integrada no Visual Studio e, por isso mesmo, existe grande facilidade em trabalhar com as duas ferramentas.</p>
<p>Por vezes existem projetos em que se torna conveniente (por várias razões) utilizar outro tipo de base de dados. Seja que banco de dados for, a sua integração é sempre diferente do SQL Server.</p>
<p>Neste caso vou mostrar como fazer a integração entre o C# e o MySQL.</p>
<p>Supondo que já existe uma instalação do MySQL na máquina, precisamos instalar um intermediário entre o C# e a base de dados. Neste caso necessitamos instalar o MySQL Connector NET.</p>
<p><a class="ext" href="http://dev.mysql.com/downloads/connector/net/6.0.html">Download</a></p>
<p>A <a class="ext" href="http://dev.mysql.com/downloadshttp://dev.mysql.com/downloads/connector/net/5.2.html">versão 5.2</a> já tem suporte ao Visual Studio 2008, mas eu vou utilizar a última versão (6.0).</p>
<p>Instalamos o Connector Net 6.0.</p>
<p>Devemos já ter uma base de dados com uma tabela (users por exemplo), em que os campos da tabela são: id, nome, email.</p>
<p>Como exemplo criamos um projecto Windows Forms Application.</p>
<p>Antes de mais nada, devemos fazer uma referência à classe que vai ligar o C# ao MySQL. Para isso vamos ao painel Solution Explorer, na raiz do projeto, clicamos com o lado direito do mouse e selecionamos Add Reference.</p>
<p><img src="http://conteudo.imasters.uol.com.br/13681/mysqlcsharp1.gif" alt="" /></p>
<p>Na primeira divisória (.NET) selecionamos a referência MySQL.Data e damos OK.</p>
<p>Não esquecer: incluir no início do código as classes:</p>
<p><em>using  System.Data; </em></p>
<p><em>using MySql.Data.MySqlClient;</em></p>
<p>Sem adicionar a referência à MySQL.Data, a classe MySql.Data.MySqlClient não será reconhecida.</p>
<p>Para exemplificar fazemos um formulário de inserção de dados (nome e e-mail) na base de dados.</p>
<p>No form colocamos duas caixas de texto, uma para o nome (txtNome) e outra para o e-mail (txtMail) e um botão que terá a ação de inserir os dados na base de dados.</p>
<p><img src="http://conteudo.imasters.uol.com.br/13681/mysqlcsharp2.gif" alt="" /></p>
<p>Vamos então definir, em primeiro lugar, o dataset e a string de conexão à base de dados.</p>
<div class="codigo">
<pre><em><code><span class="kwd">private</span><span class="pln"> </span><span class="typ">MySqlConnection</span><span class="pln"> bdConn</span><span class="pun">;</span><span class="pln"> </span><span class="com">//MySQL</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">MySqlDataAdapter</span><span class="pln"> bdAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">DataSet</span><span class="pln"> bdDataSet</span><span class="pun">;</span><span class="pln"> </span><span class="com">//MySQL</span></code></em></pre>
</div>
<p><em>Na ação do botão:</em></p>
<div class="codigo">
<pre><em><code><span class="com">//Definição do dataset</span><span class="pln">
bdDataSet </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DataSet</span><span class="pun">();</span><span class="pln">
 </span><span class="com">//Define string de conexão</span><span class="pln">
bdConn </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MySqlConnection</span><span class="pun">(</span><span class="str">"Persist Security  Info=False;server=localhost;database=rfidapp;uid=root;server=localhost;database=rfidapp;uid=root;pwd=''"</span><span class="pun">);</span></code></em></pre>
</div>
<p><em>Neste caso a base de dados não tem password.</em></p>
<div class="codigo">
<pre><em><code><span class="com">//Abre conecção</span><span class="pln">
 </span><span class="kwd">try</span><span class="pun">{</span><span class="pln">
        bdConn</span><span class="pun">.</span><span class="typ">Open</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">catch</span><span class="pun">{</span><span class="pln">
 </span><span class="typ">MessageBox</span><span class="pun">.</span><span class="typ">Show</span><span class="pun">(</span><span class="str">"Impossível estabelecer conexão"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">//Verifica se a conexão está aberta</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bdConn</span><span class="pun">.</span><span class="typ">State</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">ConnectionState</span><span class="pun">.</span><span class="typ">Open</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
        </span><span class="com">//Se estiver aberta insere os dados na BD</span><span class="pln">
</span><span class="typ">MySqlCommand</span><span class="pln"> commS </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MySqlCommand</span><span class="pun">(</span><span class="str">"INSERT INTO regists VALUES('',\\'"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> txtNome </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\\',\\'"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> txtMail </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\\')"</span><span class="pun">,</span><span class="pln"> bdConn</span><span class="pun">);</span><span class="pln">
commS</span><span class="pun">.</span><span class="typ">BeginExecuteNonQuery</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></code></em></pre>
</div>
<p>Tome atenção na sintaxe do SQL para o MySQL (INSERT) que é um pouco diferente do C#/SQL Server.</p>
<p>Neste momento o formulário deverá  inserir dados no BD.</p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/13681/mysql/conectando_c_ao_mysql/" target="_blank">Imasters</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/conectando-c-ao-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O que é o Google Wave?</title>
		<link>http://www.debugando.com/o-que-e-o-google-wave/</link>
		<comments>http://www.debugando.com/o-que-e-o-google-wave/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 17:16:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Google API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Wave]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=615</guid>
		<description><![CDATA[O que é o Google Wave?
O Google anunciou, na sexta passada, uma ideia nova e experimental para modificar o futuro da comunicação na Web. O nome é Wave (&#8220;Onda&#8221;) e, se você acreditar no seu desenvolvedor, é &#8220;o que o email seria se fosse inventado hoje&#8221;. Além disso, vai ser totalmente open source. Já está [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://conteudo.imasters.uol.com.br/13008/google-wave.jpg" alt="" /><a href="http://meu.imasters.uol.com.br/autor/publicacao/beta/editor/13008/">O que é o Google Wave?</a></p>
<p>O Google anunciou, na sexta passada, uma ideia nova e experimental para modificar o futuro da comunicação na Web. O nome é Wave (&#8220;Onda&#8221;) e, se você acreditar no seu desenvolvedor, é &#8220;o que o email seria se fosse inventado hoje&#8221;. Além disso, vai ser totalmente open source. Já está intrigado?</p>
<p>Primariamente, o Wave tem como objetivo melhorar a comunicação em tempo real na web. <a class="ext" href="http://www.youtube.com/watch?v=v_UyVmITiYQ">Aqui tem um vídeo</a> de quase hora e meia com a apresentação completa aos desenvolvedores na conferência <strong>Google I/O</strong>, mas se você não quiser ou não tiver tempo de ver, fique com os detalhes diretamente da boca do Google:</p>
<blockquote><p><strong>O QUE É UMA WAVE?<br />
</strong></p>
<p><strong>Uma wave é conversação e documento em partes iguais.</strong> As pessoas podem se comunicar e trabalharem juntos com texto formatado, imagens, vídeos, mapas e mais.</p>
<p><strong>Uma wave é compartilhada.</strong> Qualquer participante pode responder em qualquer ponto da mensagem, editar o seu conteúdo e adicionar participantes em qualquer ponto do processo. A função Playback permite que qualquer um retroceda a Wave passo a passo desde o início, para ver quem disse o quê e quando.</p>
<p><strong>Uma wave é viva.</strong> Com a transmissão instantânea à medida que você digita, os participantes de uma wave podem ter conversações mais rápidas, ver edições e interagir com extensões em tempo real.</p></blockquote>
<p><img src="http://conteudo.imasters.uol.com.br/13008/wave-2.jpg" alt="" /></p>
<p>Bastante amplo, né? O Google Wave é claramente algo que precisaremos ver em ação, usar mesmo, antes de entender completamente como funciona. Da mesma forma que o email, o Wave foi desenvolvido como um padrão que poderá ser rodado a partir de qualquer servidor, então ele não vai pertencer ao Google. Qualquer um vai poder ter o seu próprio Wave, e este Wave pode competir com o do Google ou se comportar como o dono quiser. Mas, sendo criado sobre um protocolo padrão, Waves diferentes podem entender e se comunicar entre si, da mesma forma que o Outlook pode trocar emails normalmente com um Thunderbird, GMail ou Yahoo Mail.</p>
<p>Isso resolve um problema que eu (e muitos outros bem mais inteligentes que eu) <a class="ext" href="https://twitter.com/adampash/status/1779737011">sempre tive</a> com o Twitter: ele vive nos servidores de uma empresa, e a sua informação está suscetível ao que quer que a empresa queira fazer com ela. RSS, email e mensagens instantâneas trabalham com protocolos padrões que podem ser utilizados por qualquer um. É o exemplo dos emails que eu dei acima.</p>
<p>O blog TechCrunch fez uma análise bem detalhada do Wave (link lá no fim, em inglês) e dos rumos que o Google tomou com ele até agora. O Wave ainda é incrivelmente novo e pouco desenvolvido, mas também é muito intrigante sob o ponto de vista do Futuro-da-Internet e coisa assim. Pode não dar em nada, mas considerando as <a class="ext" href="http://search.twitter.com/search?q=%22Google+Wave%22">reações que teve</a> e a popularidade de serviços como o Twitter e o Facebook, a ideia de um protocolo que transforma uma comunicação deste tipo em padrão aberto soa muito promissora.</p>
<p>O Wave não está disponível de nenhuma forma para mim e para você por enquanto, e muito da tecnologia por trás dele depende das atualizações do HTML 5, que não estarão disponíveis pelo menos por mais um pouco de tempo, mas no site oficial você pode se inscrever para atualizações do Google Wave se estiver ansioso por toda e qualquer novidade do desenvolvimento. (N.T.: Eu mais do que certamente estou.)</p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/13008/midiasocial/o_que_e_o_google_wave/" target="_blank">Imasters</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/o-que-e-o-google-wave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulação de dados BLOB com PHP e MySQL</title>
		<link>http://www.debugando.com/manipulacao-de-dados-blob-com-php-e-mysql/</link>
		<comments>http://www.debugando.com/manipulacao-de-dados-blob-com-php-e-mysql/#comments</comments>
		<pubDate>Thu, 14 May 2009 14:41:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=597</guid>
		<description><![CDATA[
Sem dúvida alguma, uma das perguntas mais frequentes em relação ao MySQL é: &#8220;como posso armazenar arquivos em uma base de dados?&#8221;. A resposta é: tens que usar o tipo de dados BLOB. Estes BLOBs (Binary Large Objects) podem armazenar praticamente qualquer tipo de dados, incluindo documentos do MS Word, imagens gif/jpeg, arquivos PDF,  [...]]]></description>
			<content:encoded><![CDATA[<div id="strConteudo">
<p>Sem dúvida alguma, uma das perguntas mais frequentes em relação ao MySQL é: &#8220;como posso armazenar arquivos em uma base de dados?&#8221;. A resposta é: tens que usar o tipo de dados BLOB. Estes BLOBs (Binary Large Objects) podem armazenar praticamente qualquer tipo de dados, incluindo documentos do MS Word, imagens gif/jpeg, arquivos PDF,  mp3, etc.</p>
<p>Neste artigo vamos ver como criar um repositório de arquivos binários usando PHP e MySQL para poder armazenar diferentes tipos de arquivos. Veremos como armazenar cada um dos arquivos em uma base de dados, para posteriormente recuperá-los.</p>
<p>Para testar os exemplos deste artigo, é necessário ter acesso a um servidor com suporte a PHP, além de contar com um servidor MySQL. Assumindo que você conte com os privilégios apropriados para criar a base dados, e que o MySQL está rodando no mesmo servidor que o PHP, vamos iniciar o desenvolvimento.</p>
<h4><strong>Criando a base de dados</strong></h4>
<p>Nosso repositório de documentos usará uma base dados que contenha unicamente uma tabela para armazenar todos os documentos. O banco de dados será chamado de &#8220;<strong>repositorio</strong>&#8220;, e a tabela de &#8220;<strong>arquivos</strong>&#8220;.</p>
<p><strong>Código SQL para criar a tabela</strong></p>
<div class="codigo">
<pre><em><code><span class="pln">CREATE TABLE arquivos</span><span class="pun">(</span><span class="pln">
id </span><span class="kwd">int</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> auto_increment primary key</span><span class="pun">,</span><span class="pln">
nome varchar</span><span class="pun">(</span><span class="lit">50</span><span class="pun">),</span><span class="pln">
titulo varchar</span><span class="pun">(</span><span class="lit">50</span><span class="pun">),</span><span class="pln">
conteudo mediumblob</span><span class="pun">,</span><span class="pln">
tipo varchar</span><span class="pun">(</span><span class="lit">50</span><span class="pun">));</span></code></em></pre>
</div>
<p>Agora temos uma base chamada <strong>repositorio</strong>, que contém uma tabela chamada <strong>arquivos</strong>.</p>
<p>Veja abaixo informações sobre cada campo da tabela arquivos:</p>
<ul>
<li><strong>id -</strong> um número inteiro que nos proporcionará um identificador único para cada arquivo que iremos armazenar. Este será incrementado automaticamente cada vez que for inserido um novo registro.</li>
<li><strong>nome -</strong> o nome original do arquivo, por exemplo, fot.gif, curriculum.doc, etc.</li>
<li><strong>titulo -</strong> uma breve descrição de cada arquivo que será gravada na tabela, por exemplo &#8220;Carta para minha noiva&#8221;, ou &#8220;A foto do meu irmão&#8221;. Este título será usado posteriormente na visualização dos arquivos do repositório em uma página web.</li>
<li><strong>conteudo</strong> &#8211; um campo do tipo binário (blob) para guardar o conteúdo de cada arquivo. Na nossa tabela usamos um tipo mediumblob, o qual pode armazenar arquivos de até 16Mb.<strong><br />
</strong></li>
<li><strong>ipo</strong> &#8211; como veremos mais adiante, cada arquivo (seja um .doc, .gif, .pdf, etc) tem um tipo único. Quando se envia um<br />
arquivo para o servidor web através de uma página web, o navegar envia ao servidor a informação acerca do tipo de arquivo, o tipo de conteúdo do arquivo, etc. Os tipos de conteúdo são simples cadeias. O tipo de conteúdo para um arquivo MS WORD é &#8220;application/msword&#8221;, o tipo de conteúdo para uma imagem é &#8220;image/gif&#8221;, etc.</li>
</ul>
<h4><strong>Agregando arquivos à base de dados</strong></h4>
<p>Agora que temos a base de dados do nosso repositório e sabemos a finalidade de cada campo, vamos criar uma simples página web que permita selecionar um arquivo desde o navegador para posteriormente enviá-lo para um script em PHP que ficará encarregado de armazená-lo em nossa base de dados.A página web será nomeada <strong>escolher_arquivo.html</strong> e o script em PHP será chamado de <strong>guardar_arquivo.php</strong>.</p>
<p>A página web pode conter todo o código HTML que se deseje, mas é necessário que se inclua o seguinte formulário para que se tenha a opção de escolher um arquivo e enviá-lo ao servidor.</p>
<div class="codigo">
<pre><em><code><span class="com">&lt;!-- ...código anterior --&gt;</span><span class="pln">
</span><span class="pun">&lt;</span><span class="tag">form</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">"multipart/form-data"</span><span class="pln"> </span><span class="atn">action</span><span class="pun">=</span><span class="atv">"guardar_arquivo.php"</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"post"</span><span class="pun">&gt;</span><span class="pln">
Descrição </span><span class="pun">&lt;</span><span class="tag">input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"titulo"</span><span class="pln"> </span><span class="atn">size</span><span class="pun">=</span><span class="atv">"30"</span><span class="pun">&gt;</span><span class="pln">
Arquivo </span><span class="pun">&lt;</span><span class="tag">input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"arquivo"</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;</span><span class="tag">input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Enviar arquivo"</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="tag">form</span><span class="pun">&gt;</span><span class="pln">
</span><span class="com">&lt;!-- ...código posterior --&gt;</span></code></em></pre>
</div>
<p>Do código que escrevemos temos que frisar o seguinte:</p>
<ul>
<li>o formulário necessita de um atributo enctype com um valor multipart/form-data</li>
<li>o método de envio tem que ser POST</li>
<li>tem que ser usado pelo menos um campo do tipo FILE</li>
</ul>
<p>Estes são os três requerimentos básicos que a página HTML deve cumprir para que seja possível enviar o arquivo para o servidor.</p>
<p>Antes de escrever o código do script guarda_arquivo.php, vamos comentar algo acerca da forma como serão recebidos os dados do arquivo em questão.</p>
<p>Desde a versão 4.1 do PHP é recomendada a utilização da variável <strong>$_FILES</strong> para a leitura dos dados do arquivo que está sendo enviado ao servidor. Abaixo estão listadas os índices e parâmetros recebidos pela variável. Note que o nome dos índices depende de como é nomeado o campo do tipo FILE no formulário.<br />
<strong><br />
$_FILES['arquivo']['name']</strong><br />
Nome original do arquivo<strong><br />
$_FILES['arquivo']['type']</strong><br />
O tipo MIME do arquivo, &#8230; image/gif, application/pdf, application/msword,.. etc<br />
<strong>$_FILES['arquivo']['size']</strong><br />
O tamanho do arquivo em bytes<strong><br />
$_FILES['arquivo']['tmp_name']</strong></p>
<p>O local do arquivo temporário que se cria quando o arquivo é enviado ao servidor. É nesta variável que são lidos todos os dados do arquivo em si. Se estes dados não são copiados ou movidos para outro lugar, ou em nosso caso, armazenados em uma base de dados, podem ser perdidos, já que o PHP elimina esses arquivos depois de um determinado tempo.</p>
<p>Por exemplo, estes são os possíveis valores para um arquivo j-odbc.zip que foi enviado ao servidor:</p>
<div class="codigo">
<pre><em><code><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> j</span><span class="pun">-</span><span class="pln">jdbc</span><span class="pun">.</span><span class="pln">zip
$_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="pln">type</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> application</span><span class="pun">/</span><span class="pln">zip
$_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="pln">tmp_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">/tmp/</span><span class="pln">phpvXQpqP
$_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="pln">size</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">337945</span></code></em></pre>
</div>
<p>Vale ressaltar que devem ser revistos e, se necessário modificar as seguintes variáveis no arquivo de configuração do PHP para que você possa fazer o upload dos arquivos para o servidor, e pode ser gerida por um script PHP.</p>
<ul>
<li><strong>file_uploads</strong> &#8211; diz ao PHP se pode ou não ser feito o envio de arquivos para o servidor. Essa variável deve ter o valor  &#8220;On&#8221;.</li>
<li><strong>upload_max_filesize</strong> &#8211; diz ao PHP qual o tamanho máximo do arquivo que pode ser enviado ao servidor. Pode ser utilizado o sufixo &#8220;M&#8221; para indicar o valor em Megabytes, por exemplo, com um valor 2M se aceita um arquivo máximo de 2 Megabytes.</li>
<li><strong>upload_tmp_dir</strong> &#8211; é o diretório para onde será copiado temporariamente o conteúdo do arquivo quando for enviado ao<br />
servidor.</li>
</ul>
<p>Agora é o momento de mostrar o código PHP que vai armazenar o arquivo em nossa base de dados.</p>
<p><strong> <em>/* guardar_arquivo.php */</em></strong></p>
<div class="codigo">
<pre><em><code><span class="kwd">require</span><span class="pun">(</span><span class="str">"dbconnect.inc.php"</span><span class="pun">);</span><span class="pln">

 $arquiivo </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="str">"tmp_name"</span><span class="pun">];</span><span class="pln">
 $tamanho </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="str">"size"</span><span class="pun">];</span><span class="pln">
 $tipo    </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="str">"type"</span><span class="pun">];</span><span class="pln">
 $nome  </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"arquivo"</span><span class="pun">][</span><span class="str">"name"</span><span class="pun">];</span><span class="pln">
 $titulo  </span><span class="pun">=</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">"titulo"</span><span class="pun">];</span><span class="pln">

 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $arquivo </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"none"</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
 </span><span class="pun">{</span><span class="pln">
 $fp </span><span class="pun">=</span><span class="pln"> fopen</span><span class="pun">(</span><span class="pln">$arquivo</span><span class="pun">,</span><span class="pln"> </span><span class="str">"rb"</span><span class="pun">);</span><span class="pln">
 $conteudo </span><span class="pun">=</span><span class="pln"> fread</span><span class="pun">(</span><span class="pln">$fp</span><span class="pun">,</span><span class="pln"> $tamanho</span><span class="pun">);</span><span class="pln">
 $conteudo </span><span class="pun">=</span><span class="pln"> addslashes</span><span class="pun">(</span><span class="pln">$conteudo</span><span class="pun">);</span><span class="pln">
 fclose</span><span class="pun">(</span><span class="pln">$fp</span><span class="pun">);</span><span class="pln"> 

 $qry </span><span class="pun">=</span><span class="pln"> </span><span class="str">"INSERT INTO arquivos VALUES
 (0,'$nome','$titulo','$conteudo','$tipo')"</span><span class="pun">;</span><span class="pln">

 mysql_query</span><span class="pun">(</span><span class="pln">$qry</span><span class="pun">);</span><span class="pln">

 </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">mysql_affected_rows</span><span class="pun">(</span><span class="pln">$conn</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
 </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"O arquivo foi gravado na base de dados."</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">else</span><span class="pln">
 </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Não foi possível gravar o arquivo na base de dados."</span><span class="pun">;</span><span class="pln">
 </span><span class="pun">}</span><span class="pln">
 </span><span class="kwd">else</span><span class="pln">
 </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Não foi possível carregar o arquivo para o servidor."</span><span class="pun">;</span></code></em></pre>
</div>
<p>O arquivo <strong>dbconnetc.inc.php</strong> contém unicamente as instruções para conexão ao MySQL e selecionar a base de dados que será utilizada.<strong><br />
</strong></p>
<p><em><strong>/* dbconnect.inc.php */</strong></em></p>
<div class="codigo">
<pre><em><code><span class="pln">$conn </span><span class="pun">=</span><span class="pln"> mysql_connect</span><span class="pun">(</span><span class="str">"localhost"</span><span class="pun">,</span><span class="str">"usuário"</span><span class="pun">,</span><span class="str">"senha"</span><span class="pun">);</span><span class="pln">
 mysql_select_db</span><span class="pun">(</span><span class="str">"repositorio"</span><span class="pun">);</span><strong><span class="pln">
</span></strong></code></em></pre>
</div>
<h4><strong>Listando os arquivos da base de dados</strong></h4>
<p>Já que gravamos alguns arquivos no nosso repositório, agora podemos listar as informações deles, para posteriomente fazermos o download.</p>
<p><em><strong>/* listar_arquivos.php */</strong></em></p>
<div class="codigo">
<pre><em><code><span class="kwd">require</span><span class="pun">(</span><span class="str">"dbconnect.inc.php"</span><span class="pun">);</span><span class="pln">

$qry </span><span class="pun">=</span><span class="pln"> </span><span class="str">"SELECT id, nome, titulo, tipo FROM arquivos"</span><span class="pun">;</span><span class="pln">
$res </span><span class="pun">=</span><span class="pln"> mysql_query</span><span class="pun">(</span><span class="pln">$qry</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">while</span><span class="pun">(</span><span class="pln">$fila </span><span class="pun">=</span><span class="pln"> mysql_fetch_array</span><span class="pun">(</span><span class="pln">$res</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="str">"$fila[titulo]
&lt;br&gt;
$fila[nome] ($fila[tipo])
&lt;br&gt;
&lt;a href='baixar_arquivo.php?id=$fila[id]'&gt;Fazer Download&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><strong><span class="pln">
</span></strong></code></em></pre>
</div>
<h4><strong>Fazendo o download dos arquivos da base de dados</strong></h4>
<p>Como se pode observar no código anterior, foi colocado um link para cada arquivo, chamado baixar_arquivo.php. A funcionalidade deste script será ler os dados dos arquivos que estão gravados na base de dados e enviá-los ao navegador.</p>
<p>Dependendo do tipo de arquivo da qual se trate, o navegador poderá mostrá-lo por ele mesmo o conteúdo do arquivo.</p>
<p><strong> <em>/* Script baixar_arquivo.php */</em></strong></p>
<div class="codigo">
<pre><em><code><span class="kwd">require</span><span class="pun">(</span><span class="str">"dbconnect.inc.php"</span><span class="pun">);</span><span class="pln">

 $qry </span><span class="pun">=</span><span class="pln"> </span><span class="str">"SELECT tipo, conteudo FROM arquivos WHERE id=$id"</span><span class="pun">;</span><span class="pln">
 $res </span><span class="pun">=</span><span class="pln"> mysql_query</span><span class="pun">(</span><span class="pln">$qry</span><span class="pun">);</span><span class="pln">
 $tipo </span><span class="pun">=</span><span class="pln"> mysql_result</span><span class="pun">(</span><span class="pln">$res</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"tipo"</span><span class="pun">);</span><span class="pln">
 $conteudo </span><span class="pun">=</span><span class="pln"> mysql_result</span><span class="pun">(</span><span class="pln">$res</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"conteudo"</span><span class="pun">);</span><span class="pln">

 header</span><span class="pun">(</span><span class="str">"Content-type: $tipo"</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">print</span><span class="pln"> $conteudo</span><span class="pun">;</span></code></em></pre>
</div>
<h4><strong>Comentário Finais</strong></h4>
<p>Como se pode observar, o código PHP dos scripts é bem simples, e não tem nenhum grau de dificuldade. O código foi desenvolvido com o propósito mais simples possível, para que possa ser melhorado e utilizado em aplicações mais robustas.</p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/12775/php/manipulacao_de_dados_blob_com_php_e_mysql/" target="_blank">Imasters</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/manipulacao-de-dados-blob-com-php-e-mysql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google Earth no meu site</title>
		<link>http://www.debugando.com/google-earth-no-meu-site/</link>
		<comments>http://www.debugando.com/google-earth-no-meu-site/#comments</comments>
		<pubDate>Thu, 07 May 2009 16:46:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Google API]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=587</guid>
		<description><![CDATA[O que o Google diz sobre isto?
O plug-in do Google Earth e a API JavaScript permitem incorporar o Google Earth, um verdadeiro globo digital em 3D, nas suas páginas da web. Usando a API, você pode desenhar marcadores e linhas, dispor imagens sobre a área, adicionar modelos em 3D ou carregar arquivos KML, permitindo criar [...]]]></description>
			<content:encoded><![CDATA[<h4><strong>O que o Google diz sobre isto?</strong></h4>
<p>O plug-in do Google Earth e a API JavaScript permitem incorporar o Google Earth, um verdadeiro globo digital em 3D, nas suas páginas da web. Usando a API, você pode desenhar marcadores e linhas, dispor imagens sobre a área, adicionar modelos em 3D ou carregar arquivos KML, permitindo criar aplicativos sofisticados para mapas em 3D. Se você tem um site de API do Google Maps, pode ativar 3D em sua página com uma única linha de código.</p>
<p>Ótimo, podemos utilizar a API do Google Maps! Vamos ver então um exemplo simples da API do Google Earth e vamos também utilizar o nosso exemplo do artigo anterior (<a href="http://imasters.uol.com.br/artigo/12495/tendencias/colocando_minha_empresa_no_mapa/">Colocando minha empresa no mapa</a>), onde utilizamos a API do Google Maps, para incluir um novo Servidor de Mapas que será o Google Earth.</p>
<p>Bom, aconselho você ler o artigo anterior antes de seguir, pois necessitamos obter uma chave de segurança da API do Google para utilizá-la neste exemplo. Segue o link (<a class="ext" href="http://code.google.com/intl/pt-BR/apis/maps/signup.html">Obtendo uma Chave de API</a>).</p>
<p><strong>Vamos ao Hello, Earth!</strong></p>
<h4><strong>Obtendo o Pluggin para rodar o Google Earth no seu browser</strong></h4>
<p>Não adianta você ter instalado o Google Earth na sua máquina. Você precisa de um plugin específico para rodar esta API no seu browser.</p>
<p>Para instalar, acesso o link <a class="ext" href="http://code.google.com/apis/earth/">http://code.google.com/apis/earth/</a> e clique no mapa para baixar o plugin.</p>
<p><img src="http://conteudo.imasters.com.br/12623/pluggin.jpg" alt="" /></p>
<p>Instale o plugin na sua máquina e pronto. Você já pode rodar o Google Earth no seu browser.</p>
<p><strong>Vamos ao código:</strong></p>
<div class="codigo">
<pre><em><code><span class="pun">&lt;</span><span class="tag">html</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;</span><span class="tag">meta</span><span class="pln"> </span><span class="atn">http-equiv</span><span class="pun">=</span><span class="atv">"content-type"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"text/html; charset=utf-8"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
  </span><span class="pun">&lt;</span><span class="tag">head</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">title</span><span class="pun">&gt;</span><span class="pln">Hello Google Earth!</span><span class="pun">&lt;/</span><span class="tag">title</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="com">&lt;!-- Adicionando a API (!!Não esqueça de alterar a sua chave!!)--&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"http://www.google.com/jsapi?key=SUA_CHAVE_AQUI"</span><span class="pun">&gt;&lt;</span><span class="str">/script&gt;
    &lt;script&gt;
        google.load("earth", "1");

        var ge = null;
        // Função Inincial -&gt; Chamada no OnLoad
        function init() {
          // Instancia o Objeto dentro da DIV map3d,
          // caso sucesso, chama a função initCallback, senão, failureCallback
          google.earth.createInstance("map3d", initCallback, failureCallback);
        }
        function initCallback(object) {
          ge = object; //Adiciona o Objeto na variável global ge
          //Dá visibilidade ao Google Earth dentro do navegador.
          ge.getWindow().setVisibility(true);
        }
        function failureCallback(object) { }
    </span><span class="pun">&lt;/</span><span class="tag">script</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;/</span><span class="tag">head</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;</span><span class="tag">body</span><span class="pln"> </span><span class="atn">onload</span><span class="pun">=</span><span class="atv">'</span><span class="str">init()</span><span class="atv">'</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">'body'</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">center</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="tag">div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">'map3d_container'</span><span class="pln">
           </span><span class="atn">style</span><span class="pun">=</span><span class="atv">'</span><span class="str">border: 1px solid silver; height: 600px; width: 800px;</span><span class="atv">'</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">'map3d'</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">'</span><span class="str">height: 100%;</span><span class="atv">'</span><span class="pun">&gt;&lt;/</span><span class="tag">div</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;/</span><span class="tag">div</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="tag">center</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;/</span><span class="tag">body</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="tag">html</span><span class="pun">&gt;</span></code></em></pre>
</div>
<p><strong>Resultado</strong></p>
<p><img src="http://conteudo.imasters.com.br/12623/earth1.jpg" alt="" /></p>
<p>Pronto, temos apenas um Hello World acima, uma visão do globo geral.</p>
<p>Para visualizar um exemplo de como adicionar controles de navegação, escala, grid, mapa de referência, etc, acesse este link: <a class="ext" href="http://earth-api-samples.googlecode.com/svn/trunk/demos/options/index.html">http://earth-api-samples.googlecode.com/svn/trunk/demos/options/index.html</a>.</p>
<p>É muito simples ampliar as ferramentas do seu mapa.</p>
<h4><strong>Integrando o Google Earth API no Google Maps API</strong></h4>
<p>Ok, vamos pegar o nosso exemplo do artigo anterior e integrar com o a API Google Earth.</p>
<p>Lembram do código?</p>
<p><img src="http://conteudo.imasters.com.br/12623/mapa_codigo.gif" alt="" /></p>
<p><strong>Resultado</strong></p>
<p><img src="http://conteudo.imasters.com.br/12623/mapa_local1.gif" alt="" /></p>
<p><strong>Alterando o código</strong></p>
<p><img src="http://conteudo.imasters.com.br/12623/codigo_alterado.gif" alt="" /></p>
<p>- Alteramos as linhas 8,9,10: trocamos a API do Google Maps pela API do Google Earth</p>
<p>- Linha 14: Adicionado o Load da API do Google Maps</p>
<p>- Linha 23: Adicionado o Layer do Google Earth</p>
<p>- Linha 27: Adicionado os controles de layers</p>
<p><strong>Como ficou</strong></p>
<p><img src="http://conteudo.imasters.com.br/12623/earth2.gif" alt="" /></p>
<p>Não se esqueça, acesse o site dos desenvolvedores, <a class="ext" href="http://code.google.com/intl/pt-BR/apis/earth/">http://code.google.com/intl/pt-BR/apis/earth/</a>, e visualize os exemplos e as referências das APIs do Google Maps e Google Earth. Apenas com os exemplos disponibilizados pelo Google você aumenta a qualidade do seu site sem muito esforço.</p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/12623/tendencias/google_earth_no_meu_site/" target="_blank">Imasters</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/google-earth-no-meu-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barra de Progresso com AJAX</title>
		<link>http://www.debugando.com/barra-de-progresso-com-ajax/</link>
		<comments>http://www.debugando.com/barra-de-progresso-com-ajax/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 18:59:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript/Ajax]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=581</guid>
		<description><![CDATA[
Uma das necessidades com que nos deparamos na hora de realizar projetos longos na web é indicar ao  usuário o quanto é preciso esperar. Às vezes é bastante complicado criar uma barra de progresso que mostre o estado atual do processo que está sendo executado.
Uma forma de realizar essa tarefa é usando AJAX. Fazemos [...]]]></description>
			<content:encoded><![CDATA[<div id="strConteudo">
<p>Uma das necessidades com que nos deparamos na hora de realizar projetos longos na web é indicar ao  usuário o quanto é preciso esperar. Às vezes é bastante complicado criar uma barra de progresso que mostre o estado atual do processo que está sendo executado.</p>
<p>Uma forma de realizar essa tarefa é usando AJAX. Fazemos uma chamada AJAX que executa a ação, e quando o objeto AJAX tem o estado LOADING (readyState == 3), podemos obter a resposta do script chamado e passá-lo para mostrar o percentual da ação que está sendo realizada.</p>
<p>Para isso, desenvolveremos um script (res. php, por exemplo) que devolva a porcentagem seguida por um hífen. Por exemplo, quando passar por 1% será retornado pelo script &#8220;1-&#8221;, quando passar por 5% será retornado &#8220;1-2-3-4-5&#8243;. Processando isso podemos saber, através do último número, o percentual já processado.</p>
<p>O PHP seria o seguinte:</p>
<div class="codigo">
<pre><em><code><span class="kwd">for</span><span class="pun">(</span><span class="pln">$i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">&lt;</span><span class="lit">10000000</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">  if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i</span><span class="pun">%</span><span class="lit">10000</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> echo </span><span class="pun">((</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> $i</span><span class="pun">/</span><span class="lit">100000</span><span class="pun">)</span><span class="pln">.</span><span class="str">'-'</span><span class="pun">;</span><span class="pln">
  flush</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span></code></em></pre>
</div>
<p>E o JavaScript seria assim:</p>
<div class="codigo">
<pre><code><em><span class="kwd">function</span><span class="pln"> ajaxobj</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
</span><span class="kwd">  try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
    _ajaxobj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ActiveXObject</span><span class="pun">(</span><span class="str">"Msxml2.XMLHTTP"</span><span class="pun">);</span><span class="pln">  
</span><span class="pun">  }</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
</span><span class="kwd">  try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
    _ajaxobj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ActiveXObject</span><span class="pun">(</span><span class="str">"Microsoft.XMLHTTP"</span><span class="pun">);</span><span class="pln">  
</span><span class="pun">  }</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">E</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
    _ajaxobj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">  
</span><span class="pun">  }</span><span class="pln">  
</span><span class="pun">}</span><span class="pln">  

 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">_ajaxobj </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pln"> </span><span class="typ">XMLHttpRequest</span><span class="pun">!=</span><span class="str">'undefined'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
   _ajaxobj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XMLHttpRequest</span><span class="pun">();</span><span class="pln">  
</span><span class="pun"> }</span><span class="pln">  

</span><span class="kwd"> return</span><span class="pln"> _ajaxobj</span><span class="pun">;</span></em><span class="pln"><em> </em> 
</span><span class="pun">}</span><span class="pln">
</span><em><span class="kwd">function</span><span class="pln"> prueba </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  
  ajax </span><span class="pun">=</span><span class="pln"> ajaxobj</span><span class="pun">();</span><span class="pln">  
  ajax</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="str">"GET"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"res.php"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">  
  ajax</span><span class="pun">.</span><span class="pln">onreadystatechange</span><span class="pun">=</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">  if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ajax</span><span class="pun">.</span><span class="pln">readyState </span><span class="pun">==</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  

</span><span class="com">   // Mostramos o percentual </span><span class="pln">
</span><span class="kwd">   var</span><span class="pln"> res </span><span class="pun">=</span><span class="pln"> ajax</span><span class="pun">.</span><span class="pln">responseText</span><span class="pun">;</span><span class="pln">
   res </span><span class="pun">=</span><span class="pln"> res</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">'-'</span><span class="pun">);</span><span class="pln">  
   alert</span><span class="pun">(</span><span class="pln">res</span><span class="pun">[</span><span class="pln">res</span><span class="pun">.</span><span class="pln">length</span><span class="pun">-</span><span class="lit">2</span><span class="pun">]);</span><span class="pln">  
</span><span class="pun">  }</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ajax</span><span class="pun">.</span><span class="pln">readyState </span><span class="pun">==</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  

</span><span class="com">  // Fim</span><span class="pln">
  alert</span><span class="pun">(</span><span class="str">'FIM'</span><span class="pun">);</span><span class="pln">  
</span><span class="pun"> }</span><span class="pln">  
</span><span class="pun">}</span><span class="pln">  

</span><span class="com"> // Enviamos algo para que o processo funcione</span><span class="pln">
 ajax</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">  
</span><span class="pun">}</span><span class="pln">  </span></em></code></pre>
</div>
<p>Como não existe nada perfeito, e menos ainda o Internet Explorer, esse script só funcionou no Firefox, Opera, Safari e Chrome.</p>
<p><img src="http://www.pplware.com/wp-content/images/ico_04.jpg" alt="" width="32" height="35" />Fonte: <a href="http://imasters.uol.com.br/artigo/12615/ajax/barra_de_progresso_com_ajax/" target="_blank">Imasters</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/barra-de-progresso-com-ajax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Colocando minha empresa no mapa&#8230;</title>
		<link>http://www.debugando.com/colocando-minha-empresa-no-mapa/</link>
		<comments>http://www.debugando.com/colocando-minha-empresa-no-mapa/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 21:36:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Google API]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google Maps]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=578</guid>
		<description><![CDATA[Este artigo, por mais simples que seja, tende a ser uma das maiores dúvidas e desejos dos usuários que estão iniciando nesta área. Como colocar minha empresa, estabelecimento, casa etc., no mapa. Com certeza no seu site é muito importante existir além do endereço da sua empresa um pequeno mapa representando tudo que está em [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo, por mais simples que seja, tende a ser uma das maiores dúvidas e desejos dos usuários que estão iniciando nesta área. Como colocar minha empresa, estabelecimento, casa etc., no mapa. Com certeza no seu site é muito importante existir além do endereço da sua empresa um pequeno mapa representando tudo que está em volta dela para que os usuários possam se localizar mais facilmente.</p>
<p>Nosso foco hoje é criar um mapa utilizando a API do Google Maps. Com isso, não precisamos de nenhum banco de dados geográfico ou qualquer outro tipo de aplicação para desenvolvimento de mapas além das linguagens HTML e JavaScript.</p>
<p><strong>Segundo o próprio Google, o que é a API do Google Maps?</strong></p>
<p>A API do Google Maps permite usar JavaScript para incorporar o Google Maps em sua página da web. A API fornece diversos utilitários para manipular mapas (como na página http://maps.google.com) e adicionar conteúdo ao mapa através de diversos serviços. Você pode criar aplicativos de mapas robustos em seu site.</p>
<h4><strong>Passo 1: Obtendo uma chave para a API do Google Maps.</strong></h4>
<p>Para utilizarmos a API do Google, precisamos obter uma chave de identificação para o nosso site. É muito importante que você coloque a URL correta do caminho onde estará o mapa, caso contrário, ao instanciar a API no seu código, ela não funcionará.</p>
<p>Acesse o link : <a class="ext" href="http://code.google.com/intl/pt-BR/apis/maps/signup.html">http://code.google.com/intl/pt-BR/apis/maps/signup.html</a>, preencha as informações da URL do seu site e clique em <strong>GERAR chave de API</strong>. Não se esqueça de ler os termos de uso da API, nada de utilizá-la dentro de intranets.</p>
<p><img src="http://conteudo.imasters.uol.com.br/12495/chave_api2.gif" alt="" /></p>
<p><span class="c1"><strong>Obs.: Você precisa ter um usuário cadastrado no Google para obtê-la.</strong></span></p>
<p><img src="http://conteudo.imasters.uol.com.br/12495/thank_you.gif" alt="" /></p>
<p>Pronto, chave gerada, podemos ir para o próximo passo.</p>
<h4><strong>Passo 2: Obtendo o XY da sua empresa</strong></h4>
<p>Inicialmente, para identificarmos a sua empresa/estabelecimento/etc no mapa, precisamos da localização correta dela. A localização que comento é com relação ao seu XY. <strong>Mas o que é XY?</strong> Vamos à matemática&#8230;</p>
<p>Para a construção do modelo da superfície topográfica de uma dada região, necessitamos das triplas (x, y, z) de uma série de pontos da superfície do terreno. Os valores (x, y, z) são as coordenadas cartesianas de um ponto P, relativas a um sistema de coordenadas preestabelecido (como já vimos em meu outro artigo <a href="http://imasters.uol.com.br/artigo/12308/outros/sistemas_de_informacao_geografica/">Sistemas de Informação Geográfica</a>).</p>
<p>O plano XY é o plano horizontal de referência relativamente ao nível médio dos mares, e z é a distância vertical do ponto P ao plano horizontal XY (se me permitem exemplificar desta maneira, seria a altura em relação ao nível do mar, no nosso caso, não será necessária).</p>
<p><strong>Como posso obter este ponto?</strong></p>
<p>Existem diversas maneiras de se obter o XY de um endereço, vou exemplificar duas: a primeira é suscetível a alguns erros, motivo pelo qual o mapeamento da numeração das ruas nas cidades do Brasil não ser de fato correto (mas confesso que é satisfatório). O que quero dizer é que muitas vezes quando você informa o seu endereço, por exemplo o número 567, seriam 567 metros do ponto inicial da sua rua, nem sempre esta numeração irá bater exatamente no local da sua casa (quando digo exatamente, ainda considero um erro de 50m). Pode acontecer de aparecer na quadra errada; quando ocorrer, sugiro utilizar o segundo exemplo de aquisição do XY.</p>
<p>A primeira maneira que me refiro é solicitar através da url <strong>http://maps.google.com/maps/geo?q=</strong><span class="c1">STRING+DO+ENDERECO</span><strong>output=xmlkey=</strong><span class="c1">SUA_CHAVE</span></p>
<p><strong>Obs.: Separe a string com &#8220;+&#8221;.</strong></p>
<p>Exemplo:</p>
<p>http://maps.google.com/maps/geo?q=<strong>avenidaipiranga1200portoalegrersbrasil</strong>output=xmlkey=</p>
<p><strong>Exemplo da resposta (response) em XML:</strong></p>
<p><img src="http://conteudo.imasters.uol.com.br/12495/response_xml.gif" alt="" /></p>
<p>Pronto, seu XYZ é a coordenada <strong>&lt;coordinates&gt;-51.2093204,-30.0451247,0&lt;/coordinates&gt;</strong> .</p>
<p>Agora você pode pular o segundo exemplo e ir direto ao passo 3, mas antes vamos verificar se o ponto está mesmo no local correto.</p>
<p>Acesso o seguinte link:</p>
<p><strong>http://maps.google.com.br/maps?f=qsource=s_qhl=pt-BRgeocode=q=</strong><span class="c1">(-30.0451247,-51.2093204)</span></p>
<p><strong><span class="c1">OBS: Lembre-se de alterar a ordem dos pontos XY &lt;-&gt; YX</span></strong></p>
<p>A segunda maneira de se obter as coordenadas XY é implementar um outro exemplo utilizando a API do Google Maps. Chamamos este exemplo de Geocode Reverso (através de um clique no mapa iremos obter as informações quanto a este local).</p>
<p>O exemplo abaixo está presente na página da API do Google Maps, mantive-o como o qual para explicar cada linha.</p>
<p><strong>Código</strong></p>
<div class="codigo">
<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"/&gt;
    &lt;title&gt;Google Maps JavaScript API Example: 	Reverse Geocoder&lt;/title&gt;
    &lt;script src="http://maps.google.com/maps?file=apiv=2.xkey=ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA"
            type="text/javascript"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;

    var map;
    var geocoder;
    var address;

    function initialize() {
      map = new GMap2(document.getElementById("map"));
      map.setCenter(new GLatLng(-30.0270583,-51.2303402), 10);
      map.addControl(new GLargeMapControl);
      GEvent.addListener(map, "click", getAddress);
      geocoder = new GClientGeocoder();
    }

    function getAddress(overlay, latlng) {
      if (latlng != null) {
        address = latlng;
        geocoder.getLocations(latlng, showAddress);
      }
    }

    function showAddress(response) {
      map.clearOverlays();
      if (!response  response.Status.code != 200) {
        alert("Status Code:"  response.Status.code);
      } else {
        place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1],
                            place.Point.coordinates[0]);
        marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(
        '&lt;b&gt;orig latlng:&lt;/b&gt;'  response.name  '&lt;br/&gt;'
        '&lt;b&gt;latlng:&lt;/b&gt;'  place.Point.coordinates[1]  ","  place.Point.coordinates[0]  '&lt;br&gt;'
        '&lt;b&gt;Status Code:&lt;/b&gt;'  response.Status.code  '&lt;br&gt;'
        '&lt;b&gt;Status Request:&lt;/b&gt;'  response.Status.request  '&lt;br&gt;'
        '&lt;b&gt;Address:&lt;/b&gt;'  place.address  '&lt;br&gt;'
        '&lt;b&gt;Accuracy:&lt;/b&gt;'  place.AddressDetails.Accuracy  '&lt;br&gt;'
        '&lt;b&gt;Country code:&lt;/b&gt; '  place.AddressDetails.Country.CountryNameCode);
      }
    }
    &lt;/script&gt;
  &lt;/head&gt;

  &lt;body onload="initialize()"&gt;
    &lt;div id="map" style="width: 500px; height: 400px"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
</div>
<p><img src="http://conteudo.imasters.uol.com.br/12495/reverse_1.gif" alt="" /></p>
<p><img src="http://conteudo.imasters.uol.com.br/12495/reverse_2.gif" alt="" /></p>
<p>Você já viu um exemplo da resposta (response) em XML no exemplo anterior.</p>
<p><strong>Exemplo da resposta (response) em JSON:</strong></p>
<p><img src="http://conteudo.imasters.uol.com.br/12495/response_json.gif" alt="" /></p>
<p>Através dos arquivos acima, você consegue identificar quais as variáveis necessárias para obter os dados do geocode.</p>
<p>Por fim e não menos importante, o corpo do HTML:</p>
<div class="codigo">
<pre><code><span class="pun">&lt;</span><span class="tag">body</span><span class="pln"> </span><span class="atn">onload</span><span class="pun">=</span><span class="atv">"</span><span class="str">initialize()</span><span class="atv">"</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"map"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="str">width: 500px; height: 400px</span><span class="atv">"</span><span class="pun">&gt;&lt;/</span><span class="tag">div</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"temp"</span><span class="pun">&gt;&lt;/</span><span class="tag">div</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;/</span><span class="tag">body</span><span class="pun">&gt;</span></code></pre>
</div>
<p><span class="c1"><strong>Não se esqueça de utilizar o ONLOAD para chamar a função initialize() para tão logo carregar a página iniciar o procedimento da criação do mapa.</strong></span> Não quero ver ninguém comentando que o mapa não aparece!</p>
<p>Pronto, agora navegue no mapa, procure o endereço da sua empresa (ainda não criamos uma barra de pesquisa de endereço, nos próximos artigos irei explicar como), clique no local e copie as informações da linha <strong>latlng</strong>.</p>
<p>Agora temos o XY para continuar no nosso artigo.</p>
<h4>Passo 3: Adicionando minha empresa no mapa</h4>
<p>Bom, se você já criou o exemplo anterior do geocode reverso, este agora é muito mais simples. Caso contrário, vamos lá passo a passo.</p>
<p><strong>Vamos ao código</strong></p>
<div class="codigo">
<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&gt;
    &lt;title&gt;Google Maps JavaScript API Example: Simple Markers&lt;/title&gt;
    &lt;script src="http://maps.google.com/maps?file=apiamp;v=2amp;key=
	ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA"
            type="text/javascript"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
    function initialize() {
      if (GBrowserIsCompatible()) { // Verifica se o browser é compativel com a API do Google
	    // Instância a API do Google e a adiciona na DIV map.
        var map = new GMap2(document.getElementById("map"));
		// Centraliza o mapa no XY, zoom 16 em uma escala de [1..17] (Varia de acordo com a região)
        map.setCenter(new GLatLng(-30.0451247,-51.2093204), 16);
		// (OPCIONAL) Adiciona os controle de a esquerda do Mapa (Zoom , Zoom -, barra de Zoom, etc)
        map.addControl(new GLargeMapControl);
		// Padronizamos o XY de acordo com o latlng da API: (Y,X)
        var latlng = new GLatLng(-30.0451247,-51.2093204);
        map.addOverlay(new GMarker(latlng)); // Adiciona o marker no mapa
      }//if
    }//function
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body onload="initialize()" onunload="GUnload()"&gt;
    &lt;div id="map" style="width: 500px; height: 300px"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
</div>
<p><img src="http://conteudo.imasters.uol.com.br/12495/mapa_codigo.gif" alt="" /></p>
<p><span class="c1"><strong>OBS: Não se esqueça de trocar a sua chave da API. Não se esqueça de declarar o ONLOAD, para que a função initialize(), no meu exemplo, crie o mapa assim que a página seja carregada. </strong></span></p>
<h4><strong>Resultado</strong></h4>
<p><img src="http://conteudo.imasters.uol.com.br/12495/mapa_local1.gif" alt="" /></p>
<p>Caso você queira incrementar o seu mapa e adicionar um evento de clique no marker, façamos algumas modificações no código:</p>
<p><img src="http://conteudo.imasters.uol.com.br/12495/mapa_codigo_alteracoes.gif" alt="" /></p>
<div class="codigo">
<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&gt;
    &lt;title&gt;Google Maps JavaScript API Example: Simple Markers&lt;/title&gt;
    &lt;script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=
	ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA"
            type="text/javascript"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
    function initialize() {
      if (GBrowserIsCompatible()) { // Verifica se o browser é compativel com a API do Google
	    // Instância a API do Google e a adiciona na DIV map.
        var map = new GMap2(document.getElementById("map"));
		// Centraliza o mapa no XY, zoom 16 em uma escala de [1..17] (Varia de acordo com a região)
        map.setCenter(new GLatLng(-30.0451247,-51.2093204), 16);
		// (OPCIONAL) Adiciona os controle de a esquerda do Mapa (Zoom +, Zoom -, barra de Zoom, etc)
        map.addControl(new GLargeMapControl);
		// Padronizamos o XY de acordo com o latlng da API: (Y,X)
        var latlng = new GLatLng(-30.0451247,-51.2093204);
		var marker = new GMarker(latlng); // Criamos um marker referenciado a uma variável
		// Criamos um evento para ao se clicar no marker
		GEvent.addListener(marker, "click", function() {
			// Abrir um InfoWindow com o seguinte texto
           marker.openInfoWindowHtml("Endereço da minha empresa! &lt;br/&gt; &lt;strong&gt;;)&lt;/strong&gt;");
          });
        map.addOverlay(marker); // Adiciona o marker no mapa
      }//if
    }//function
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body onload="initialize()" onunload="GUnload()"&gt;
    &lt;div id="map" style="width: 500px; height: 300px"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
</div>
<p><img src="http://conteudo.imasters.uol.com.br/12495/mapa_resultado_final.gif" alt="" /></p>
<p>Pronto!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/colocando-minha-empresa-no-mapa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Flex &#8211; Como colocar gráficos em repeater</title>
		<link>http://www.debugando.com/adobe-flex-como-colocar-graficos-em-repeater/</link>
		<comments>http://www.debugando.com/adobe-flex-como-colocar-graficos-em-repeater/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 22:17:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FLEX]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[MXML]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=561</guid>
		<description><![CDATA[Estou desenvolvendo um modelo de Dashboard de Indicadores de Performace (KPI) utilizando o Adobe Flex, Asp.NET e SQL Server 2000.
Nesse Dashboard eu precisava exibir vários gráficos de acordo com o perfil de cada usuário. Por isso, construir um modelo fixo não seria possível. Então busquei maneiras de fazer isso utilizando o mx:Tile e o mx:Repeater.
Na [...]]]></description>
			<content:encoded><![CDATA[<p>Estou desenvolvendo um modelo de <strong>Dashboard</strong> de Indicadores de Performace (KPI) utilizando o Adobe Flex, Asp.NET e SQL Server 2000.</p>
<p>Nesse Dashboard eu precisava exibir vários gráficos de acordo com o perfil de cada usuário. Por isso, construir um modelo fixo não seria possível. Então busquei maneiras de fazer isso utilizando o mx:Tile e o mx:Repeater.</p>
<p>Na busca encontrei apenas um exemplo de Datagrid em um Repeater, com isso foi possível construir o modelo para utilizar com Gráficos.</p>
<p>Primeiro é preciso entender a estrutura de DataProvider, necessária para que tudo funcione como o esperado.</p>
<p><img src="http://conteudo.imasters.uol.com.br/12186/igormusardo_1.gif" alt="" /></p>
<p>Como na figura acima, o DataProvider é um ArrayCollection composto de um ArrayCollection para cada gráfico que será exibido no Repeater, cada um desse segundo ArrayCollection é composto por objetos que serão os pontos dos gráficos.</p>
<p>Abaixo está o código responsável pela configuração do ArrayCollection, que será o DataProvider do mx:Repeater.</p>
<div class="codigo">
<pre><em><code><span class="pun">&lt;</span><span class="tag">mx:Script</span><span class="pun">&gt;</span><span class="pln">
        &lt;![CDATA[
                import mx.utils.ObjectProxy;
                import mx.core.Application;
                import mx.utils.ObjectUtil;
                import mx.rpc.events.FaultEvent;
                import mx.rpc.events.ResultEvent;
                import mx.collections.ArrayCollection;

                //ArrayCollection que será o DataProvider do Repeater
                [Bindable]
                private var arDadosGraficoTotal:ArrayCollection = new ArrayCollection();

                private function load():void
                {
                        var arDadosGrafico:ArrayCollection;
                        var obDadosGrafico:ObjectProxy;

                        //Gráfico 1
                        //arDadosGrafico recebe um novo ArrayCollection
                        arDadosGrafico = new ArrayCollection();
                        //obDadosGrafico recebe um novo ObjectProxy
                        obDadosGrafico = new ObjectProxy();
                        //Cria a propriedade data1 e atribiu o 10, data1 será uma série no gráfico
                        obDadosGrafico.data1 = 10;
                        //Cria a propriedade data2 e atribiu o 5, data2 será outra série no gráfico
                        obDadosGrafico.data2 = 05;
                        //Cria a propriedade label e atribiu 'Jan', label será o eixo X do gráfico
                        obDadosGrafico.label = 'Jan';                   

//Cria a propriedade titulo e atribiu 'Vendas', titulo será o titulo do
gráfico, só existirá essa propriedade no primeiro ObjectProxy
                        obDadosGrafico.titulo = 'Vendas';      
                        //Adiciona o ObjectProxy obDadosGrafico ao ArrayCollection arDadosGrafico      
                        arDadosGrafico.addItem(obDadosGrafico);

//obDadosGrafico recebe um novo ObjectProxy e receberá os mesmas
propriedades porém com valores distintos e também é inserido ao
ArrayCollection arDadosGrafico
                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 05;
                        obDadosGrafico.data2 = 05;
                        obDadosGrafico.label = 'Fev';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 03;
                        obDadosGrafico.data2 = 05;
                        obDadosGrafico.label = 'Mar';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 06;
                        obDadosGrafico.data2 = 05;
                        obDadosGrafico.label = 'Abr';                  
                        arDadosGrafico.addItem(obDadosGrafico);

//Quando terminam os pontos do gráfico é necessário inserir o
ArrayCollection arDadosGrafico ao ArrayCollection arDadosGraficoTotal
                        arDadosGraficoTotal.addItem(arDadosGrafico);    

//Os passos anteriores devem ser feitos para cada gráfico que se deseja
exibir no Dashboard, abaixo estão identificos como Gráfico 2 e Gráfico 3
                        //Gráfico 2
                        arDadosGrafico = new ArrayCollection();
                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 07;
                        obDadosGrafico.data2 = 02;
                        obDadosGrafico.label = 'Jan';                  
                        obDadosGrafico.titulo = 'Custos';                      
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 08;
                        obDadosGrafico.data2 = 02;
                        obDadosGrafico.label = 'Fev';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();

                        obDadosGrafico.data1 = 05;
                        obDadosGrafico.data2 = 02;
                        obDadosGrafico.label = 'Mar';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 04;
                        obDadosGrafico.data2 = 02;
                        obDadosGrafico.label = 'Abr';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        arDadosGraficoTotal.addItem(arDadosGrafico);    

                        //Gráfico 3
                        arDadosGrafico = new ArrayCollection();
                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 10;
                        obDadosGrafico.data2 = 08;
                        obDadosGrafico.label = 'Jan';                  
                        obDadosGrafico.titulo = 'Produção';                    
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 12;
                        obDadosGrafico.data2 = 08;
                        obDadosGrafico.label = 'Fev';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 06;
                        obDadosGrafico.data2 = 08;
                        obDadosGrafico.label = 'Mar';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        obDadosGrafico = new ObjectProxy();
                        obDadosGrafico.data1 = 08;
                        obDadosGrafico.data2 = 08;
                        obDadosGrafico.label = 'Abr';                  
                        arDadosGrafico.addItem(obDadosGrafico);

                        arDadosGraficoTotal.addItem(arDadosGrafico);    

//Ao terminado de incluir todos os arDadosGrafico ao
arDadosGraficoTotal, é necessário declarar arDadosGraficoTotal como
dataProvider do repeater
                        rpGrafico.dataProvider = arDadosGraficoTotal;  
                }               

        ]]&gt;
</span><span class="pun">&lt;/</span><span class="tag">mx:Script</span><span class="pun">&gt;</span></code></em></pre>
</div>
<p>Abaixo está o código necessário para exibir os gráficos. Inicialmente foi utilizado um Tile e dentro um Repeater. Dentro do Repeater há um Panel e dentro do Panel está o gráfico que deve ser exibido de acordo com o dataProvider.</p>
<p>Como demonstrado acima, o dataProvider é associado ao término da função load(). Após a associação, o Repeater começará a renderizar o primeiro gráfico, e já no título do Panel o valor atribuído será a propriedade título definida no primeiro objeto do arDadosGrafico.</p>
<p>Para isso é utilizada a instrução: {rpGrafico.currentItem.getItemAt(0).titulo}, ou seja, rpGrafico é o Repeater, a propriedade currentItem contém o arDadosGrafico do laço em questão e getItemAt(0) assegura que só buscará a propriedade título no primeiro objeto dentro do arDadosGrafico.</p>
<p>Para o gráfico, só resta associar um dataProvider a ele para que sejam exibidos os seus pontos. O dataProvider em questão será o currentItem do Repeater rpGrafico, pois como dito acima, a propriedade currentItem contém o arDadosGrafico do laço em questão.</p>
<p>No eixo X, horizontalAxis, é definido label como o campo fonte dos dados. No eixo Y, verticalAxis, está configurado para não começar em zero. Logo abaixo estão as duas séries, uma para o data1 (Indicador Técnico) e outra para data2 (Meta).</p>
<div class="codigo">
<pre><em><code><span class="pun">&lt;</span><span class="tag">mx:Tile</span><span class="pln"> </span><span class="atn">left</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">right</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">top</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">bottom</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">direction</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">mx:Repeater</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"rpGrafico"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"100%"</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">mx:Panel</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"250"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"200"</span><span class="pln"> </span><span class="atn">layout</span><span class="pun">=</span><span class="atv">"absolute"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"pnGrafico"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"{rpGrafico.currentItem.getItemAt(0).titulo}"</span><span class="pun">&gt;</span><span class="pln">

</span><span class="pun">&lt;</span><span class="tag">mx:LineChart</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"grIndicador"</span><span class="pln"> </span><span class="atn">dataTipMode</span><span class="pun">=</span><span class="atv">"single"</span><span class="pln">
</span><span class="atn">showDataTips</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln"> </span><span class="atn">dataProvider</span><span class="pun">=</span><span class="atv">"{rpGrafico.currentItem}"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"95%"</span><span class="pln">
</span><span class="atn">height</span><span class="pun">=</span><span class="atv">"95%"</span><span class="pln"> </span><span class="atn">horizontalCenter</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="atn">verticalCenter</span><span class="pun">=</span><span class="atv">"0"</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">mx:horizontalAxis</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">mx:CategoryAxis</span><span class="pln"> </span><span class="atn">categoryField</span><span class="pun">=</span><span class="atv">"label"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">                              
                </span><span class="pun">&lt;/</span><span class="tag">mx:horizontalAxis</span><span class="pun">&gt;</span><span class="pln">                                                                            
                        </span><span class="pun">&lt;</span><span class="tag">mx:verticalAxis</span><span class="pun">&gt;</span><span class="pln">
                                </span><span class="pun">&lt;</span><span class="tag">mx:LinearAxis</span><span class="pln"> </span><span class="atn">baseAtZero</span><span class="pun">=</span><span class="atv">"false"</span><span class="pun">/&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">mx:verticalAxis</span><span class="pun">&gt;</span><span class="pln">                                                                              
                        </span><span class="pun">&lt;</span><span class="tag">mx:series</span><span class="pun">&gt;</span><span class="pln">                    
                        </span><span class="pun">&lt;</span><span class="tag">mx:LineSeries</span><span class="pln"> </span><span class="atn">form</span><span class="pun">=</span><span class="atv">"segment"</span><span class="pln"> </span><span class="atn">yField</span><span class="pun">=</span><span class="atv">"data2"</span><span class="pln"> </span><span class="atn">displayName</span><span class="pun">=</span><span class="atv">"Meta"</span><span class="pun">/&gt;</span><span class="pln">

                        </span><span class="pun">&lt;</span><span class="tag">mx:LineSeries</span><span class="pln"> </span><span class="atn">form</span><span class="pun">=</span><span class="atv">"segment"</span><span class="pln"> </span><span class="atn">yField</span><span class="pun">=</span><span class="atv">"data1"</span><span class="pln"> </span><span class="atn">displayName</span><span class="pun">=</span><span class="atv">"Indicador Técnico"</span><span class="pun">/&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">mx:series</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">mx:LineChart</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;/</span><span class="tag">mx:Panel</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;/</span><span class="tag">mx:Repeater</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="tag">mx:Tile</span><span class="pun">&gt;</span></code></em></pre>
</div>
<p>Antes de executar o projeto e ver tudo funcionando legal, é necessário adicionar o código abaixo na segunda linha do código dentro da tag mx:Application</p>
<p><strong>creationComplete=&#8221;load()&#8221;</strong></p>
<p>Deixando-a assim:</p>
<div class="codigo">
<pre><em><code><span class="pun">&lt;</span><span class="tag">mx:Application</span><span class="pln"> </span><span class="atn">xmlns:mx</span><span class="pun">=</span><span class="atv">"http://www.adobe.com/2006/mxml"</span><span class="pln"> </span><span class="atn">layout</span><span class="pun">=</span><span class="atv">"absolute"</span><span class="pln"> </span><span class="atn">creationComplete</span><span class="pun">=</span><span class="atv">"load();"</span><span class="pun">&gt;</span></code></em></pre>
</div>
<p>Execute o projeto, você deve obter um resultado igual a imagem abaixo.</p>
<p><img src="http://conteudo.imasters.uol.com.br/12186/igormusardo_2.gif" alt="" /></p>
<p>Complementando?</p>
<p>Para incluir as legendas basta adicionar logo após o gráfico o código abaixo:</p>
<div class="codigo">
<pre><em><code><span class="pun">&lt;</span><span class="tag">mx:Legend</span><span class="pln"> </span><span class="atn">dataProvider</span><span class="pun">=</span><span class="atv">"{grIndicador[0]}"</span><span class="pln"> </span><span class="atn">bottom</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">left</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">right</span><span class="pun">=</span><span class="atv">"10"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"25"</span><span class="pun">/&gt;</span></code></em></pre>
</div>
<p><img src="http://conteudo.imasters.uol.com.br/12186/igormusardo_3.gif" alt="" /></p>
<p><em>Fonte: <a onclick="javascript:urchinTracker ('/outbound/article/www.pplware.com');" href="http://imasters.uol.com.br/artigo/12186/desenvolvimento/adobe_flex_-_como_colocar_graficos_em_repeater/" target="_blank">Imasters</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/adobe-flex-como-colocar-graficos-em-repeater/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Crie Arquivos .ZIP com ASP.NET</title>
		<link>http://www.debugando.com/crie-arquivos-zip-com-aspnet/</link>
		<comments>http://www.debugando.com/crie-arquivos-zip-com-aspnet/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 22:11:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[.ZIP]]></category>
		<category><![CDATA[ASP .NET]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=558</guid>
		<description><![CDATA[Neste artigo vou mostrar como criar arquivos .ZIP e como descompactar utilizando o ASP.net. Imagem de exemplo do exemplo deste artigo.
Um pouco de conhecimento antes de programarmos
Arquivos .zip é um formato muito conhecido. Em Matemática, um dos modos de se obter uma compressão de arquivos, é através de Transformada de Fourier. A compressão e compactação [...]]]></description>
			<content:encoded><![CDATA[<p>Neste artigo vou mostrar como criar arquivos .ZIP e como descompactar utilizando o ASP.net. <img src="http://conteudo.imasters.uol.com.br/7575/zipcomaspnet_img01.gif" alt="Imagem de exemplo do exemplo deste artigo." /><span class="imgdesc">Imagem de exemplo do exemplo deste artigo.</span></p>
<h3>Um pouco de conhecimento antes de programarmos</h3>
<p>Arquivos .zip é um formato muito conhecido. Em Matemática, um dos modos de se obter uma compressão de arquivos, é através de Transformada de Fourier. A compressão e compactação são importantíssimas para conseguirmos informações em tempos menores de transmissão, de forma mais barata possível.</p>
<p><strong>Qual a diferença entre Compressão e Compactação?</strong></p>
<p>A principal diferença entre os dois termos é que compactação não há perda de informação, enquanto que na compressão há perda. O Formato .MP3 é um exemplo de Compressão, pois há perda de informação, embora nossos ouvidos não notem muito. Mesmo entre os Mp3, temos aqueles com maior qualidade (menos perda) e os de menores qualidades (maior perda).</p>
<p>Entre os métodos mais conhecidos de compactação estão:</p>
<ul>
<li>Codificação por carreira</li>
<li>Codificação por Shannon-Fano</li>
<li>Codificação de Huffman (muito utilizado para compactar texto)</li>
<li>Codificação de Lempel-Ziv-Welch (LZW)</li>
<li>Codificação aritmética</li>
</ul>
<p>Entre os métodos mais conhecidos de compressão estão:</p>
<ul>
<li>Redução do domínio</li>
<li>Redução do espaço de quantização</li>
<li>Codificação preditiva</li>
<li>Codificação por sub-bandas</li>
<li>Codificação por transformadas</li>
<li>Quantização vetorial</li>
</ul>
<h3>Pré-requisitos</h3>
<p>Este artigo foi montado nas configurações abaixo. Não foi testado em outros ambientes.</p>
<ul>
<li>Framework ASP.NET 2.0 com VB.net</li>
<li>Visual Studio 2005.</li>
</ul>
<h3>Mãos a obra</h3>
<p>Clique <a class="ext" href="http://conteudo.imasters.uol.com.br/7575/ZipComAspNet.zip">aqui </a>para dar download no projeto de exemplo.</p>
<p>Primeiro, crie uma solução no seu VisualStudio. Adicione um novo projeto Web, e referencie a Biblioteca SharpZLib.</p>
<p>Caso você esteja usa utilizando a versão Express, crie um novo website, e coloque ICSharpCode.SharpZipLib.dll na pasta /bin.</p>
<p>Em seguida, vamos criar uma página chamada zip.ASPX.</p>
<h3>Compactando Diretório Inteiro</h3>
<p>Para compactar o diretório, você terá que informar o diretório de origem e o arquivo de destino.</p>
<div class="codigo">
<pre><code><span class="pln">
</span><em><span class="str">''' &lt;summary&gt;
    '''</span><span class="pln"> </span><span class="typ">Evento</span><span class="pln"> </span><span class="kwd">do</span><span class="pln"> bot</span><span class="pun">ã</span><span class="pln">o</span><span class="pun">,</span><span class="pln"> gerar diret</span><span class="pun">ó</span><span class="pln">rio
    </span><span class="str">''' &lt;/summary&gt;
    Protected Sub btnGerar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGerar.Click
        gerarZipDiretorio(txtOrigem.Text, txtDestino.Text)
        subInitDescompactarArquivos()
    End Sub

    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">summary</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' Este método gera um zip, a partir de um diretório
    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="str">/summary&gt;
    ''' &lt;param name="sDiretorioOrigem"&gt;
    ''' Diretório que será zipado
    ''' &lt;/</span><span class="pln">param</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' &lt;param name="sDiretorioDestino"&gt;
    '''</span><span class="pln"> </span><span class="typ">Diret</span><span class="pun">ó</span><span class="pln">rio que receber</span><span class="pun">á</span><span class="pln"> o arquivo zipado
    </span><span class="str">''' &lt;/param&gt;
    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">remarks</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' &lt;/remarks&gt;
    Public Sub gerarZipDiretorio(ByVal sDiretorioOrigem As String, ByVal sDiretorioDestino As String)

        Dim sz As New FastZip()
        Dim sArquivoZip As String = String.Empty

        '</span><span class="pln"> </span><span class="typ">Aqui</span><span class="pln"> vou criar um nome </span><span class="kwd">do</span><span class="pln"> arquivo</span><span class="pun">,</span><span class="pln"> com </span><span class="lit">6</span><span class="pln"> caracteres rand</span><span class="pun">ô</span><span class="pln">micos</span><span class="pun">.</span><span class="pln">
        </span><span class="str">' O Guid é um método do .net que gera string aleatórias únicas, baseada na hora e no
        '</span><span class="pln"> endere</span><span class="pun">ç</span><span class="pln">o MAC na m</span><span class="pun">á</span><span class="pln">quina gerada</span><span class="pun">.</span><span class="pln">
        sArquivoZip </span><span class="pun">=</span><span class="pln"> </span><span class="str">"MeuZip"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="typ">Left</span><span class="pun">(</span><span class="typ">Guid</span><span class="pun">.</span><span class="typ">NewGuid</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="str">".zip"</span><span class="pln">

        </span><span class="str">' Só um tratamento para garantir mais estabilidade
        If Right(sDiretorioOrigem, 1) &lt;&gt; "\" Then
            sDiretorioOrigem = sDiretorioOrigem &amp; "\"
        End If

        '</span><span class="pln"> S</span><span class="pun">ó</span><span class="pln"> um tratamento para garantir mais estabilidade
        </span><span class="typ">If</span><span class="pln"> </span><span class="typ">Right</span><span class="pun">(</span><span class="pln">sDiretorioDestino</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;&gt;</span><span class="pln"> </span><span class="str">"\" Then
            sDiretorioDestino = sDiretorioDestino &amp; "</span><span class="pun">\</span><span class="str">"
        End If

        If Not Directory.Exists(sDiretorioDestino) Then
            lblErro.Text = "</span><span class="pln">O </span><span class="typ">Diret</span><span class="pun">ó</span><span class="pln">rio de </span><span class="typ">Destino</span><span class="pln"> informado n</span><span class="pun">ã</span><span class="pln">o existe</span><span class="pun">:</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">br </span><span class="pun">/&gt;</span><span class="str">" &amp; sDiretorioDestino
            Exit Sub
        End If

        If Not Directory.Exists(sDiretorioOrigem) Then
            lblErro.Text = "</span><span class="pln">O </span><span class="typ">Diret</span><span class="pun">ó</span><span class="pln">rio de </span><span class="typ">Origem</span><span class="pln"> informado n</span><span class="pun">ã</span><span class="pln">o existe</span><span class="pun">:</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">br </span><span class="pun">/&gt;</span><span class="str">" &amp; sDiretorioOrigem
            Exit Sub
        End If

        sz.CreateZip(sDiretorioDestino &amp; sArquivoZip, sDiretorioOrigem &amp; "" &amp; "</span><span class="pun">\</span><span class="str">", True, "", "")

        ' Aqui eu habilito o download do arquivo.
        ' Muito útil se você quiser salvar em diretórios protegidos
        ' Ou não acessível pela raíz do seu projeto web.
        HttpContext.Current.Response.TransmitFile(sDiretorioDestino &amp; sArquivoZip)

        ' "</span><span class="pln">Limpo</span><span class="str">" o objeto
        sz = Nothing

    End Sub</span></em></code></pre>
</div>
<p><strong>Obs.:</strong></p>
<p>Você pode definir uma senha para seu .zip, utilizando a propriedade &#8220;password&#8221;.</p>
<h3>Compactando Somente um Arquivo</h3>
<p>Para compactar somente um arquivo, você terá que informar o arquivo a ser compactado, e o diretório de destino.</p>
<div class="codigo">
<pre><code><span class="pln">
<em>    </em></span><em><span class="str">''' &lt;summary&gt;
    '''</span><span class="pln"> </span><span class="typ">Evento</span><span class="pln"> </span><span class="kwd">do</span><span class="pln"> bot</span><span class="pun">ã</span><span class="pln">o gerar </span><span class="typ">Arquivo</span><span class="pln">
    </span><span class="str">''' &lt;/summary&gt;
    Protected Sub btnGerarArquivo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGerarArquivo.Click
        gerarZipArquivo(txtArquivoOrigem.Text, txtArquivoDestino.Text)
        subInitDescompactarArquivos()
    End Sub

    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">summary</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' Este método gera um zip, a partir de um diretório
    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="str">/summary&gt;
    ''' &lt;param name="sArquivoOrigem"&gt;
    ''' Arquivo que será zipado
    ''' &lt;/</span><span class="pln">param</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' &lt;param name="sDiretorioDestino"&gt;
    '''</span><span class="pln"> </span><span class="typ">Diret</span><span class="pun">ó</span><span class="pln">rio que receber</span><span class="pun">á</span><span class="pln"> o arquivo zipado
    </span><span class="str">''' &lt;/param&gt;
    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">remarks</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' &lt;/remarks&gt;
    Public Sub gerarZipArquivo(ByVal sArquivoOrigem As String, ByVal sDiretorioDestino As String)

        Dim sz As New FastZip()
        Dim sArquivoZip As String = String.Empty

        '</span><span class="pln"> </span><span class="typ">Aqui</span><span class="pln"> vou criar um nome </span><span class="kwd">do</span><span class="pln"> arquivo</span><span class="pun">,</span><span class="pln"> com </span><span class="lit">6</span><span class="pln"> caracteres rand</span><span class="pun">ô</span><span class="pln">micos</span><span class="pun">.</span><span class="pln">
        </span><span class="str">' O Guid é um método do .net que gera string aleatórias únicas, baseada na hora e no
        '</span><span class="pln"> endere</span><span class="pun">ç</span><span class="pln">o MAC na m</span><span class="pun">á</span><span class="pln">quina gerada</span><span class="pun">.</span><span class="pln">
        sArquivoZip </span><span class="pun">=</span><span class="pln"> </span><span class="str">"MeuZip"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="typ">Left</span><span class="pun">(</span><span class="typ">Guid</span><span class="pun">.</span><span class="typ">NewGuid</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="str">".zip"</span><span class="pln">

        </span><span class="str">' Só um tratamento para garantir mais estabilidade
        If Right(sDiretorioDestino, 1) &lt;&gt; "\" Then
            sDiretorioDestino = sDiretorioDestino &amp; "\"
        End If

        If Not Directory.Exists(sDiretorioDestino) Then
            lblErroArquivo.Text = "O Diretório de Destino informado não existe: &lt;br /&gt;" &amp; sDiretorioDestino
            Exit Sub
        End If

        If Not File.Exists(sArquivoOrigem) Then
            lblErroArquivo.Text = "O Arquivo de Origem informado não existe: &lt;br /&gt;" &amp; sArquivoOrigem
            Exit Sub
        End If

        '</span><span class="pln"> </span><span class="typ">Crio</span><span class="pln"> um arquivo </span><span class="kwd">do</span><span class="pln"> tipo stream</span><span class="pun">,</span><span class="pln"> aprontando para o meu zip de destino</span><span class="pun">.</span><span class="pln">
        </span><span class="typ">Dim</span><span class="pln"> strmZipOutputStream </span><span class="typ">As</span><span class="pln"> </span><span class="typ">ZipOutputStream</span><span class="pln">
        strmZipOutputStream </span><span class="pun">=</span><span class="pln"> </span><span class="typ">New</span><span class="pln"> </span><span class="typ">ZipOutputStream</span><span class="pun">(</span><span class="typ">File</span><span class="pun">.</span><span class="typ">Create</span><span class="pun">(</span><span class="pln">sDiretorioDestino </span><span class="pun">&amp;</span><span class="pln"> sArquivoZip</span><span class="pun">))</span><span class="pln">

        </span><span class="str">' Seto o nível de compressão (0-&gt;Sem compressão / 9-&gt; Compressão Máxima)
        strmZipOutputStream.SetLevel(9)

        '</span><span class="pln"> </span><span class="typ">Leio</span><span class="pln"> o arquivo de origem
        </span><span class="typ">Dim</span><span class="pln"> strmFile </span><span class="typ">As</span><span class="pln"> </span><span class="typ">FileStream</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">File</span><span class="pun">.</span><span class="typ">OpenRead</span><span class="pun">(</span><span class="pln">sArquivoOrigem</span><span class="pun">)</span><span class="pln">
        </span><span class="typ">Dim</span><span class="pln"> abyBuffer</span><span class="pun">(</span><span class="pln">strmFile</span><span class="pun">.</span><span class="typ">Length</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="typ">As</span><span class="pln"> </span><span class="typ">Byte</span><span class="pln">

        strmFile</span><span class="pun">.</span><span class="typ">Read</span><span class="pun">(</span><span class="pln">abyBuffer</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> abyBuffer</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">)</span><span class="pln">

        </span><span class="str">' Aqui eu trato para pegar somente o arquivo, sem os diretórios
        '</span><span class="pln"> O split </span><span class="pun">é</span><span class="pln"> um m</span><span class="pun">é</span><span class="pln">todo que separa a </span><span class="kwd">string</span><span class="pun">,</span><span class="pln"> de acordo com um caractere</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">no</span><span class="pln"> meu caso </span><span class="str">"\"
        ' Cada indice da minha matriz é um diretório, e o ultimo é o arquivo
        Dim sAuxArquivo As String() = Split(sArquivoOrigem, "</span><span class="pun">\</span><span class="str">")

        ' Crio uma variável, adicionando o meu Arquivo ao Zip
        ' Com ubound, eu pego o ultimo índice da minha matriz, que é o nome do meu arquivo.
        Dim objZipEntry As ZipEntry = New ZipEntry(sAuxArquivo(UBound(sAuxArquivo)))

        ' Seto a data de criação
        objZipEntry.DateTime = DateTime.Now

        ' Informo o tamanho do stream. (Do meu arquivo a ser zipado)
        objZipEntry.Size = strmFile.Length

        ' Fecho meu stream para liberar memória
        strmFile.Close()

        ' Adiciono no objeto para gerar o zip.
        strmZipOutputStream.PutNextEntry(objZipEntry)
        strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length)

        ' "</span><span class="pln">Limpo</span><span class="str">" o objeto
        strmZipOutputStream.Finish()
        strmZipOutputStream.Close()

        ' Aqui eu habilito o download do arquivo.
        ' Muito útil se você quiser salvar em diretórios protegidos
        ' Ou não acessível pela raíz do seu projeto web.
        HttpContext.Current.Response.TransmitFile(sDiretorioDestino &amp; sArquivoZip)

    End Sub</span></em></code></pre>
</div>
<h3>Descompactando um arquivo .zip</h3>
<p>Para descompactar um arquivo .zip você terá que informar o arquivo, e o diretório de destino.</p>
<div class="codigo">
<pre><code><span class="pln">

<em>    </em></span><em><span class="typ">Protected</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln"> btnDescompactar_Click</span><span class="pun">(</span><span class="typ">ByVal</span><span class="pln"> sender </span><span class="typ">As</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ByVal</span><span class="pln"> e </span><span class="typ">As</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">EventArgs</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Handles</span><span class="pln"> btnDescompactar</span><span class="pun">.</span><span class="typ">Click</span><span class="pln">
        descompactarZip</span><span class="pun">(</span><span class="pln">txtArquivoParaDescompactar</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">,</span><span class="pln"> txtDescompactarArquivos</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">)</span><span class="pln">
    </span><span class="typ">End</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln">

    </span><span class="str">''' &lt;summary&gt;
    '''</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln"> que descompacta um arquivo </span><span class="pun">.</span><span class="pln">zip apra um diret</span><span class="pun">ó</span><span class="pln">rio
    </span><span class="str">''' &lt;/summary&gt;
    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">param name</span><span class="pun">=</span><span class="str">"sArquivoZip"</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' Arquivo para ser descompactado
    '''</span><span class="pln"> </span><span class="pun">&lt;</span><span class="str">/param&gt;
    ''' &lt;param name="sDiretorioParaDescompactar"&gt;
    ''' Diretório para ser descompactado
    ''' &lt;/</span><span class="pln">param</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="str">''' &lt;remarks&gt;&lt;/remarks&gt;
    Private Sub descompactarZip(ByVal sArquivoZip As String, ByVal sDiretorioParaDescompactar As String)

        Dim oMeuZip As New FastZip

        '</span><span class="pln"> </span><span class="typ">Se</span><span class="pln"> o arquivo n</span><span class="pun">ã</span><span class="pln">o existe eu aviso o usu</span><span class="pun">á</span><span class="pln">rio
        </span><span class="typ">If</span><span class="pln"> </span><span class="typ">Not</span><span class="pln"> </span><span class="typ">File</span><span class="pun">.</span><span class="typ">Exists</span><span class="pun">(</span><span class="pln">sArquivoZip</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Then</span><span class="pln">
            lblErroDescompactar</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="str">"Arquivo zip não existe: "</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> sArquivoZip</span><span class="pun">)</span><span class="pln">
            </span><span class="typ">Exit</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln">
        </span><span class="typ">End</span><span class="pln"> </span><span class="typ">If</span><span class="pln">

        </span><span class="str">' Se o arquivo não for zip, eu aviso o usuário
        If LCase(Right(sArquivoZip, 3)) &lt;&gt; "zip" Then
            lblErroDescompactar.Text = ("Arquivo não é do formato .zip: " &amp; sArquivoZip)
            Exit Sub
        End If

        '</span><span class="pln"> </span><span class="typ">Se</span><span class="pln"> o arquivo n</span><span class="pun">ã</span><span class="pln">o </span><span class="kwd">for</span><span class="pln"> zip</span><span class="pun">,</span><span class="pln"> eu aviso o usu</span><span class="pun">á</span><span class="pln">rio
        </span><span class="typ">If</span><span class="pln"> </span><span class="typ">Not</span><span class="pln"> </span><span class="typ">Directory</span><span class="pun">.</span><span class="typ">Exists</span><span class="pun">(</span><span class="pln">sDiretorioParaDescompactar</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Then</span><span class="pln">
            lblErroDescompactar</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="str">"Diretório para descompactar os arquivos não existe: "</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> sDiretorioParaDescompactar</span><span class="pun">)</span><span class="pln">
            </span><span class="typ">Exit</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln">
        </span><span class="typ">End</span><span class="pln"> </span><span class="typ">If</span><span class="pln">

        </span><span class="str">' "Deszipo" o arquivo, sem nunca sobrescrever
        oMeuZip.ExtractZip(sArquivoZip, sDiretorioParaDescompactar, FastZip.Overwrite.Never)

        lblErroDescompactar.Text = "Arquivo Descompactado com sucesso!!!!!"
    End Sub
</span></em></code></pre>
</div>
<h3>Para você testar!</h3>
<p>Para que você possa testar, colocamos um formulário, e um código de inicialização da página.</p>
<h4>Formulário:</h4>
<div class="codigo">
<pre><code><span class="pln">
</span><em><span class="pun">&lt;</span><span class="tag">html</span><span class="pln"> </span><span class="atn">xmlns</span><span class="pun">=</span><span class="atv">"http://www.w3.org/1999/xhtml"</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;</span><span class="tag">head</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">title</span><span class="pun">&gt;</span><span class="pln">Criar Arquivos Zip em Asp.Net</span><span class="pun">&lt;/</span><span class="tag">title</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">style</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/css"</span><span class="pun">&gt;</span><span class="pln">
    body</span><span class="pun">,</span><span class="pln"> input</span><span class="pun">{</span><span class="pln">
    font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> verdana</span><span class="pun">;</span><span class="pln">
    font</span><span class="pun">-</span><span class="pln">size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">&lt;/</span><span class="tag">style</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="tag">head</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;</span><span class="tag">body</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="tag">form</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"form1"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">div</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">strong</span><span class="pun">&gt;</span><span class="pln">Este exemplo utiliza componentes de terceiros. Verifique o termo de uso.
                .</span><span class="pun">&lt;/</span><span class="tag">strong</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">br</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">br</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">fieldset</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">legend</span><span class="pun">&gt;</span><span class="pln">Criar Arquivo Zip do Diretório Inteiro </span><span class="pun">&lt;/</span><span class="tag">legend</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">table</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="str">border: none;</span><span class="atv">"</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            Diretório de Origem:
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:TextBox</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"txtOrigem"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Columns</span><span class="pun">=</span><span class="atv">"60"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:TextBox</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            Diretório de Destino:
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:TextBox</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"txtDestino"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Columns</span><span class="pun">=</span><span class="atv">"60"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:TextBox</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pln"> </span><span class="atn">colspan</span><span class="pun">=</span><span class="atv">"2"</span><span class="pun">&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:Button</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"btnGerar"</span><span class="pln"> </span><span class="atn">Text</span><span class="pun">=</span><span class="atv">"Gerar Zip do Diretório inteiro"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:Label</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"lblErro"</span><span class="pln"> </span><span class="atn">Font-Bold</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln"> </span><span class="atn">ForeColor</span><span class="pun">=</span><span class="atv">"red"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:Label</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">table</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;/</span><span class="tag">fieldset</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">br</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">   </span><span class="pun">&lt;</span><span class="tag">br</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">fieldset</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">legend</span><span class="pun">&gt;</span><span class="pln">Criar Arquivo Zip de um único Arquivo </span><span class="pun">&lt;/</span><span class="tag">legend</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">table</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="str">border: none;</span><span class="atv">"</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            Arquivo para ser "zipado":
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:TextBox</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"txtArquivoOrigem"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Columns</span><span class="pun">=</span><span class="atv">"60"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:TextBox</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            Diretório de Destino:
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:TextBox</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"txtArquivoDestino"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Columns</span><span class="pun">=</span><span class="atv">"60"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:TextBox</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pln"> </span><span class="atn">colspan</span><span class="pun">=</span><span class="atv">"2"</span><span class="pun">&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:Button</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"btnGerarArquivo"</span><span class="pln"> </span><span class="atn">Text</span><span class="pun">=</span><span class="atv">"Gerar Zip de um único Arquivo"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
                            </span><span class="pun">&lt;</span><span class="tag">asp:Label</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"lblErroArquivo"</span><span class="pln"> </span><span class="atn">Font-Bold</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln"> </span><span class="atn">ForeColor</span><span class="pun">=</span><span class="atv">"red"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:Label</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">table</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;/</span><span class="tag">fieldset</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;/</span><span class="tag">div</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">br</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">   </span><span class="pun">&lt;</span><span class="tag">br</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="tag">fieldset</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">legend</span><span class="pun">&gt;</span><span class="pln">Descompactar Arquivo .ZIP </span><span class="pun">&lt;/</span><span class="tag">legend</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;</span><span class="tag">table</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="str">border: none;</span><span class="atv">"</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        Arquivo para ser "deszipado":
                    </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">asp:TextBox</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"txtArquivoParaDescompactar"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Columns</span><span class="pun">=</span><span class="atv">"60"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:TextBox</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        Diretório para arquivos serem descompactados :
                    </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                        </span><span class="pun">&lt;</span><span class="tag">asp:TextBox</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"txtDescompactarArquivos"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Columns</span><span class="pun">=</span><span class="atv">"60"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:TextBox</span><span class="pun">&gt;</span><span class="pln">
                    </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">td</span><span class="pln"> </span><span class="atn">colspan</span><span class="pun">=</span><span class="atv">"2"</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">asp:Button</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"btnDescompactar"</span><span class="pln"> </span><span class="atn">Text</span><span class="pun">=</span><span class="atv">"Descompactar arquivo zip"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
                </span><span class="pun">&lt;</span><span class="tag">asp:Label</span><span class="pln"> </span><span class="atn">ID</span><span class="pun">=</span><span class="atv">"lblErroDescompactar"</span><span class="pln"> </span><span class="atn">runat</span><span class="pun">=</span><span class="atv">"server"</span><span class="pln"> </span><span class="atn">Font-Bold</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln"> </span><span class="atn">ForeColor</span><span class="pun">=</span><span class="atv">"red"</span><span class="pun">&gt;&lt;/</span><span class="tag">asp:Label</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">td</span><span class="pun">&gt;</span><span class="pln">
                </span><span class="pun">&lt;/</span><span class="tag">tr</span><span class="pun">&gt;</span><span class="pln">
            </span><span class="pun">&lt;/</span><span class="tag">table</span><span class="pun">&gt;</span><span class="pln">
        </span><span class="pun">&lt;/</span><span class="tag">fieldset</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="tag">form</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="tag">body</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="tag">html</span><span class="pun">&gt;</span><span class="pln">
</span></em></code></pre>
</div>
<h4>Inicialização da Página</h4>
<div class="codigo">
<pre><code><span class="pln">
<em>    </em></span><em><span class="typ">Protected</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln"> Page_Load</span><span class="pun">(</span><span class="typ">ByVal</span><span class="pln"> sender </span><span class="typ">As</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ByVal</span><span class="pln"> e </span><span class="typ">As</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">EventArgs</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Handles</span><span class="pln"> </span><span class="typ">Me</span><span class="pun">.</span><span class="typ">Load</span><span class="pln">

        </span><span class="typ">If</span><span class="pln"> </span><span class="typ">Not</span><span class="pln"> </span><span class="typ">Page</span><span class="pun">.</span><span class="typ">IsPostBack</span><span class="pln"> </span><span class="typ">Then</span><span class="pln">
            </span><span class="str">' Aqui eu dou um valor inicial, só para te ajudar a começar com um teste
            txtDestino.Text = Server.MapPath("") &amp; "\Destino\"
            txtOrigem.Text = Server.MapPath("") &amp; "\Origem\"

            '</span><span class="pln"> </span><span class="typ">Arquivo</span><span class="pln">
            txtArquivoDestino</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Server</span><span class="pun">.</span><span class="typ">MapPath</span><span class="pun">(</span><span class="str">""</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="str">"\Destino\"
            txtArquivoOrigem.Text = Server.MapPath("") &amp; "</span><span class="pun">\</span><span class="typ">Origem</span><span class="pun">\</span><span class="typ">Figura</span><span class="pun">.</span><span class="pln">jpg</span><span class="str">"

            ' Descompactar
            txtDescompactarArquivos.Text = Server.MapPath("") &amp; "</span><span class="pun">\</span><span class="typ">Descompactar</span><span class="pun">\</span><span class="str">"
            subInitDescompactarArquivos()
        End If

    End Sub

    ''' &lt;summary&gt;
    ''' Sub só para demonstação, para você poder dezipar um arquivo, depois de enviá-lo
    ''' &lt;/summary&gt;
    ''' &lt;remarks&gt;&lt;/remarks&gt;
    Protected Sub subInitDescompactarArquivos()
        Dim sArquivos As String()
        Dim sArquivo As String

        ' Seleciono todos os arquivos do tipo zip.
        sArquivos = Directory.GetFiles(txtArquivoDestino.Text, "</span><span class="pun">*.</span><span class="pln">zip</span><span class="str">")

        For Each sArquivo In sArquivos
            txtArquivoParaDescompactar.Text = sArquivo
            Exit For
        Next

    End Sub</span></em></code></pre>
</div>
<h3>Considerações finais</h3>
<p>É possível também trabalhar com arquivos .tar, Gzip e BZip2 de forma análoga.</p>
<p><em>Fonte: <a onclick="javascript:urchinTracker ('/outbound/article/www.pplware.com');" href="http://imasters.uol.com.br/artigo/7575/aspnet/crie_arquivos_zip_com_aspnet/" target="_blank">Imasters</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/crie-arquivos-zip-com-aspnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

