<?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>Pedro Elsner, Profissional de TI</title>
	<atom:link href="http://pedroelsner.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pedroelsner.com</link>
	<description></description>
	<lastBuildDate>Tue, 07 Oct 2014 10:46:01 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.6.14</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
	<item>
		<title>Pesquisando em relações HABTM no CakePHP</title>
		<link>http://pedroelsner.com/2012/09/pesquisando-em-associacoes-habtm-no-cakephp/</link>
		<comments>http://pedroelsner.com/2012/09/pesquisando-em-associacoes-habtm-no-cakephp/#comments</comments>
		<pubDate>Wed, 26 Sep 2012 03:00:32 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[bindModel]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[contain]]></category>
		<category><![CDATA[containable]]></category>
		<category><![CDATA[filter results]]></category>
		<category><![CDATA[habtm]]></category>
		<category><![CDATA[habtm cakephp]]></category>
		<category><![CDATA[joins]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=557</guid>
		<description><![CDATA[Recebo muitas dúvidas por e-mail perguntando como fazer o plugin Filter Results pesquisar em relações HABTM. Então, estou reciclando este post para mostrar como fazer isso de forma simples e sem mistérios, sem ou com o plugin. =) O manual do CakePHP &#8211; Cookbook &#8211; tem as principais explicações para trabalhar com qualquer tipo de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Recebo muitas dúvidas por e-mail perguntando como fazer o plugin <a href="http://pedroelsner.com/2012/06/plugin-filter-results-para-cakephp-2-x/" title="Utilizando Filter Results no CakePHP 2">Filter Results</a> pesquisar em relações HABTM. Então, estou reciclando este post para mostrar como fazer isso de forma simples e sem mistérios, sem ou com o plugin. =)<span id="more-557"></span></p>
<p>O manual do CakePHP &#8211; <a href="http://book.cakephp.org/pt" title="Manual CakePHP 1.3" target="_blank">Cookbook</a> &#8211; tem as principais explicações para trabalhar com qualquer tipo de consulta. Portanto, não vou explorar aqui todas elas, mas sim as que o ele não contempla. Se você utiliza o CakePHP a pouco tempo, recomendo a leitura do mesmo.</p>
<h1>Situação</h1>
<p>Para nossos exemplos vamos supor o seguinte relacionamento (utilizando os <a href="http://book.cakephp.org/pt/view/901/Conven%C3%A7%C3%B5es-no-CakePHP" title="Convenções no CakePHP" target="_blank">convenções</a> do CakePHP):</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788270.js"></script></div>
<p>Ou seja, um Post pode ter muitas Categorias e vice-versa.<br />
Temos então no banco de dados 3 tabelas:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788283.js"></script></div>
<h1>Problema</h1>
<p>Vamos supor a seguinte situação: <strong>Desejamos selecionar todos os Posts de uma Category específica</strong>.</p>
<p>De uma forma ou de outra você conseguirá fazer isso. Porém, pode não ser a maneira correta. Por exemplo, se você utilizar o <a href="http://book.cakephp.org/pt/view/1323/Containable" title="Containable" target="_blank">Containable</a>, provavelmente o cake irá fazer 2 ou mais selects no banco de dados e depois fazer um &#8220;merge&#8221; nos resultados.</p>
<p>Sendo direto ao ponto, o problema de utilizar HABTM são os excessos de consultas realizadas pelo CakePHP no banco de dados. Então, veremos algumas maneiras de obter uma query equivalente a esta:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788301.js"></script></div>
<h1>Soluções</h1>
<p>Para conseguirmos a query que desejamos, precisamos que o model Post tenha relacionamentos/associações <strong>hasOne</strong> para as tabelas: <strong>categories_posts</strong> e <strong>categories</strong>.</p>
<blockquote><p>Por convenção, sempre que o CakePHP for juntar uma tabela com nomes compostos, apenas o último nome fica no singular. Por exemplo:</p>
<p>categories_posts -> CategoriesPost<br />
pedidos_produtos -> PedidosProduto<br />
itens_pedidos_produtos -> ItensPedidosProduto<br />
grupos_usuarios_permissoes -> GruposUsuariosPermissao</p></blockquote>
<h1>1. Joins</h1>
<p>Utilizar <a href="http://book.cakephp.org/pt/view/1047/Ligando-Tabelas" title="Ligando Tabelas - Joins" target="_blank">Joins</a> é a primeira coisa que você deve aprender no CakePHP. Ele te salva em várias ocasiões, porém perde pela falta da versatilidade comparado com os outros recursos que ainda mostrarei.</p>
<p>Utilizando-o, nosso código ficará assim:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788355.js"></script></div>
<p>Resultado:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788367.js"></script></div>
<h1>2. BindModel</h1>
<p>Utilizando o <a href="http://book.cakephp.org/pt/view/1044/hasAndBelongsToMany-HABTM" title="BindModel" target="_blank">BindModel</a>, vamos criar quantas associações dinâmicas forem necessárias para a nossa pesquisa:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788374.js"></script></div>
<p>Resultado:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788387.js"></script></div>
<h1>3. Containable</h1>
<p>Esta é a melhor solução. Este behaviour mudou completamente a minha maneira de montar as associações das tabelas no CakePHP.</p>
<blockquote><p>Antes de tudo, você deve habilitar o behaviros <code>Containable</code> no model desejado ou no <code>app_model</code>:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2788396.js"></script></div>
</p></blockquote>
<p>Basicamente, vamos criar &#8220;hacks&#8221; de associações nos models desejados e chama-las em nossas consultas. Portanto, vamos acrescentar estas associações <code>hasOne</code> em nosso model Post.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788405.js"></script></div>
<p>Agora com os &#8220;hacks&#8221; devidamente criados no model, vamos fazer nossa pesquisa de forma muito simples:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788418.js"></script></div>
<p>Resultado:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2788427.js"></script></div>
<h1>Conclusão</h1>
<p>Claro que os exemplos aqui citados foram simplórios, apenas para você ter uma ideia de como e qual solução utilizar. Entretanto, se conselho fosse bom se vendia, porém, insisto que você utilize sempre <strong>containable</strong>.</p>
<p>Você pode conforme for criando as associações HABTM da sua aplicação, criar também os &#8220;hacks&#8221; <strong>hasOne</strong> necessários. Além disso, pode também configurar o <a href="http://book.cakephp.org/pt/view/1063/recursive" title="Recursive" target="_blank">Recursive</a> de todos os models como <strong>-1</strong> e eliminar todas as consultas indesejadas realizadas pelo CakePHP de forma &#8220;automágica&#8221;.</p>
<p>Qualquer dúvida é só deixar um comentário. ^^&#8217;<br />
Até!</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/09/pesquisando-em-associacoes-habtm-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Entendendo Join, Keep e Concatenate no QlikView</title>
		<link>http://pedroelsner.com/2012/09/entendendo-join-keep-e-concatenate-do-qlikview/</link>
		<comments>http://pedroelsner.com/2012/09/entendendo-join-keep-e-concatenate-do-qlikview/#comments</comments>
		<pubDate>Tue, 11 Sep 2012 12:43:06 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[QlikView]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[concatenate]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[keep]]></category>
		<category><![CDATA[qlikview]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1860</guid>
		<description><![CDATA[Faz um bom tempo que eu querida fazer este post, mas como há ótimos materiais em inglês sobre o assunto, sempre optava por algo inédito. Introdução Preparar uma nuvem para QlikView sem utilizar as funções Join, Keep e Concatenate é uma tarefa impossível para base de dados complexas. Utilizamos estas funções para formatar e moldar [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Faz um bom tempo que eu querida fazer este post, mas como há ótimos materiais em inglês sobre o assunto, sempre optava por algo inédito.<span id="more-1860"></span></p>
<h1>Introdução</h1>
<p>Preparar uma nuvem para QlikView sem utilizar as funções <strong>Join</strong>, <strong>Keep</strong> e <strong>Concatenate</strong> é uma tarefa impossível para base de dados complexas. Utilizamos estas funções para formatar e moldar a nuvem, afim de que ela fique padronizada e bem estruturada. Porém, para isso precisamos entender muito bem a diferença entre elas.</p>
<p>Neste post iremos utilizar duas tabelas de exemplo. Note que ambas serão &#8220;lincadas&#8221; pelo campo <code>Chave</code>, que a <code>Tabela1</code> possuí a <code>Chave=3</code> que não esta presente na <code>Tabela2</code> e que a <code>Tabela2</code> possuí a <code>Chave=4</code> que não esta presente na <code>Tabela1</code>:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3693440.js"></script></div>
<p><strong>Tabela 1</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
</tr>
<tr>
<td>3</td>
<td>A3</td>
</tr>
</tbody>
</table>
</div>
<p><strong>Tabela 1</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>C2</td>
</tr>
<tr>
<td>4</td>
<td>C3</td>
</tr>
</tbody>
</table>
</div>
<h1>Join</h1>
<p>Vamos utilizar o comando <code>Join</code> para transferir campos específicos da <code>Tabela2</code> para <code>Tabela1</code>. O primeiro campo deve ser sempre o que irá relacionar as duas tabelas.</p>
<h2>Outer Join</h2>
<ul>
<li><code>Outer</code> irá retornar as linhas que coincidirem/não coincidirem com a outra tabela.</li>
</ul>
<div class="gist-for-robots"><script src="http://gist.github.com/3697806.js"></script></div>
<p><strong>Tabela 1</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
<td>C2</td>
</tr>
<tr>
<td>3</td>
<td>A3</td>
<td>&#8211;</td>
</tr>
<tr>
<td>4</td>
<td>&#8211;</td>
<td>C3</td>
</tr>
</tbody>
</table>
</div>
<h2>Left Join</h2>
<ul>
<li><code>Left</code> irá retornar as linhas da tabela da esquerda e os campos da tabela da direita.</li>
</ul>
<div class="gist-for-robots"><script src="http://gist.github.com/3697857.js"></script></div>
<p><strong>Tabela 1</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
<td>C2</td>
</tr>
<tr>
<td>3</td>
<td>A3</td>
<td>&#8211;</td>
</tr>
</tbody>
</table>
</div>
<h2>Right Join</h2>
<ul>
<li><code>Right</code> irá retornar as linhas da tabela da direita e os campos da tabela da esquerda.</li>
</ul>
<div class="gist-for-robots"><script src="http://gist.github.com/3697884.js"></script></div>
<p><strong>Tabela 1</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
<td>C2</td>
</tr>
<tr>
<td>4</td>
<td>&#8211;</td>
<td>C3</td>
</tr>
</tbody>
</table>
</div>
<h2>Inner Join</h2>
<ul>
<li><code>Inner</code> irá retornar SOMENTE as linhas que coincidirem em AMBAS as tabelas.</li>
</ul>
<div class="gist-for-robots"><script src="http://gist.github.com/3697907.js"></script></div>
<p><strong>Tabela 1</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
<td>C2</td>
</tr>
</tbody>
</table>
</div>
<h1>Keep</h1>
<p>O comando <code>Keep</code> entre dois <code>Load</code> ou <code>Select</code>, diferente do <code>Join</code>, tem o efeito de reduzir os dados de uma ou de outra baseado na intersecção dos dados da tabela. O <code>Keep</code> deve ser precedido de um prefixo <code>Left</code>, <code>right</code> ou <code>Inner</code>.</p>
<p>Todavia, as duas tabelas não serão agrupadas, mas serão salvas no QlikView como duas tabelas diferentes.</p>
<h2>Left Keep</h2>
<div class="gist-for-robots"><script src="http://gist.github.com/3698006.js"></script></div>
<p><strong>Tabela 1 Keep</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
</tr>
<tr>
<td>3</td>
<td>A3</td>
</tr>
</tbody>
</table>
</div>
<p><strong>Tabela 2 Keep</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>C2</td>
</tr>
</tbody>
</table>
</div>
<h2>Right Keep</h2>
<div class="gist-for-robots"><script src="http://gist.github.com/3698038.js"></script></div>
<p><strong>Tabela 1 Keep</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
</tr>
</tbody>
</table>
</div>
<p><strong>Tabela 2 Keep</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>C2</td>
</tr>
<tr>
<td>4</td>
<td>C3</td>
</tr>
</tbody>
</table>
</div>
<h2>Inner Keep</h2>
<div class="gist-for-robots"><script src="http://gist.github.com/3698043.js"></script></div>
<p><strong>Tabela 1 Keep</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
</tr>
</tbody>
</table>
</div>
<p><strong>Tabela 2 Keep</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>C2</td>
</tr>
</tbody>
</table>
</div>
<h1>Concatenate</h1>
<p>Agora veremos o comando <code>Concatenate</code>. Este comando apenas adiciona as linhas de uma tabela da outra, ou seja, ele nunca unirá qualquer linha. Veja um exemplo dos dados após o <code>Concatenate</code>:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3698109.js"></script></div>
<p><strong>Tabela 1 Concatenate</strong></p>
<div style="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>A</td>
</th>
<th>C</td>
</th>
</tr>
<tbody>
<tr>
<td>1</td>
<td>A1</td>
<td>&#8211;</td>
</tr>
<tr>
<td>1</td>
<td>&#8211;</td>
<td>C1</td>
</tr>
<tr>
<td>2</td>
<td>A2</td>
<td>&#8211;</td>
</tr>
<tr>
<td>2</td>
<td>&#8211;</td>
<td>C2</td>
</tr>
<tr>
<td>3</td>
<td>A3</td>
<td>&#8211;</td>
</tr>
<tr>
<td>4</td>
<td>&#8211;</td>
<td>C3</td>
</tr>
</tbody>
</table>
</div>
<h1>Dúvidas?</h1>
<p>Espero ter ajudado. ^^<br />
Qualquer dúvida é só comentar. =)<br />
Até!</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/09/entendendo-join-keep-e-concatenate-do-qlikview/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Navegação Estruturada com Full Breadcrumb no WordPress</title>
		<link>http://pedroelsner.com/2012/08/navegacao-estruturada-com-full-breadcrumb-no-wordpress/</link>
		<comments>http://pedroelsner.com/2012/08/navegacao-estruturada-com-full-breadcrumb-no-wordpress/#comments</comments>
		<pubDate>Sun, 26 Aug 2012 15:54:45 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[breadcrumb]]></category>
		<category><![CDATA[navegação estruturada]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1851</guid>
		<description><![CDATA[Enfim, publiquei mais um plugin. Adicione links de navegação estruturada para todas as páginas no WordPress. Este plugin é compatível com taxonomies hierárquicas. Aproveite =) Full Breadcrumb Exibe links de navegação estruturada em páginas, posts, custom posts, categorias, taxonomies, tags, autores, anexos e arquivos. Compatibilidade Compatível com WordPress 2.8+ Instalação Baixe o plugin no GitHub [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Enfim, publiquei mais um plugin. Adicione links de navegação estruturada para todas as páginas no WordPress. Este plugin é compatível com taxonomies hierárquicas. Aproveite =)<span id="more-1851"></span></p>
<h1>Full Breadcrumb</h1>
<p>Exibe links de navegação estruturada em páginas, posts, custom posts, categorias, taxonomies, tags, autores, anexos e arquivos.</p>
<h2>Compatibilidade</h2>
<ul>
<li>Compatível com WordPress 2.8+</li>
</ul>
<h1>Instalação</h1>
<p>Baixe o plugin no <a href="https://github.com/pedroelsner/full-breadcrumb" title="Full Breadcrumb">GitHub</a> ou no <a href="http://wordpress.org/extend/plugins/full-breadcrumb/" title="Full Breadcrumb">repositório do WordPress</a>.</p>
<p>Descompacte os arquivos, faça o upload da pasta em <code>/wp-content/plugins/</code> e ative o plugin.</p>
<h1>Utilização</h1>
<p>Coloque o seguinte código <code><?php if (function_exists('show_full_breadcrumb')) show_full_breadcrumb(); ?></code> no seu tema e pronto!</p>
<p>Ou, para pegar os links: <code><?php if (function_exists('get_full_breadcrumb')) $var = get_full_breadcrumb(); ?></code></p>
<h1>Customizações</h1>
<h2>Básica</h2>
<div class="gist-for-robots"><script src="http://gist.github.com/3481591.js"></script></div>
<h2>Avançada</h2>
<div class="gist-for-robots"><script src="http://gist.github.com/3481629.js"></script></div>
<h2>Tradução para Português</h2>
<div class="gist-for-robots"><script src="http://gist.github.com/3481701.js"></script></div>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/08/navegacao-estruturada-com-full-breadcrumb-no-wordpress/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Forçando a atualização de thumbnails no WordPress</title>
		<link>http://pedroelsner.com/2012/08/forcando-a-atualizacao-de-thumbnails-no-wordpress/</link>
		<comments>http://pedroelsner.com/2012/08/forcando-a-atualizacao-de-thumbnails-no-wordpress/#comments</comments>
		<pubDate>Thu, 16 Aug 2012 00:45:59 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[regenerate thumbnail]]></category>
		<category><![CDATA[thumbnail]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1817</guid>
		<description><![CDATA[Quem trabalha com WordPress, pelo menos uma, já tentou se matar de tanta raiva ao utilizar thumbnails com formatos personalizados. Pois é, tem horas que o WordPress fica maluco e nem Chuck Norris consegue exibir os thumbnails corretamente&#8230; Force Regenerate Thumbnails Baseado no plugin Regeneration Thumbnails de Viper007bond, o Force Regenerate Thumbnails tem uma proposta [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quem trabalha com WordPress, pelo menos uma, já tentou se matar de tanta raiva ao utilizar thumbnails com formatos personalizados. Pois é, tem horas que o WordPress fica maluco e nem Chuck Norris consegue exibir os thumbnails corretamente&#8230;<span id="more-1817"></span></p>
<h1>Force Regenerate Thumbnails</h1>
<p>Baseado no plugin <a href="http://wordpress.org/extend/plugins/regenerate-thumbnails/" title="Regenerate Thumbnails" target="_blank">Regeneration Thumbnails</a> de <a href="http://www.viper007bond.com/" title="Viper007bond" target="_blank">Viper007bond</a>, o <a href="http://wordpress.org/extend/plugins/force-regenerate-thumbnails/" title="Force Regenerate Thumbnails WordPress" target="_blank">Force Regenerate Thumbnails</a> tem uma proposta diferente, uma vez que ele apaga todos os thumbnails antigo e REALMENTE gera NOVOS thumbnails.</p>
<blockquote><p>Em alguns trabalhos, sempre que eu inventei <del datetime="2012-08-16T00:15:49+00:00">moda</del> tentando alterar a ordem das declarações <code>add_image_size</code> ou adicionar novos formatos de thumbnails, o WordPress ficou maluco. </p>
<p>Executava diversas vezes o plugin Regenerate Thumbnails e nada&#8230; mudava os tamanhos e executava novamente e nada também&#8230; alguns eram corrigidos mas outros não. Enfim&#8230; tenho certeza que se você não passou por isso, já viu algum tópico de um desesperado sobre o assunto.</p></blockquote>
<h2>Compatibilidade</h2>
<ul>
<li>Compatível com WordPress 2.8+</li>
</ul>
<h1>Instalação</h1>
<p>Baixe o plugin no <a href="https://github.com/pedroelsner/force-regenerate-thumbnails" title="Force Regenerate Thumbnails" target="_blank">GitHub</a> ou no <a href="http://wordpress.org/extend/plugins/force-regenerate-thumbnails/" title="Force Regenerate Thumbnails" target="_blank">repositório do WordPress</a>.</p>
<p>Descompacte os arquivos, faça o upload da pasta em <code>/wp-content/plugins/</code> e ative o plugin.</p>
<h1>Utilização</h1>
<p>Você pode regenerar os thumbnails de todas as imagens do website através do menu <code>Ferramentas -> Force Regenerate Thumbnails</code>, ou se preferir pode regenerar apenas de imagens específicas através da <code>Biblioteca de Mídias</code>.</p>
<h1>Telas</h1>
<div class="left">
<img src="http://pedroelsner.com/wp-content/uploads/2012/08/screenshot-1.png" alt="" title="Force Regenerate Thumbnails 01" class="img-thumbnail" />
</div>
<div class="left">
<img src="http://pedroelsner.com/wp-content/uploads/2012/08/screenshot-2.png" alt="" title="Force Regenerate Thumbnails 02" class="img-thumbnail" />
</div>
<div class="clear"></div>
<h1>Conclusão</h1>
<p>&#8220;Seus problemas acabaram-se!!!&#8221; =D</p>
<p>Valeu! Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/08/forcando-a-atualizacao-de-thumbnails-no-wordpress/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Máscara jQuery para novo dígito de celular em São Paulo</title>
		<link>http://pedroelsner.com/2012/07/mascara-jquery-para-novo-digito-de-celular-em-sao-paulo/</link>
		<comments>http://pedroelsner.com/2012/07/mascara-jquery-para-novo-digito-de-celular-em-sao-paulo/#comments</comments>
		<pubDate>Mon, 30 Jul 2012 00:17:50 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[mask]]></category>
		<category><![CDATA[maskedinput]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1796</guid>
		<description><![CDATA[Como foi muito divulgado, hoje os números de celulares de São Paulo (DDD 11) ganharam mais um dígito. Por este motivo, estou passando rapidamente para compartilhar a minha solução para a nova máscara. Motivo da mudança A mudança nos números segue a Resolução nº 553/2010 da Anatel e tem como objetivo eliminar o problema de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Como foi muito divulgado, hoje os números de celulares de São Paulo (DDD 11) ganharam mais um dígito. Por este motivo, estou passando rapidamente para compartilhar a minha solução para a nova máscara.<span id="more-1796"></span></p>
<h1>Motivo da mudança</h1>
<p>A mudança nos números segue a Resolução nº 553/2010 da Anatel e tem como objetivo eliminar o problema de falta de numeração da área de registro 11. Os números passarão a ter o formato <strong>(11) 9XXXX-XXXX</strong> com o acréscimo do nono dígito à esquerda.</p>
<p>A medida elevará a capacidade de numeração da região 11 para 370 milhões, eliminando definitivamente o problema de escassez de numeração móvel em São Paulo.</p>
<h1>Máscara</h1>
<p>Em meus projetos utilizo o plugin <a href="https://github.com/digitalBush/jquery.maskedinput" title="jQuery Masked Input" target="_blank">jQuery Masked Input</a> ou o <a href="https://github.com/fabiomcosta/jquery-meiomask" title="jQuery Meio Mask" target="_blank">jQuery Meio Mask</a> para adicionar máscaras aos campos dos formulários. A utilização de ambos é muito simples. Ambos também são compatível com IE6. Recomendo! ^^</p>
<p>Os números de telefone fixo não sofreram alteração, então continam com a mascará antiga:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3212264.js"></script></div></p>
<h2>JQuery Masked Input</h2>
<p>Para celulares, utilizaremos o carácter <code>?</code> que permite uma exceção a máscara, alterando ela para o seguinte formato: <code>(99) 9999-9999?9</code>. Porém, não queremos adicionar um dígito no final, mas deixa-lo com 5 dígitos de prefixo. Para isso, adicionamos um evento para quando o usuário deixar o campo, o mesmo tenha sua mascará ajustada.<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3212276.js"></script></div></p>
<h2>jQuery Meio Mask</h2>
<p>Adicionaremos um digito a mais no final da máscara ficando assim: <code>(99) 9999-99999</code>. Depois adicionamos o evento de substituição da máscara de acordo com o número informado.<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3348613.js"></script></div></p>
<blockquote><h2>Atualização: 18/12/2013</h2>
<p>Muitas almas caridosas postaram diversas maneiras de fazer a mascará  nos comentários abaixo. Todas estão funcionando. Escolha!</p>
<p><em>PS: A maioria deles alegam ser a melhor forma de fazer&#8230; rs&#8230; sabe como é, orgulho de de programador =)</em></p>
</blockquote>
<p>Simples não?<br />
Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/07/mascara-jquery-para-novo-digito-de-celular-em-sao-paulo/feed/</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
		<item>
		<title>Adicionando parâmetros ao WP_query do WordPress</title>
		<link>http://pedroelsner.com/2012/07/criando-parametros-personalizados-para-wp_query/</link>
		<comments>http://pedroelsner.com/2012/07/criando-parametros-personalizados-para-wp_query/#respond</comments>
		<pubDate>Mon, 23 Jul 2012 00:16:51 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP_query]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1779</guid>
		<description><![CDATA[Trabalhar com o WordPress é sempre muito simples. Hoje precisei fazer uma consulta utilizando WP_query onde as opções padrões não suportavam, então rapidamente, criei a minha opção. =D WP_query A classe WP_query é a responsável por realizar consultas no banco de dados do WordPress. No maior estilo CakePHP, você passa para ela argumentos em array [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Trabalhar com o WordPress é sempre muito simples. Hoje precisei fazer uma consulta utilizando <a href="http://codex.wordpress.org/Class_Reference/WP_Query" title="WP_query" target="_blank">WP_query</a> onde as opções padrões não suportavam, então rapidamente, criei a minha opção. =D<span id="more-1779"></span></p>
<h1>WP_query</h1>
<p>A classe <a href="http://codex.wordpress.org/Class_Reference/WP_Query" title="WP_query" target="_blank">WP_query</a> é a responsável por realizar consultas no banco de dados do WordPress. No maior estilo <a href="http://cakephp.org/" title="CakePHP" target="_blank">CakePHP</a>, você passa para ela argumentos em <code>array</code> para formular os &#8220;selects&#8221; desejados.</p>
<p>Um exemplo de funcionamento:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3161421.js"></script></div></p>
<p>Você pode conferir na <a href="http://codex.wordpress.org/Class_Reference/WP_Query" title="WP_query" target="_blank">documentação oficial</a> todas as opções disponíveis para realizar suas consultas.</p>
<h1>Criando uma opção</h1>
<p>Bom, isso é muito simples mesmo. A minha necessidade hoje era selecionar todos os posts iniciassem com <code>Treinamento</code>, ou seja, um simples <code>post_title like 'Treinemanto%'</code>. Para isso, criei a opção <code>title_like</code>.</p>
<p>Tudo que precisamos fazer é adicionar ao <code>functions.php</code> do nosso tema um <strong>filter</strong> para a função <code>posts_where</code> que adicione a nossa condição, caso nossa nova opção seja informada.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3161429.js"></script></div>
<p>Agora com nossa opção devidamente criada, vamos executa-lá:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3161438.js"></script></div>
<h1>Conclusão</h1>
<p>Se você conhece um pouco da estrutura das tabelas do WordPress, sentirá uma ótima sensação de liberdade criando/adicionando tantas opções personalizadas ao <a href="http://codex.wordpress.org/Class_Reference/WP_Query" title="WP_query" target="_blank">WP_query</a> quanto você desejar.</p>
<p>Espero ter ajudado.<br />
Valeu! =)</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/07/criando-parametros-personalizados-para-wp_query/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP_Rewrite sem mistérios para WordPress</title>
		<link>http://pedroelsner.com/2012/07/rewrite-sem-misterios-no-wordpress/</link>
		<comments>http://pedroelsner.com/2012/07/rewrite-sem-misterios-no-wordpress/#comments</comments>
		<pubDate>Mon, 09 Jul 2012 02:18:52 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom page]]></category>
		<category><![CDATA[custom post]]></category>
		<category><![CDATA[extra-tema]]></category>
		<category><![CDATA[links permanentes]]></category>
		<category><![CDATA[links personalizados]]></category>
		<category><![CDATA[rewrite wp]]></category>
		<category><![CDATA[url amigável]]></category>
		<category><![CDATA[url personalizada]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1750</guid>
		<description><![CDATA[O WordPress conta com várias ferramentas para permitir a personalização de posts e páginas. Aprenda agora como criar URLs amigáveis para carregar arquivos &#8220;extra-tema&#8221;. WP Rewrite A classe WP Rewrite é responsável por gerenciar todas as rotas do WordPress. Nesse tutorial vamos criar um regra rewrite para a URL http://meusite.com/contato. Desta forma, vamos redirecionar o [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>O WordPress conta com várias ferramentas para permitir a personalização de posts e páginas. Aprenda agora como criar URLs amigáveis para carregar arquivos &#8220;extra-tema&#8221;.<span id="more-1750"></span></p>
<h1>WP Rewrite</h1>
<p>A classe <a href="http://codex.wordpress.org/Class_Reference/WP_Rewrite" title="WP Rewrite" target="_blank">WP Rewrite</a> é responsável por gerenciar todas as rotas do WordPress.</p>
<p>Nesse tutorial vamos criar um regra rewrite para a URL <strong>http://meusite.com/contato</strong>. Desta forma, vamos redirecionar o processamento para o arquivo <strong>tpl-contato.php</strong> do nosso tema. Vamos lá!</p>
<h1>Definindo</h1>
<p>Primeiramente vamos criar uma variável pública para armazenar todas as nossas regras.</p>
<blockquote><p>Adcione ao arquivos <strong>functions.php</strong> do seu tema:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3073814.js"></script></div></p></blockquote>
<p>Note que a chave informada é uma expressão regular que aponta para o arquivo <code>index.php</code>, passando o parâmetro <code>custom_page</code> com o valor <code>contato</code>.</p>
<p>Para deixar mais claro o que é possível fazer, vejamos um exemplo mais complexo:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3073831.js"></script></div></p>
<p>No exemplo a cima podemos acessar a URL <strong>http://meusite.com/livros/autor/pedro-eslner</strong>, a qual passará o valor <code>pedro-elsner</code> no parâmetro <code>autor</code>. =)</p>
<h1>Carregando</h1>
<p>Uma vez definidas, vamos carregar as regras no evento <code>wp_loaded</code>.</p>
<blockquote><p>Adicione ao <strong>functions.php</strong>:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3073851.js"></script></div></p></blockquote>
<p>Nossa função basicamente procura nas regras do WordPress pelas nossas registras na variável <code>$my_rewrite_rules_array</code>. Caso não encontro, executa a função <code>WP_Rewrite::flush_rules()</code> responsável por atualizar as regras dos links permanentes.</p>
<p>Ao executar essa função o evento <code>rewrite_rules_array</code> é chamado, então, vamos retornar nossas regras aqui:</p>
<blockquote><p>Adicione ao <b>functions.php</b>:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3073889.js"></script></div></p></blockquote>
<h1>Parâmetros</h1>
<p>Agora, vamos habilitar nosso parâmetro <code>custom_page</code> para que possamos pega-lo pela função <code>get_query_var()</code>.</p>
<blockquote><p>Adicione ao <b>functions.php</b>:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3073911.js"></script></div></p></blockquote>
<h1>Finalizando</h1>
<p>Bom, agora que configuramos tudo só nos resta interceptar o carregamento do WordPress e direcionar o processamento da nossa URL <strong>http://meusite.com/contato</strong> para o arquivo <strong>tpl-contato.php</strong> do nosso tema.</p>
<blockquote><p>Adicione ao <b>functions.php</b>:<br />
<div class="gist-for-robots"><script src="http://gist.github.com/3073937.js"></script></div></p></blockquote>
<h1>Conclusão</h1>
<p>Muito simples né? =)<br />
Qualquer dúvida é só comentar!</p>
<p>Até a próxima =D</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/07/rewrite-sem-misterios-no-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Utilizando Filter Results 2.0 no CakePHP 2.0</title>
		<link>http://pedroelsner.com/2012/06/plugin-filter-results-para-cakephp-2-x/</link>
		<comments>http://pedroelsner.com/2012/06/plugin-filter-results-para-cakephp-2-x/#comments</comments>
		<pubDate>Sun, 24 Jun 2012 21:13:30 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[filter results]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1686</guid>
		<description><![CDATA[Escrevo este posts emocionado, com uma ligeira lágrima escorrendo no rosto rsrs&#8230; Finalmente estou disponibilizando a versão do meu plugin Filter Results para CakePHP 2 já com o operador BETWEEN e tudo mais. =D Filter Results Basicamente, com o Filter Results para CakePHP 2 você poderá fazer formulários de pesquisa da maneira que você desejar, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Escrevo este posts emocionado, com uma ligeira lágrima escorrendo no rosto rsrs&#8230; Finalmente estou disponibilizando a versão do meu plugin Filter Results para CakePHP 2 já com o operador BETWEEN e tudo mais. =D<span id="more-1686"></span></p>
<h1>Filter Results</h1>
<p>Basicamente, com o <a href="https://github.com/pedroelsner/filter_results/tree/2.0" title="Plugin Filter Results" target="_blank">Filter Results para CakePHP 2</a> você poderá fazer formulários de pesquisa da maneira que você desejar, de forma rápida e padronizada para toda a sua aplicação.</p>
<h2>Compatibilidade</h2>
<ul>
<li>Compatível com CakePHP 2.0 + Paginate (Component)</li>
<li><em>Versão para CakePHP 1.3: <a href="http://pedroelsner.com/2011/09/filtrando-resultados-do-paginate-no-cakephp-com-filter-results/" title="Filtrando resultados do Paginate no CakePHP 1.3 com Filter Results">Filtrando resultados do Paginate no CakePHP 1.3 com Filter Results</a></em></li>
</ul>
<div style="margin: 20px 0 0; padding: 0 15px 15px; background: #8B1A1A; color:#fff;">
<h1 style="color: #fff;">IMPORTANTE</h1>
<p>Na versão 2.3 do plugin houve uma mudança na arquitetura das funções e nome de arquivos. Se estiver encontrando este problema, baixe a versão 2.0 e continue lendo este artigo ou utilize o tutorial da versão 2.3 clicando <a style="color: #fff;" href="https://github.com/pedroelsner/filter_results/blob/2.3/README.pt-br.markdown">aqui</a>.</p>
</div>
<h1>Instalação</h2>
<h2>Download</h2>
<p>Antes de iniciar, baixe o <a href="https://github.com/pedroelsner/filter_results/" title="Plugin Filter Results" target="_blank">Filter Results</a>. Copie os arquivos para a pasta <code>/app/Plugin/filter_results</code> ou em outro diretório para plugins do CakePHP.</p>
<p>Se preferir, utilize o git:<br />
<code>git clone -b 2.0 https://github.com/pedroelsner/filter_results.git FilterResults</code></p>
<h2>Ativação</h2>
<p>Ative o plugin adicionando ao arquivo <code>/app/Config/bootstrap.php</code>:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2985032.js"></script></div>
<h2>Configurações</h2>
<p>Vamos adicionar nas variáveis <code>$components</code> e <code>$helpers</code> no <code>AppController.php</code>:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3005302.js"></script></div>
<p>Parâmetros de configuração:</p>
<ul>
<li><code>auto->paginate</code> Se você definir como <strong>TRUE</strong>, o Paginate será configurado automaticamente.</li>
<li><code>auto->explode</code> Se você definir como <strong>TRUE</strong>, o valor de pesquisa será quebrado pelo <code>explode->character</code> e concatenado pela condição <code>explode->concatenate</code>.</li>
</ul>
<h2>Ajuste no DebugKit</h2>
<p>Se você estiver utilizando o DebugKit, configure-o desta forma em seu <code>AppController.php</code>:</p>
<p><code>'DebugKit.Toolbar' => array('panels' => array('history' => false));</code></p>
<h2>Antes de tudo</h2>
<p>Para este e os próximos exemplos, vamos ter como base o seguinte banco de dados:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2790210.js"></script></div>
<p>Beleza? Então vamos começar!</p>
<h1>Filtro Simples</h1>
<p>Bom, após gerar as telas pelo Bake, criamos a seguinte action em nosso Controller:</p>
<blockquote><p>
Arquivo <code>/app/Controller/UsersController.php</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2790214.js"></script></div>
</p></blockquote>
<p>Vamos então colocar um filtro sobre a grid(tabela) para pesquisar um usuário pelo nome(<code>name</code>) e configurar o Paginate da action.</p>
<blockquote><p>
Arquivo <code>/app/Controller/UsersController.php</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3040178.js"></script></div>
</p></blockquote>
<p>A configuração aqui é bem simples: Criamos um filtro chamado <code>filter1</code> que utilizará o campo <code>User.name</code>. Este filtro utiliza o operador <code>LIKE</code> e adiciona <code>%</code> antes e depois do conteudo a ser filtrado.</li>
<p>Agora temos apenas que fazer o formulário na View em cima da tabela.</p>
<blockquote><p>
Arquivo <code>/app/View/Users/index.ctp</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3048237.js"></script></div>
</p></blockquote>
<p>Pronto! Temos um campo que filtra o usuário pelo nome e compatível com o Paginate. ^^</p>
<p>E mais, o Filter Results automaticamente divide o valor de pesquisa para obter um melhor resultado. Por exemplo: se realizarmos um filtro por &#8216;Pedro Elsner&#8217;, a condição será: <code>WHERE ((User.name LIKE '%Pedro%') AND (User.name LIKE '%Elsner%'))</code>.</p>
<h1>Explode</h1>
<p>A opção <code>explode</code> para os operadores <code>LIKE</code> e <code>NOT LIKE</code> estão ativadas por padrão nas configurações do Filter Results. Mas, como você sabe, você pode desativar na declaração dos components no controller. Se você fizer isto, você pode ativar a função <code>explode</code> para um filtro determinado:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3044808.js"></script></div>
<p>Também é possível mudar as opções de quebra para cada um.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3044817.js"></script></div>
<p>Além disso, você também pode usar a função de quebra junto com outro operador (como <code>=</code>). Veja:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3044824.js"></script></div>
<h1>Filtro Simples + Regra Composta</h1>
<p>Vamos agora fazer mais uma regra dentro do filtro <code>filter1</code>. Queremos que ele filtre pelo nome(<code>name</code>) ou pelo nome do usuário(<code>username</code>).</p>
<p>Alteramos então apenas o nosso Controller:</p>
<blockquote><p>
Arquivo <code>/app/Controller/UsersController.php</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3048246.js"></script></div>
</p></blockquote>
<p>A regra <code>OR</code> pode ser também <code>AND</code> ou <code>NOT</code>.</p>
<blockquote><p><strong>NOTA:</strong> Se você definir mais de uma condição sem especificar a regra, o plugin entenderá como <code>AND</code> automaticamente.</p></blockquote>
<h1>Filtro Simples + Regra Fixa</h1>
<p>Vamos supor agora que o nosso filtro <code>filter1</code> quando informado deva filtrar pelo nome(<code>name</code>) <code>E</code> somente usuários(<code>username</code>) ativos.</p>
<blockquote><p>
Arquivo <code>/app/Controller/UsersController.php</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3048253.js"></script></div>
</p></blockquote>
<h1>Agregação de Filtros</h1>
<p>Automaticamente o Filter Results concatena todos os filtros pela regra <code>AND</code>. Usando o exemplo a seguir, informando &#8216;Pedro&#8217; no <code>filter1</code> e &#8216;elsner&#8217; no <code>filter2</code> teremos a condição: <code>WHERE (User.name LIKE '%Pedro%') AND (User.usernname LIKE '%elsner%')</code></p>
<div class="gist-for-robots"><script src="http://gist.github.com/3067223.js"></script></div>
<blockquote><p><strong>NOTA:</strong> Podemos concatenar os filtros também pelas regras <code>OR</code> ou <code>NOT</code>.</p></blockquote>
<p>Vamos alterar nosso exemplo para concatenar os filtros pela regra <code>OR</code>, e, se o <code>filtro1</code> for informado queremos apenas <strong>usuários ativos</strong>. Desta vamos obter a condição: <code>WHERE ((User.name LIKE '%Pedro%') AND (User.active = 1)) OR (User.usernname LIKE '%elsner%')</code></p>
<div class="gist-for-robots"><script src="http://gist.github.com/3067234.js"></script></div>
<h1>Filtro de Seleção</h1>
<p>Vamos mudar nosso filtro. Além de filtrar pelo nome, queremos agora filtrar também pelo grupo do usuário(<code>Group.name</code>) desejado através de um campo de seleção.</p>
<blockquote><p>
Arquivo <code>/app/Controller/UsersController.php</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3040190.js"></script></div>
</p></blockquote>
<blockquote><p>
Arquivo <code>/app/View/Users/index.ctp</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3048260.js"></script></div>
</p></blockquote>
<p>Pronto! Use e abuse de quantos filtros desejar.</p>
<p>Para deixar bem claro, veja a imagem abaixo. Nela temos a View de Produtos, onde é possível filtrar por: Cor, Dimensão, Gramatura, Material e Nome.</p>
<p><img src="http://pedroelsner.com/wp-content/uploads/2011/09/filterResults_1.png" alt="" title="Filter Results - Filtro por Seleção" width="700" height="447" class="aligncenter size-full wp-image-904" srcset="http://pedroelsner.com/wp-content/uploads/2011/09/filterResults_1.png 700w, http://pedroelsner.com/wp-content/uploads/2011/09/filterResults_1-300x191.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<h1>Filtro Avançado</h1>
<p>Em alguns casos queremos algo diferente diferente, por exemplo, desejamos que o usuário possa escolher o campo e o operador para realizar o filtro.</p>
<blockquote><p>
Arquivo <code>/app/Controller/UsersController.php</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3040199.js"></script></div>
</p></blockquote>
<blockquote><p><strong>NOTA:</strong> Perceba que desta vez criamos o filtro <code>filter1</code> sem nenhum parâmetro. Isto porque as regras serão selecionadas na View.</p></blockquote>
<blockquote><p>
Arquivo <code>/app/View/Users/index.ctp</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3048270.js"></script></div>
</p></blockquote>
<p>Agora, primeiro você pode selecionar o campo (automaticamente o Filter Results lista os campos da tabela), depois o operador e informar o valor desejado para o filtro.</p>
<p>Haverá situações em que você precisará personalizar os operadores para seleção. Por exemplo, vamos deixar somente os campos <code>User.id</code>, <code>User.name</code> e <code>User.username</code> para seleção, e os operadores <code>LIKE</code> e <code>=</code>.</p>
<p>Para isso, mudamos somente a View:</p>
<blockquote><p>
Arquivo <code>/app/View/Users/index.ctp</code><br />
<div class="gist-for-robots"><script src="http://gist.github.com/3048272.js"></script></div>
</p></blockquote>
<h1>Operadores</h1>
<p>O Filter Resultes possuí operadores pré-definidos, abaixo você encontra todas as opções disponíveis para você utilizar em seus filtros personalizados.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/3048286.js"></script></div>
<h2>BETWEEN</h2>
<p>Também é possível utilizar o operador <code>BETWEEN</code> para consulta entre valores numéricos ou de data. Configure o campo de filtro desta forma:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2984518.js"></script></div>
<p>Para campos de data, adicione a opção <code>'date' => true</code> para converte a data informada para o formato <code>YYYY-MM-DD</code>:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2984529.js"></script></div>
<h1>Relacionamentos HABTM</h1>
<p>Por padrão, nos relacionamentos HABTM o CakePHP realiza várias consultas a parte e depois faz um <code>merge</code> nos resultados em um único <code>array</code>. Você já deve ter percebido isso, mas se não, verifique a janela de debug enquanto você faz <code>find()</code> em uma relação HABTM.</p>
<p>Para filtramos nessas relações, precisamos criar alguns &#8220;hacks&#8221; para que o CakePHP gere um único <code>select</code>, assim o plugin filtra o resultado com comandos <code>where</code> simples.</p>
<p>Todas as informações e explicações necessárias para criar os &#8220;hacks&#8221; você encontra neste tutorial: <a href="http://pedroelsner.com/2012/09/pesquisando-em-associacoes-habtm-no-cakephp/" title="Pesquisando em relações HABTM no CakePHP">Pesquisando em relações HABTM no CakePHP</a></p>
<h1>Agradecimentos</h1>
<p>Deixo aqui registrado meu muito obrigado para todos os colegas que de alguma forma contribuíram para o desenvolvimento deste plugin.</p>
<p>Em especial para:</p>
<ul>
<li>Vinícius Arantes (<a href="mailto:vinicius.big@gmail.com">vinicius.big@gmail.com</a>)</li>
<li>Francys Reymer (<a href="mailto:francys.reymer@gmail.com">francys.reymer@gmail.com</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/06/plugin-filter-results-para-cakephp-2-x/feed/</wfw:commentRss>
		<slash:comments>97</slash:comments>
		</item>
		<item>
		<title>Guia Completo: Set Analysis QlikView</title>
		<link>http://pedroelsner.com/2012/06/guia-completo-set-analysis-qlikview/</link>
		<comments>http://pedroelsner.com/2012/06/guia-completo-set-analysis-qlikview/#comments</comments>
		<pubDate>Sat, 16 Jun 2012 15:44:59 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[QlikView]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[guia completo]]></category>
		<category><![CDATA[qlikview]]></category>
		<category><![CDATA[set analysis]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1588</guid>
		<description><![CDATA[Quando mais trabalho com QlikView, mas por ele fico fascinado! Neste tutorial quero compartilhar com vocês um guia de expressões, que corresponde a 90% das necessidades que encontramos na hora de produzir a &#8220;view&#8221; de um projeto. Expressões Básicas Exemplos Simples 1. Calcula a Soma das &#8220;Vendas&#8221; baseado nas seleções atuais 2. Conta os valores [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quando mais trabalho com QlikView, mas por ele fico fascinado! Neste tutorial quero compartilhar com vocês um guia de expressões, que corresponde a 90% das necessidades que encontramos na hora de produzir a &#8220;view&#8221; de um projeto.<span id="more-1588"></span></p>
<h1>Expressões Básicas</h1>
<h2>Exemplos Simples</h2>
<blockquote><p>1. Calcula a <strong>Soma</strong> das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941575.js"></script></div></p></blockquote>
<blockquote><p>2. <strong>Conta</strong> os valores do campo &#8220;Cliente&#8221; baseado nas <strong>seleções atuais</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941594.js"></script></div></p></blockquote>
<blockquote><p>3. Calcula a <strong>Soma</strong> das &#8220;Vendas&#8221; baseado em <strong>todos os valores</strong>, ou seja, ignora todas as seleções<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941609.js"></script></div></p></blockquote>
<blockquote><p>4. Calcula a <strong>Soma</strong> das &#8220;Vendas&#8221; baseado no <strong>marcador com o ID</strong> &#8220;BM01&#8221;<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941617.js"></script></div></p></blockquote>
<blockquote><p>5. Calcula a <strong>soma</strong> das &#8220;Vendas&#8221; para <strong>tudo o que a seleção atual excluir</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941648.js"></script></div></p></blockquote>
<blockquote><p>6. Calcula a <strong>soma</strong> das &#8220;Vendas&#8221; baseado na <strong>seleção anterior</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941657.js"></script></div></p></blockquote>
<blockquote><p>7. Calcula a <strong>soma</strong> das &#8220;Vendas&#8221; baseado nas <strong>próxima seleção</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941667.js"></script></div></p></blockquote>
<blockquote><p>8. Calcula a soma da expressão <strong>&#8220;ItemQuandidade*ItemPreco&#8221;</strong> baseado nas <strong>seleções atuais</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941695.js"></script></div></p></blockquote>
<h2>Usando Marcadores</h2>
<blockquote><p>9. Calcula a <strong>média</strong> das &#8220;Vendas&#8221; baseado no <strong>marcado do servidor</strong> com o ID &#8220;BM01&#8221;<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941726.js"></script></div></p></blockquote>
<blockquote><p>10. Calcula a <strong>soma</strong> das &#8220;Vendas&#8221; baseado no <strong>marcado do documento</strong> com o ID &#8220;BM01&#8221;<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941728.js"></script></div></p></blockquote>
<blockquote><p>11. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais E no marcador do servidor</strong> com o ID &#8220;BM01&#8221;<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941730.js"></script></div></p></blockquote>
<blockquote><p>12. Calcula a somas da &#8220;Vendas&#8221; baseado nas <strong>seleções atuais, EXCETO os registros pertencentes ao marcador do servidor</strong> com o ID &#8220;BM01&#8221;<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941731.js"></script></div></p></blockquote>
<h1>ALL e TOTAL</h1>
<p>Conheça os parâmetros utilizados para controlar seleções/dimensões de uma expressão. Veja meu tutorial: <a href="http://pedroelsner.com/2011/12/entendendo-all-e-total-nas-funcoes-do-qlikview/" title="Entendendo ALL e TOTAL nas funções do QlikView" target="_blank">Entendendo ALL e TOTAL nas funções do QlikView</a></p>
<h1>Expressões com Modificadores</h1>
<p>Em alguns casos, necessitamos fixar uma seleção ou alterar as seleções atuais numa determinada expressão. Veja agora alguns exemplos:</p>
<h2>Modificadores Básicos</h2>
<blockquote><p>13. Calcula a soma das &#8220;Vendas&#8221; <strong>descartando as seleções atuais</strong> mas <strong>fixa o campo &#8220;Regiao&#8221;</strong> para o valor desejado<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941784.js"></script></div></p></blockquote>
<blockquote><p>14. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais EXCLUINDO o campo &#8220;Regiao&#8221;</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941795.js"></script></div></p></blockquote>
<blockquote><p>15. Calcula a soma das &#8220;Vendas&#8221; basado nas <strong>seleções atuais EXCLUINDO a categoria &#8220;Acessorios&#8221;</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2941824.js"></script></div></p></blockquote>
<blockquote><p>16. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, mas apenas considerando as vendas nos <strong>&#8220;Anos&#8221; de 1980 até 1989</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942529.js"></script></div></p></blockquote>
<blockquote><p>17. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, mas apenas considerando os <strong>&#8220;Anos&#8221; 1900, 1910, 1920, etc</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942539.js"></script></div></p></blockquote>
<blockquote><p>18. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, mas considerando apenas os <strong>anos maiores que &#8220;Min(Ano)&#8221; e menores que &#8220;Max(Ano)&#8221;</strong>, então se tivermos  2008, 2009 e 2010, apenas as &#8220;Vendas&#8221; de 2009 serão calculadas.<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942554.js"></script></div></p></blockquote>
<h2>Usando Expressões Ad-Hoc</h2>
<blockquote><p>19. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, mas apenas do <strong>último &#8220;Ano&#8221;</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942565.js"></script></div></p></blockquote>
<blockquote><p>20. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, para o <strong>ano anterior a seleção</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942570.js"></script></div></p></blockquote>
<h2>Usando Expressões de Pesquisa</h2>
<blockquote><p>21. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, mas apenas para os <strong>anos anteriores a &#8220;Max(Ano)&#8221;</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942616.js"></script></div></p></blockquote>
<blockquote><p>22. Calcula a soma das &#8220;Vendas&#8221; <strong>desconsiderando as seleções</strong>, para os <strong>anos maiores que 2009</strong><br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942623.js"></script></div></p></blockquote>
<blockquote><p>23. Calcula a soma das &#8220;Vendas&#8221; baseado nas <strong>seleções atuais</strong>, mas para as <strong>cidades que contenham &#8220;io&#8221;</strong>: &#8220;Bert<strong>io</strong>ga&#8221;, &#8220;R<strong>io</strong> de Janeiro&#8221;, etc<br />
<div class="gist-for-robots"><script src="http://gist.github.com/2942654.js"></script></div></p></blockquote>
<h1>Indirect Set Analysis</h1>
<p>O que acontece quando precisamos realizar a soma das vendas apenas dos clientes que compraram sapato em 2010? Para isso precisamos de expressões indiretas. Saiba mais em: <a href="http://pedroelsner.com/2012/01/criando-expressoes-avancadas-no-qlikview/" title="Criando expressões avançadas no QlikView" target="_blank">Criando expressões avançadas no QlikView</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/06/guia-completo-set-analysis-qlikview/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>PSR-1 e PSR-2: Coding Standards PHP</title>
		<link>http://pedroelsner.com/2012/06/psr-1-e-psr2-coding-standards-php/</link>
		<comments>http://pedroelsner.com/2012/06/psr-1-e-psr2-coding-standards-php/#comments</comments>
		<pubDate>Tue, 05 Jun 2012 22:09:21 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[coding standard]]></category>
		<category><![CDATA[psr-1]]></category>
		<category><![CDATA[psr-2]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1561</guid>
		<description><![CDATA[Atualmente a comunidade tem se mexido bastante em torno de elaborar e definir diversos padrões para o desenvolvimento em PHP. Conheça o novo Coding Standard para PHP aprovado recentemente. PHP-FIG O grupo PHP Framework Interoperability Group tem a finalidade de propor padrões e através de uma votação definir quais &#8220;deverão&#8221; ser utilizados, para facilitar a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Atualmente a comunidade tem se mexido bastante em torno de elaborar e definir diversos padrões para o desenvolvimento em PHP. Conheça o novo Coding Standard para PHP aprovado recentemente.<span id="more-1561"></span></p>
<h1>PHP-FIG</h1>
<p>O grupo <a href="https://groups.google.com/forum/?fromgroups#!forum/php-standards" title="PHP Framework Interoperability Group" target="_blank">PHP Framework Interoperability Group</a> tem a finalidade de propor padrões e através de uma votação definir quais &#8220;deverão&#8221; ser utilizados, para facilitar a integração e utilização de diversas bibliotecas e frameworks.</p>
<h1>PSR-1 e PSR-2</h1>
<p>A proposta do PSR-1 e PSR-2 é referente a Conding Standard. Esta foi aprovada pelos membros e deverá ser implementada por toda a comunidade. Claro que haviam muitas de diferenças de opiniões e os membros do grupo discutiram de maneira amigável. Eles inicialmente começaram como uma única proposta (PSR), mas a rodada inicial de votações não deu uma maioria a favor. Os participantes que no entanto tinham interesse em vários requisitos diferente, então decidiram dividi-lo em 2 propostas, uma para a padrões básico de definições (Basic Coding Standard) e outra para o estilo (Suggested Style).</p>
<p>Acesse o <a href="https://github.com/php-fig/fig-standards" target="_blank">repositório oficial</a> e veja como as PSRs ficaram depois de aprovadas.</p>
<h1>PHP-CS-Fixer</h1>
<p>A comunidade também já disponibilizou um path para o <strong>phpcs</strong> verificar e detectar automaticamente os códigos que não respeitarem a PSR-1 e PSR2. Acesse o <a href="https://github.com/klaussilveira/phpcs-psr1" title="PHPCS PSR-1 e PSR-2" target="_blank">repositório oficial</a> e saiba como utilizar.</p>
<h1>Conclusão</h1>
<p>O PHP por nascença não possuí padrão &#8211;  basta ver nas suas próprias funções internas as variações de nomenclatura. Isso não faz dele pior ou melhor a outra qualquer linguagem, é apenas uma característica que dificulta a cultura de padronização para os desenvolvedores &#8211; especialmente os que desenvolve apenas ou começaram pelo PHP.</p>
<p>Portanto, espero que as propostas aprovadas pelo grupo sejam adotadas, assim quem sabe até os códigos dos &#8220;sobrinhos&#8221; terão uma grande possibilidade de ficarem padronizados. ^^&#8217;</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/06/psr-1-e-psr2-coding-standards-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Estação de Desenvolvimento Web Ubuntu</title>
		<link>http://pedroelsner.com/2012/02/minha-estacao-de-desenvolvimento-web/</link>
		<comments>http://pedroelsner.com/2012/02/minha-estacao-de-desenvolvimento-web/#respond</comments>
		<pubDate>Sun, 05 Feb 2012 12:38:02 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[preload]]></category>
		<category><![CDATA[sublime text 2]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1654</guid>
		<description><![CDATA[Neste artigo quero compartilhar um passo-a-passo de configuração e instalação da minha estação de trabalho Ubuntu. Se você utiliza a mesma distribuição linux que eu, em 10 minutinhos teremos Apache, PHP, MySql e CIA instalados e pronto para uso! =) Ubuntu 11+ Utilizo a distribuição Ubuntu por gosto, mas você pode utilizar a que você [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Neste artigo quero compartilhar um passo-a-passo de configuração e instalação da minha estação de trabalho Ubuntu. Se você utiliza a mesma distribuição linux que eu, em 10 minutinhos teremos Apache, PHP, MySql e CIA instalados e pronto para uso! =)<span id="more-1654"></span></p>
<h1>Ubuntu 11+</h1>
<p>Utilizo a distribuição Ubuntu por gosto, mas você pode utilizar a que você quiser (desde que ela suporte <code>apt-get</code>). Após instalar devidamente o OS de sua preferencia, atualizaremos o <del datetime="2012-06-21T13:03:53+00:00">ports</del> <code>apt-get</code>.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965578.js"></script></div>
<h1>Gnome no Ubuntu 12</h1>
<p>A versão 12 do Ubuntu vem com o gerenciador de janelas Unity definido como padrão. Se você assim como eu, não troca o bom e velho Gnome Classic, faça a instalação dele e seleciona-lo no login.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965589.js"></script></div>
<h1>Apache + PHP5</h1>
<p>Vamos instalar o Apache junto com o PHP, assim não precisamos alterar nenhum arquivo de configuração. =D</p>
<blockquote><p>Para instalar o PHP 5.4, execute antes: <code>sudo add-apt-repository ppa:ondrej/php5</code></p></blockquote>
<div class="gist-for-robots"><script src="http://gist.github.com/2965603.js"></script></div>
<p>Acesse <code>http://localhost/</code> e já estará funcionando. Crie um arquivo <code>.php</code> com o seguinte conteudo <code>&lt;?php phpinfo();</code> e veja se o PHP também está funcionando.</p>
<h2>Apache: mod_rewrite</h2>
<p>Hoje em dia, nenhuma aplicação funciona sem url amigável, sendo assim precisamos desse recurso. Para ativar o <strong>mod_rewrite</strong>, primeiro fazemos a sua instalação:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965611.js"></script></div>
<p>Agora editamos o arquivo <code>/etc/apache2/sites-available/default</code> alterando as entradas <code>AllowOverride None</code> para <code>AllowOverride All</code>.</p>
<p>Por fim, re-carregamos o serviço do Apache.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965624.js"></script></div>
<h1>Mysql Server</h1>
<p>Não precisa de comentários. Instalamos ele junto com o driver de conexão do PHP para também não precisar alterar nenhum arquivo de configuração. =)</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965667.js"></script></div>
<h1>PHPMyAdmin</h1>
<p>Você pode utilizar um software como o <a href="http://www.mysql.com/products/workbench/" title="MySQL WorkBench" target="_blank">MySQL Workbench</a> para administrar os bancos de dados do seu servidor, mas pra mim nada supera a praticidade do <strong>PHPMyAdmin</strong>. Em uma única página, de maneira rápida, você administra todos os banco de dados. (Se discorda, comente e me indique algo melhor =P)</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965679.js"></script></div>
<p>Agora, acesse <code>http://localhost/phpmyadmin/</code> e pronto!</p>
<blockquote><p>Se a página não estiver carregando, adicione o conteúdo do arquivo <code>/etc/phpmyadmin/apache2.conf</code> no arquivo <code>/etc/apache2/sites-avaiable/default</code> e reinicie o serviço do apache <code>sudo service apache2 restart</code></p></blockquote>
<h1>Extras</h1>
<p>Bom, esses são os aplicativos básicos para que minhas experiências possam ocorrer sem anormalidades. Mas, ainda utilizo outros &#8220;brinquedinhos&#8221; para me divertir ainda mais. Aqui vão alguns:</p>
<h2>Git</h2>
<p>Utilizo <strong>git</strong> para publicar e versionar os plugins que desenvolvo para <a href="http://cakephp.org/" title="CakePHP" target="_blank">CakePHP</a> e <a href="http://wordpress.org/" title="WordPress" target="_blank">WordPress</a> no <a href="https://gist.github.com/pedroelsner" title="GitHub - Pedro Elsner" target="_blank">GitHub</a>. Então neste caso instalo apenas a versão cliente do <strong>git</strong></p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965718.js"></script></div>
<h2>SubVersion SVN</h2>
<p>Esse eu utilizo como servidor para armazenar meus projetos que não podem ser público. Geralmente é algo que farei no Windows mesmo sem nenhum peso na consciência.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2965729.js"></script></div>
<h2>Sublime Text 2</h2>
<p>Disparado na minha opinião o melhor editor para PHP da atualidade. As funcionalidades são muito interessantes e a quantidade de add-ons para ele é enorme. Se você ainda não conhece, babe conhecendo o que essa belezinha é capaz de fazer vendos esses vídeos.</p>
<p><!-- [gist id=2965748] --><a href="http://www.sublimetext.com/2" title="Sublime Text 2" target="_blank">Baixe aqui</a> a versão para Linux e descompacte os arquivos em <code>/etc/sublime_text/</code></p>
<h2>Vim</h2>
<p>Uma extensão do <strong>Vi</strong> que eu gosto muito de utilizar.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/5196068.js"></script></div>
<p>Agora, se desejar, configure ele para utilizar 4 espaços no lugar da tabulação.<br />
Para isso edite/crie o arquivo <code>/etc/vim/vimrc.local</code> e adicione o seguinte conteúdo:</p>
<div class="gist-for-robots"><script src="http://gist.github.com/5196082.js"></script></div>
<h2>Preload</h2>
<p>Normalmente eu virtualizo meus ambientes de trabalho por diversas razões. Uma delas é pela praticidade de colocar a VM no HD-Externo e abrir em qualquer micro e já sair trabalhando.</p>
<p>Neste caso, toda e qualquer configuração para optimizar recursos do sistema é sempre bem-vinda. A algum tempo, eu fiz um post sobre o <strong>preload</strong> aqui no blog e nele você encontra mais detalhes e informações de instalação.</p>
<p>Tutorial: <a href="http://pedroelsner.com/2011/08/preload-melhora-drasticamente-a-performace-do-seu-linux/" title="Preload melhora drasticamente a performance do seu Linux" target="_blank">Preload melhora drasticamente a performance do seu Linux</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/02/minha-estacao-de-desenvolvimento-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GistHub Gist SEO Friendly para WordPress</title>
		<link>http://pedroelsner.com/2012/01/gisthub-gist-seo-friendly-para-wordpress/</link>
		<comments>http://pedroelsner.com/2012/01/gisthub-gist-seo-friendly-para-wordpress/#respond</comments>
		<pubDate>Mon, 30 Jan 2012 02:20:56 +0000</pubDate>
		<dc:creator><![CDATA[Pedro Elsner]]></dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[gist]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://pedroelsner.com/?p=1639</guid>
		<description><![CDATA[Até que enfim saiu meu primeiro plugin oficial para WordPress! Este é bem simples mas muito funcional, pois adiciona gist nos posts de maneira &#8220;SEO Friendly&#8221;, ou seja, os mecanismos de busca indexam seu conteúdo. Gist for Robots WordPress Plugin Este plugin tem o funcionamento muito simples: quando a página esta sendo acessada pelos mecanismos [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Até que enfim saiu meu primeiro plugin oficial para WordPress! Este é bem simples mas muito funcional, pois adiciona gist nos posts de maneira &#8220;SEO Friendly&#8221;, ou seja, os mecanismos de busca indexam seu conteúdo.<span id="more-1639"></span></p>
<h1>Gist for Robots WordPress Plugin</h1>
<p>Este plugin tem o funcionamento muito simples: quando a página esta sendo acessada pelos mecanismos de busca o plugin processa o código embeded javascript do gist e exibe o conteúdo.</p>
<blockquote><p>Este plugin não trará nenhuma punição a cerca de &#8220;duas versões&#8221; da página (uma para robots e outra para usuários), uma vez que ele apenas renderiza o conteúdo de um javascript da própria página. =D</p></blockquote>
<h2>Compatibilidade</h2>
<ul>
<li>Compatível com WordPress 3+</li>
</ul>
<h1>Instalação</h1>
<p>Baixe no GitHub o plugin <a href="https://github.com/pedroelsner/gist-for-robots-wordpress" title="Gist for Robots WordPress" target="_blank">Gist for Robots WordPress</a> ou no <a href="http://wordpress.org/extend/plugins/gist-for-robots-wordpress/" title="Gist for Robots WordPress" target="_blank">repositório do WordPress</a>.</p>
<p>Descompacte os arquivos, faça o upload da pasta em <code>/wp-content/plugins/</code> e ative o plugin.</p>
<h1>Utilização</h1>
<p>Em seus posts, utilize o shortcode <code>Invalid Gist ID</code> para exibir a gist.</p>
<div class="gist-for-robots"><script src="http://gist.github.com/2943164.js"></script></div>
<div class="gist-for-robots"><script src="http://gist.github.com/2943167.js"></script></div>
<h1>Concluído</h1>
<p>Depois que ativei o plugin, o page rank das minhas páginas aumentaram assim como o número de visitas.<br />
Aproveite! =D</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://pedroelsner.com/2012/01/gisthub-gist-seo-friendly-para-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.945 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2019-07-20 02:35:17 -->
