<?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/"
	>

<channel>
	<title>Eric Saboia</title>
	<atom:link href="http://eric.saboia.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://eric.saboia.org</link>
	<description>Desenvolvimento WEB e Tecnologias</description>
	<pubDate>Fri, 19 Jun 2009 15:12:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Múltiplas conexões no CodeIgniter: Cuidado!</title>
		<link>http://eric.saboia.org/2009/06/multiplas-conexoes-no-codeigniter-cuidado/</link>
		<comments>http://eric.saboia.org/2009/06/multiplas-conexoes-no-codeigniter-cuidado/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 19:28:37 +0000</pubDate>
		<dc:creator>Eric Saboia</dc:creator>
		
		<category><![CDATA[CodeIgniter]]></category>

		<category><![CDATA[Database]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Banco de dados]]></category>

		<category><![CDATA[Conexoes]]></category>

		<category><![CDATA[Múltiplas conexões]]></category>

		<guid isPermaLink="false">http://eric.saboia.org/?p=48</guid>
		<description><![CDATA[Não estou escrevendo aqui para explicar como se utilizar múltiplas conexões no CodeIgniter, para isso, acredito que a documentação esteja suficientemente clara (http://codeigniter.com/user_guide/database/index.html).
Vim falar dos perigos de utilizar conexão a mais de um banco de dados no CI:
Recentemente, comecei a ter problemas em um portal de grande acesso. O servidor começava a ficar cada vez [...]]]></description>
			<content:encoded><![CDATA[<p>Não estou escrevendo aqui para explicar como se utilizar múltiplas conexões no CodeIgniter, para isso, acredito que a documentação esteja suficientemente clara (http://codeigniter.com/user_guide/database/index.html).<br />
Vim falar dos perigos de utilizar conexão a mais de um banco de dados no CI:</p>
<p>Recentemente, comecei a ter problemas em um portal de grande acesso. O servidor começava a ficar cada vez mais lento, até crashar com um erro do MySQL 1040 (too many connections [Muitas conexões]). Abri o &#8220;Process List&#8221; do MySQL para investigar (Você pode acessar via phpmyadmin, outras IDEs ou direto pela query &#8220;show processlist&#8221;).</p>
<p>Não foi difícil perceber o problema: Existiam dezenas ou centenas de conexões com tempos cada vez maiores e com o status &#8220;Sleep&#8221;.</p>
<p>Sleep significa que existe uma conexão com o banco, porém o usuário (no caso minha aplicação PHP) não está mandando nem recebendo nenhum dado, simplesmente está parado esperando que algo aconteça. Se você não utiliza conexão persistente (O que era meu caso), isso pode acontecer por uma série de razões:<br />
- Alguma de suas páginas está demorando muito para ser carregada (Ou algo no código está gerando um loop infinito).<br />
- Algum Web Service externo está muito lento ou não está online e não foi setado um timeout adequado.<br />
- Existem muitas conexões ao Banco, enviando ou recebendo dados, o que gera uma fila de espera para as novas conexões que ficam aguardando.</p>
<p>De cara, a solução mais fácil (O que infelizmente não foi meu caso), é que eu estivesse utilizando conexão persistente nas configurações do meu banco. Para checar isso, basta abrir system/application/config/database.php e verificar se a configuração &#8220;pconnect&#8221; está setada para TRUE.</p>
<p>Nesse ponto alguns podem estar se perguntando: Opa, mas pera aí.. Conexão persistente não é aquela que é encerrada apenas explicitamente? Pois não sendo persistente, existe essa nota, direto da documentação do PHP:<br />
<strong>Nota: </strong>A conexão com o servidor será fechada assim que a execução do script terminar, a menos que tenha sido fechada anteriormente usando-se explicitamente mysql_close().</p>
<p>Pois bem, as vezes essa nota não se faz verdadeira, e com certeza foi pensando nisso que desenvolveram o seguinte código no final do arquivo system/codeigniter/CodeIgniter.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="">'CI_DB'</span><span style="color: #009900;">&#41;</span> AND <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>&#8220;Garantindo&#8221; assim, que no final da execução de qualquer página, a conexão com o banco seja explicitamente encerrada.</p>
<p>Êpa!! agora complicou mais ainda né? Minha conexão não está persistente, e ainda assim o CI fecha a conexão ao término da execução do script. Como pode existirem conexões não encerradas?</p>
<p>Queria saber em que arquivo essas conexões não fechadas estavam sendo abertas. Então, modifiquei a função db_connect dentro de system/database/drivers/mysql/mysql_driver.php para o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> db_connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">port</span> <span style="color: #339933;">!=</span> <span style="">''</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hostname</span> <span style="color: #339933;">.=</span> <span style="">':'</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">port</span>;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hostname</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span>;
&nbsp;
    <span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;[&quot;</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_thread_id</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;] CONEXÃO INICIADA NO ENDEREÇO: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'PHP_SELF'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; PARA {$this-&gt;hostname}
    &quot;</span>;
&nbsp;
    <span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;./system/application/public/conexao.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$conexao</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Com essa mosificação, comecei a gravar um log em TXT com todas as conexões abertas pelo CodeIgniter, identificando o ID de conexão com o banco, o arquivo em que essa conexão foi iniciada e para qual host a conexão apontava. Monitorando novamente o &#8220;Proccess List&#8221; e agora o log, comparei o ID das conexões que estavam com status &#8220;Sleep&#8221; a muito tempo e cheguei ao Controller onde todas as conexões não fechadas estavam sendo abertas.</p>
<p>Esse Controller não tinha nenhuma consulta demorada e muito menos um loop infinito. A única particularidade dele é que abria conexão a mais de um banco:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$DB2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span><span style="color: #009900;">&#40;</span><span style="">'banco2'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>O segundo parâmetro, TRUE, identifica que o objeto de conexão será retornado, ao invés de substituído no $this-&gt;db. É aí que está o problema:<br />
O CI cria uma nova conexão, mas não a encerra, pois a conexão encerrada ao fim do script, é a carregada dentro do $this-&gt;db.</p>
<p>Se você leu a função mostrada a pouco, deve ter reparado num quarto parâmetro no mysql_connect:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hostname</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>Segundo a documentação do PHP:<br />
Se uma segunda chamada é feita a <strong>mysql_connect() </strong>com os mesmos argumentos, não é estabelecida uma nova conexão, mas ao invés, o identificador da conexão que já esta aberta é retornado. O parâmetro new_link modifica este funcionamento e faz <strong>mysql_connect()</strong> sempre abrir uma nova conexão, mesmo que <strong>mysql_connect() </strong>seja chamado antes com os mesmos parâmetros.</p>
<p>Em geral, classes de database iniciam e fecham a conexão dentro da função query(). Sendo assim, não é necessário deixar esse parâmetro como TRUE, pois nunca teremos mais de uma conexão simultânea, por mais que utilizemos mais de um database.</p>
<p><strong>Resultado: </strong><br />
O PHP realmente não garante que todas as conexões sejam fechadas ao término do script;<br />
O CodeIgniter fecha manualmente a conexão. Porém, ao gerar uma nova conexão e retorná-la como objeto, essa não será fechada ao término da execução;</p>
<p><strong>Solução:</strong><br />
Ideal mesmo seria o CodeIgniter gravar em um array, na sua instância, o resource de todas as conexões abertas durante o script. Para então fechar uma por uma ao término da execução. Mas enquanto ele não faz isso:</p>
<p>Não retorne objetos de conexão: Encerre a conexão atual, destrua o objeto $this-db e retire o parâmetro &#8220;TRUE&#8221; do método load-&gt;database()).<br />
Sendo assim, carregue um database, faça as queries necessárias e recarregue o database default, caso ainda vá executar alguma query nele.</p>
<p><strong>Exemplo:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span> <span style="color: #339933;">=</span> <span style="">''</span>;
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span><span style="color: #009900;">&#40;</span><span style="">'banco2'</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000088;">$x</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;alguma query em outro banco&quot;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span> <span style="color: #339933;">=</span> <span style="">''</span>;
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span><span style="color: #009900;">&#40;</span><span style="">'default'</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000088;">$y</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;alguma query no banco default&quot;</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>.</p>
<p>Ahhh, duas observações:<br />
Criei uma solicitação no Bug Tracker do CodeIgniter sugerindo tal mudança.<br />
Quanto mais mexo no core do CodeIgniter, mais me apaixono por esse framework <img src='http://eric.saboia.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://eric.saboia.org/2009/06/multiplas-conexoes-no-codeigniter-cuidado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Integrando PHPUnit ao CodeIgniter</title>
		<link>http://eric.saboia.org/2009/03/integrando-phpunit-ao-codeigniter/</link>
		<comments>http://eric.saboia.org/2009/03/integrando-phpunit-ao-codeigniter/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 14:33:25 +0000</pubDate>
		<dc:creator>Eric Saboia</dc:creator>
		
		<category><![CDATA[CodeIgniter]]></category>

		<category><![CDATA[Metodologias Ágeis]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[Extreme Programming]]></category>

		<category><![CDATA[PHPUnit]]></category>

		<category><![CDATA[Testes Unitários]]></category>

		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://eric.saboia.org/?p=34</guid>
		<description><![CDATA[Irei mostrar como consegui rodar os testes unitários no framework CodeIgniter com o PHPUnit, através de um plugin chamado CIUnit.
Não irei abordar o porque de utilizar técnicas de Desenvolvimento Orientado a Testes, Extreme Programming, etc,  e nem detalhar o funcionamento do PHPUnit, que é muito similar ao JUnit. Caso seja seu primeiro contato com [...]]]></description>
			<content:encoded><![CDATA[<p>Irei mostrar como consegui rodar os testes unitários no framework <a href="http://codeigniter.com/" target="_blank">CodeIgniter</a> com o PHPUnit, através de um plugin chamado CIUnit.</p>
<p>Não irei abordar o porque de utilizar técnicas de <a href="http://www.improveit.com.br/xp/praticas/tdd" target="_blank">Desenvolvimento Orientado a Testes</a>, <a href="http://pt.wikipedia.org/wiki/Extreme_programming" target="_blank">Extreme Programming</a>, etc,  e nem detalhar o funcionamento do <a href="http://www.phpunit.de/" target="_blank">PHPUnit</a>, que é muito similar ao <a href="http://pt.wikipedia.org/wiki/JUnit" target="_blank">JUnit</a>. Caso seja seu primeiro contato com essas tecnologias, indico a leitura <a href="http://blog.diegotremper.com/archives/15" target="_blank">desse post</a>.</p>
<p>Em primeiro lugar, precisamos instalar o <a href="http://www.phpunit.de/" target="_blank">PHPUnit</a>, para isso basta executar na linha de comando “pear install phpunit/PHPUnit”, ou instalar manualmente. Como disse, não vou detalhar a instalação do PHPUnit, pois creio que fuja do tema. Caso queira, siga os passos de instalação <a href="http://www.phpunit.de/manual/current/en/installation.html" target="_blank">mostrados aqui</a>.</p>
<p><strong>Feito isso, vamos a instalação do CIUnit:</strong></p>
<p><strong>1.</strong> faca o download da ultima versão do CIUnit, <a href="http://www.knollet.com/foostack/" target="_blank">neste link</a>, e abra o arquivo. Iremos encontrar a seguinte estrutura dentro do ZIP baixado:<br />
fooStack/<br />
tests/<br />
índex.html<br />
CodeIgniter.php</p>
<p><strong>2.</strong> Copie a pasta fooStack para dentro do seu diretorio SeuProjeto/system/application/config/</p>
<p><strong>3.</strong> Copie a pasta tests para dentro do seu diretório SeuProjeto/system/application/</p>
<p><strong>4.</strong> Substitua o arquivo CodeIgniter.php no diretório SeuProjeto/system/codeigniter/ pelo contido no ZIP</p>
<p><strong>5.</strong> Abra o arquivo SeuProjeto/system/application/config/database.php e substitua a linha que começa com:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$active_group</span> <span style="color: #339933;">=</span></pre></div></div>

<p>por:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$env_used</span> <span style="color: #339933;">=</span> <span style="">'default'</span>; <span style="color: #666666; font-style: italic;">//Onde “default” deve ser o nome da sua base de produção</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="">'CIUnit_Version'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$env_used</span> <span style="color: #339933;">.=</span> <span style="">'_test'</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$active_group</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$env_used</span>;</pre></div></div>

<p>Essa modificação faz com que todos os seus testes sejam executados utilizando as configurações do database de tests ao invés do de produção. Perceba que todos os dados são deletados quando executamos um teste. Sendo assim, muito cuidado pra não esquecer esse passo, ou você poderá perder dados de produção.</p>
<p><strong>6.</strong> No mesmo arquivo do passo 5, crie as configurações do seu database de testes, usando o mesmo nome colocado a cima (default_test, no nosso casso). Para isso você pode simplesmente copiar as configurações do seu database de produção e modificar apenas o nome do database. Para isso, adicione essas linhas ao fim do seu arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Configurações do dabase de testes</span>
<span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="">'default_test'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="">'default'</span><span style="color: #009900;">&#93;</span>;
<span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="">'default_test'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="">'database'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;projeto_test&quot;</span>;</pre></div></div>

<p><strong>7. </strong>Crie o novo database com o sufixo _test (projeto_test, por exemplo) contendo a mesma estrutura do seu database de produção, essa base, como foi dito, será usada pra popular seus testes quando estes acessarem um banco de dados.</p>
<p></p>
<p><strong>Pronto! agora para executar os testes, abra a linha de comando e digite:</strong></p>
<ul>
<li>Para executar todos os testes: phpunit AllTests.php</li>
<li>Para executar um grupo de testes (Todos os models, por exemplo): phpunit ModelAllTests.php</li>
<li>Para executar um teste especifico: phpunit nomeDoTeste.php</li>
</ul>
<p>
Lembre-se que você precisa colocar o path na pasta onde o seu teste se encontra (Para testar todos os models, por exemplo, teríamos que colocar o path em: SeuProjeto/system/application/tests/models/).</p>
<p></p>
<p><strong>Não se esqueça</strong> de adicionar o path do seu phpunit aos paths do Windows, para isso você pode executar na linha de comando:</p>
<p>SET PATH=%PATH%;C:\php\pear (Onde C:\php\pear deve ser o diretório onde encontra-se o seu phpunit.bat).</p>
]]></content:encoded>
			<wfw:commentRss>http://eric.saboia.org/2009/03/integrando-phpunit-ao-codeigniter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A trilha para tornar-se um ZCE</title>
		<link>http://eric.saboia.org/2009/01/trilhagem-para-tornar-se-um-zce/</link>
		<comments>http://eric.saboia.org/2009/01/trilhagem-para-tornar-se-um-zce/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 18:22:54 +0000</pubDate>
		<dc:creator>Eric Saboia</dc:creator>
		
		<category><![CDATA[Certificação]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Provas]]></category>

		<category><![CDATA[ZCE]]></category>

		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://www.dingdong.com.br/eric/?p=17</guid>
		<description><![CDATA[Salve todos,
Esse é o primeiro de muitos posts onde irei relatar, passo a passo, minha caminhada para conseguir a certificação de desenvolvedor PHP da Zend (O chamado ZCE). A medida que tiver novas informações sobre meus estudos, ou algum fato que considere relevante, venho aqui expor. Pretendo assim que esta série de posts sirva de [...]]]></description>
			<content:encoded><![CDATA[<p>Salve todos,<br />
Esse é o primeiro de muitos posts onde irei relatar, passo a passo, minha caminhada para conseguir a certificação de desenvolvedor PHP da Zend (O chamado <a title="Certificações Zend" href="http://www.zend.com/en/services/certification/php-5-certification/" target="_blank">ZCE</a>). A medida que tiver novas informações sobre meus estudos, ou algum fato que considere relevante, venho aqui expor. Pretendo assim que esta série de posts sirva de &#8220;guia&#8221; para todos que desejem tirar a certificação. Vale lembrar que ainda não sou certificado e esses posts acontecerão ao longo do meu estudo. Sendo assim, não tenho como garantir que tal percurso funciona antes de eu mesmo fazer a prova, que pretendo realizar no meio de Março.</p>
<p>Em primeiro lugar, é fundamental pensar em qual material usaremos para estudar:<br />
Estou usando como guia o livro &#8220;<a title="Livro Guia" href="http://www.zend.com/en/store/php-certification/study-guide" target="_blank">Zend PHP 5 Certification Study Guide</a>&#8220;, vendido no site da zend em PDF ou conseguido facilmente pela internet.  O livro é dividido em áreas de conhecimento idênticas a da prova, isso facilita nossa estratégia de estudo (citada a baixo).</p>
<p>Além dele, o &#8220;<a href="http://www.amazon.com/Zend-Certification-Practice-Test-Book/dp/0973589884" target="_blank">The Zend PHP Certification Practice Test Book</a>&#8221; é composto unicamente por questões baseadas na prova, ajudando no estudo. Cada capítulo (também divididos por áreas iguais aos da prova) contêm 15 questões, com exceção dos capítulos 1, 2, 5 e 6, que contêm 20 por serem os capítulos fundamentais no estudo.</p>
<p>Por último, e talvez ainda mais importante, recomendo fortemente a compra dos <a title="Simulados" href="http://www.zend.com/en/store/php-certification/online-practice-testing" target="_blank">simulados da prova de certificação</a>, eles seguem o mesmo modelo da prova, dando a noção exata de como são abordadas as questões, além do tempo de prova (90 minutos), quantidade de questões (70), tipo de resposta (múltipla escolha ou aberta) e etc. Realmente vale a pena pagar por pelo menos 5 simulados (Eu comprei os 10&#8230; hehehe). A Zend afirma que os simulados se aproximam tanto da prova quanto se é possível, além de trazer questões de nível mais complexo. Sendo assim, se você se der bem nos simulados, dificilmente terá problemas na prova.</p>
<p>Agora que já conhecemos o material para estudos, vamos para a estratégia. Sim!! estratégia&#8230; Talvez a arma mais importante para se tirar uma certificação seja realmente a estratégia. Sem ela não será possível organizar seus estudos e muito menos passar na prova.</p>
<p>A estratégia que estou adotando é baseada nas dicas do <a href="http://horizontesdigitais.com/" target="_blank">Fernando Chucre</a>, que obteve sua certificação na segunda tentativa (Quando resolveu comprar os simulados). Ela parte do pre-suposto que você vai adquirir o material citado a cima.</p>
<p>Antes de mais nada, faça um simulado! Você pode pensar &#8220;Que?? mas eu nem comecei a estudar e já vou testar a prova?&#8221; Sim, começar fazendo o simulado é muito importante para deixar os pés no chão, além de já lhe dar uma idéia geral de como será a prova e portanto, como deve ser estudada. Após comprar os simulados, você receberá um link para realizar as provas, depois é só seguir as instruções.</p>
<p>No final da prova, você receberá uma tabela com cada área de conhecimento e sua pontuação (excellent, pass ou fail). A partir daí faremos nossa planilha que será crucial em nossa estratégia. Segue a baixo a foto de como fazer sua planilha:</p>
<p><img class="alignnone size-full wp-image-26" title="tabela_certificado" src="http://eric.saboia.org/wp-content/tabela_certificado.gif" alt="tabela_certificado" /></p>
<p>Como vocês podem ver, fui horrível no meu primeiro simulado (realizado hoje), mas como eu disse, isso me fez por os pés no chão pra meter a cabeça nos estudos, pois eu considerava que já conhecia bastante PHP e esperava ir bem melhor no teste. Olhando pra tabela, podemos verificar todas as áreas de conhecimento cobradas na prova (para ver os detalhes de cada área cobrada, <a href="http://www.zend.com/en/services/certification/php-5-certification/" target="_blank">clique aqui</a>). Para cada exame que realizar, irei preencher os valores correspondentes e assim dar continuidade a minha estratégia.</p>
<p>E voltando para ela&#8230; Agora que realizamos o primeiro exame e montamos nossa tabela, vamos iniciar a leitura do guia lendo o primeiro capítulo inteiro. Após terminar a leitura de cada capítulo, iremos ao livro prático realizar o teste das 15 (ou 20) questões referentes ao capítulo lido e conferir as respostas, revisando os possíveis erros pelo próprio guia ou pela documentação do PHP. Vamos continuar esse procedimento por todos os capítulos do guia.</p>
<p>Após terminar de ler todo o guia e resolver todas as questões do livro prático, iremos realizar nosso segundo simulado do exame. Preenchendo novamente na nossa tabelinha. E agora vem o ponto crucial de nossa estratégia:  Com a tabela preenchida, iremos reler no guia todos os capítulos onde obtivermos &#8220;Fail&#8221;, de preferência salve todas as questões do simulado (Com printscreen mesmo) e revise as que você acha (ou sabe) que errou pela documentação do PHP.</p>
<p>Imagino que no terceiro ou quarto simulado, você não vai receber mais nenhum &#8220;Fail&#8221;. Mesmo assim, caso não se sinta a vontade para realizar a prova, continue o procedimento citado a cima nas áreas onde você recebeu um &#8220;Pass&#8221; e não Excellent. Devemos lembrar ainda de dar uma atenção especial em caso de regressão em alguma área (Exemplo: Obtive &#8220;Pass&#8221; em OOP e no exame seguinte voltei ao &#8220;Fail&#8221;).</p>
<p>Quando estiver com uma boa pontuação nos exames, é só marcar a data do seu <a href="http://www.zend.com/en/store/php-certification/exam-voucher" target="_blank">voucher </a>e correr pro abraço <img src='http://eric.saboia.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://eric.saboia.org/2009/01/trilhagem-para-tornar-se-um-zce/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transferência entre selects múltiplos usando JQuery (Parte II)</title>
		<link>http://eric.saboia.org/2008/12/transferencia-entre-selects-multiplos-usando-jquery-parte-ii/</link>
		<comments>http://eric.saboia.org/2008/12/transferencia-entre-selects-multiplos-usando-jquery-parte-ii/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 14:07:01 +0000</pubDate>
		<dc:creator>Eric Saboia</dc:creator>
		
		<category><![CDATA[JavaScript e JQuery]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[JQuery]]></category>

		<category><![CDATA[Múltiplos Selects]]></category>

		<category><![CDATA[Transferência]]></category>

		<guid isPermaLink="false">http://www.dingdong.com.br/eric/?p=14</guid>
		<description><![CDATA[Salve todos,
Depois de muito tempo sem escrever, volto a este blog entregue as traças para completar a transferência entre selects de múltipla seleção.
Na primeira parte, vimos como transferir itens entre os dois selects, agora vamos salvar os valores marcados (ou seja, transferidos para o select da direita).
Em primeiro lugar, precisamos selecionar todos os itens do [...]]]></description>
			<content:encoded><![CDATA[<p>Salve todos,<br />
Depois de muito tempo sem escrever, volto a este blog entregue as traças para completar a transferência entre selects de múltipla seleção.</p>
<p><a href="http://www.dingdong.com.br/eric/?p=13">Na primeira parte</a>, vimos como transferir itens entre os dois selects, agora vamos salvar os valores marcados (ou seja, transferidos para o select da direita).</p>
<p>Em primeiro lugar, precisamos selecionar todos os itens do lado direito antes de enviar o formulário. Isso porque o HTML apenas submete os itens marcados e no nosso caso todos os itens do lado direito devem ser enviados, estando selecionados ou não.<br />
Para isso, vamos usar mais uma vez da simplicidade do <a href="http://jquery.com/">JQuery</a> criando uma função que será chamada antes de submetermos o formulário:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> envia<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
 $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lista2 option'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;selected&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;true&quot;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pronto, a função a cima irá selecionar todas as opções da lista 2. Agora basta chamar a função no envio do formulário adicionando o onSubmit=&#8221;envia();&#8221; na tag &lt;form&gt; das listas. Após submeter o formulário, as opções selecionadas já estarão disponíveis através de um array. Podemos então percorrer este array e utilizar o resultado da forma como quisermos. A seguir vai um pequeno exemplo de como podemos montar uma query de inserção no banco de dados:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="">'lista2'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$valor</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
 <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;INSERT INTO tabela (selecionados) VALUES ($valor)&quot;</span>;
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora é com vocês!</p>
]]></content:encoded>
			<wfw:commentRss>http://eric.saboia.org/2008/12/transferencia-entre-selects-multiplos-usando-jquery-parte-ii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transferência entre selects múltiplos usando JQuery (Parte I)</title>
		<link>http://eric.saboia.org/2008/02/transferencia-entre-selects-multiplos-usando-jquery-parte-i/</link>
		<comments>http://eric.saboia.org/2008/02/transferencia-entre-selects-multiplos-usando-jquery-parte-i/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 18:00:16 +0000</pubDate>
		<dc:creator>Eric Saboia</dc:creator>
		
		<category><![CDATA[JavaScript e JQuery]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[JQuery]]></category>

		<category><![CDATA[Múltiplos Selects]]></category>

		<category><![CDATA[Transferência]]></category>

		<guid isPermaLink="false">http://www.dingdong.com.br/eric/?p=13</guid>
		<description><![CDATA[Nessa primeira parte iremos mostrar como transferir itens entre dois selects usando JQuery, e o comparativo com JavaScript puro. Na segunda parte abordaremos como receber os valores deste Select Multiplo via PHP.
Primeiro, devemos incluir a biblioteca do JQuery, que você já deve ter baixado caso tenha lido o artigo anterior ( http://jquery.com/ ), no nosso [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa primeira parte iremos mostrar como transferir itens entre dois selects usando JQuery, e o comparativo com JavaScript puro. Na segunda parte abordaremos como receber os valores deste Select Multiplo via PHP.</p>
<p>Primeiro, devemos incluir a biblioteca do JQuery, que você já deve ter baixado caso tenha lido o artigo anterior ( http://jquery.com/ ), no nosso caso, ele fica dentro de uma pasta chamada dll na raiz do diretório:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">&gt;</span>
type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;../dll/jquery.js&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Agora devemos criar a função que fará a transferência entre os Selects:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> transfereItem<span style="color: #009900;">&#40;</span>idList<span style="color: #339933;">,</span> idList2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#&quot;</span><span style="color: #339933;">+</span>idList2<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#&quot;</span><span style="color: #339933;">+</span>idList<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot; option[@selected]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>A função a cima recebe o id das duas listas de seleção e adiciona na lista 2 todas as opções marcadas na lista 1 através da função append do JQuery. Repare também que com um simples option[@selected] conseguimos pegar todas as opções selecionadas da lista 1 (Você pode aprender mais sobre como &#8220;pegar&#8221; objetos através do JQuery <a href="http://docs.jquery.com/Selectors" target="_blank">clicando aqui:</a>).</p>
<p>Antes de seguir com o código, irei fazer uma demonstração de como poderíamos criar a mesma função através de JavaScript puro. Repare na diferença no número de linhas:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> transfereItem<span style="color: #009900;">&#40;</span>idList<span style="color: #339933;">,</span> idList2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> transferir <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #003366; font-weight: bold;">var</span> contador <span style="color: #339933;">=</span> 0;
    	<span style="color: #003366; font-weight: bold;">var</span> oldList <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>idList<span style="color: #009900;">&#41;</span>; 
	<span style="color: #003366; font-weight: bold;">var</span> opcoes <span style="color: #339933;">=</span> oldList.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;option&quot;</span><span style="color: #009900;">&#41;</span>; 
	<span style="color: #003366; font-weight: bold;">var</span> newList <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>idList2<span style="color: #009900;">&#41;</span>; 
&nbsp;
	<span style="color: #006600; font-style: italic;">// Pega as opcoes selecionadas</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> 0; i <span style="color: #339933;">&lt;</span> opcoes.<span style="color: #660066;">length</span>; i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>opcoes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">selected</span> <span style="color: #339933;">==</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			transferir<span style="color: #009900;">&#91;</span>contador<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> opcoes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>;
			contador++;
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// Passa para a nova lista</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> 0; i <span style="color: #339933;">&lt;</span> transferir.<span style="color: #660066;">length</span>; i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
		newList.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>transferir<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Impressionado com a diferença? Agora vamos continuar com nossos selects criando os mesmos:<br />
- Primeira lista com algumas opções para teste:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;lista1&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;lista1&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span> <span style="color: #000066;">multiple</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multiple&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span>&gt;</span>Um<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2&quot;</span>&gt;</span>Dois<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;3&quot;</span>&gt;</span>Três<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;4&quot;</span>&gt;</span>Quatro<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;5&quot;</span>&gt;</span>Cinco<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;6&quot;</span>&gt;</span>Seis<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">select</span>&gt;</span></pre></div></div>

<p>- Agora o segundo select para fazer a transferência:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;lista2[]&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;lista2&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span> <span style="color: #000066;">multiple</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multiple&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">select</span>&gt;</span></pre></div></div>

<p>Estamos quase terminando, agora só precisamos criar as setas para transferir os elementos entre os dois Selects, repare que também poderíamos fazer a transferência ao realizar um duplo clique em cima de um elemento através do evento &#8220;ondblclick&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;transfereItem('lista1', 'lista2');&quot;</span>&gt;</span> <span style="color: #ddbb00;">&amp;lt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;transfereItem('lista2', 'lista1');&quot;</span>&gt;</span> <span style="color: #ddbb00;">&amp;lt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>

<p>Pronto, os selects com transferência já estarão funcionando. Observe que passei dentro da função chamada no link o ID contido nos dois selects, indicando de qual para qual select os elementos irão ser transferidos.<br />
Você pode ver o exemplo do código funcionando <a href="exemplos/selects/index.php" target="_blank">clicando aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://eric.saboia.org/2008/02/transferencia-entre-selects-multiplos-usando-jquery-parte-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Iniciando o uso do JQuery.</title>
		<link>http://eric.saboia.org/2008/02/iniciando-o-uso-do-jquery/</link>
		<comments>http://eric.saboia.org/2008/02/iniciando-o-uso-do-jquery/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 20:55:04 +0000</pubDate>
		<dc:creator>Eric Saboia</dc:creator>
		
		<category><![CDATA[JavaScript e JQuery]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.dingdong.com.br/eric/?p=4</guid>
		<description><![CDATA[Meu primeiro Post vem falar sobre uma das minhas descobertas mais felizes na área tecnológica nos últimos tempos:
Trata-se de uma FrameWork feita para JavaScript que, com certeza, vai lhe poupar muito tempo em desenvolvimento nessa linguagem, incluindo o tratamento de AJAX.
Existem muitas FrameWorks pra JS, porém algo que me chamou muita atenção no JQuery foi [...]]]></description>
			<content:encoded><![CDATA[<p>Meu primeiro Post vem falar sobre uma das minhas descobertas mais felizes na área tecnológica nos últimos tempos:<br />
Trata-se de uma FrameWork feita para JavaScript que, com certeza, vai lhe poupar muito tempo em desenvolvimento nessa linguagem, incluindo o tratamento de AJAX.</p>
<p>Existem muitas FrameWorks pra JS, porém algo que me chamou muita atenção no JQuery foi a possibilidade de realizar várias ações em um elemento e a possibilidade de se realizar uma ação em muitos elementos sem a necessidade de se criar um loop.</p>
<p>Abaixo vão algumas comparações entre o Prototype (Outra grande FrameWork), o Jquery e JavaScript puro:<br />
- Adicionando uma classe e exibindo uma div:</p>
<p><strong>- JQuery:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#idDiv'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p><strong>- Prototype:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'idDiv'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p><strong>- JavaScript:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'idDiv'</span><span style="color: #009900;">&#41;</span>;
div.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'ativo'</span>;
div.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'block'</span>;</pre></div></div>

<p>&nbsp;</p>
<p>Notamos a diferença entre o Javascript e as frameworks, mas e se quiséssemos aplicar essa classe e mostrar todas as divs da página? Faríamos algo mais ou menos assim:</p>
<p><strong>- JQuery:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p><strong>- Prototype:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;">$A<span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span>
	<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>elemento<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		elemento.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#41;</span>;</pre></div></div>

<p><strong>- Javascript: </strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> divs <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div&quot;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> 0; i ++; divs.<span style="color: #660066;">length</span>; i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	div<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'ativo'</span>;
	div<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'block'</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>&nbsp;</p>
<p>Agora fica claro a vantagem do Jquery em relação ao Prototype: Em quanto no prototype precisamos realizar as ações dentro de um Loop, no Jquery resolvemos todo o problema em uma linha.</p>
<p>Além disso, existem mais alguns pontos que me chamaram a atenção sobre o Jquery:<br />
- Tamanho da FrameWork (aproximadamente 28kbs compactado)<br />
- Documentação muito simples de ser usada (http://docs.jquery.com/)<br />
- Comunidade Brasileira comprometida com o produto (http://www.jquerybrasil.com/)<br />
- Livre para download e desenvolvimento.</p>
<p>Espero ter despertado interesse sobre o JQuery, pois uma vez que começamos a usá-lo, até esquecemos do velho JavaScript puro.</p>
]]></content:encoded>
			<wfw:commentRss>http://eric.saboia.org/2008/02/iniciando-o-uso-do-jquery/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
