<?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>Cauan Cabral &#187; CakePHP</title> <atom:link href="http://cauancabral.net/tag/cakephp/feed/" rel="self" type="application/rss+xml" /><link>http://cauancabral.net</link> <description>Geek, nerd e apaixonado por tecnologia</description> <lastBuildDate>Sat, 24 Sep 2011 22:13:29 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>[Comitiva] Como utilizar controle de permissão no sistema</title><link>http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/</link> <comments>http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/#comments</comments> <pubDate>Sun, 01 Aug 2010 16:14:10 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Projetos]]></category> <category><![CDATA[comitiva]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=235</guid> <description><![CDATA[Como escrevi anteriormente, o PHPMS mantém um sistema para gerenciar eventos &#8211; desde a divulgação de informações, cadastro de eventos, inscrições, pagamentos, envio de mensagens para inscritos e check-in. Mas o objetivo deste post não é dizer o que já &#8230; <a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Como <a
title="Comitiva - Cuide bem do seu evento" href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/">escrevi anteriormente</a>, o PHPMS mantém um sistema para gerenciar eventos &#8211; desde a divulgação de informações, cadastro de eventos, inscrições, pagamentos, envio de mensagens para inscritos e check-in.</p><p>Mas o objetivo deste post não é dizer o que já foi dito, quero iniciar uma série de posts onde vou explicar o funcionamento de alguns recursos dentro do <em><a
href="http://github.com/CauanCabral/Comitiva" title="Pegue uma cópia do Comitiva e contribua" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Comitiva?referer=');">Comitiva</a></em>, convidando todos os desenvolvedores a opinar sobre implementação e contribuir com o projeto.</p><p>O assunto de hoje é controle de acesso, então vamos ao que interessa.</p><p><strong>Como funciona o controle de acesso no Comitiva?</strong></p><p>Utilizamos o componente <em>Auth</em> do CakePHP para cuidar da autenticação (efetuar login, verificar se o usuário está logado e efetuar logout).<br
/> Mas precisávamos ir um pouco além da configuração básica, definindo diferentes opções para diferentes tipos de usuários. Para isso, consideramos duas opções iniciais: usar também o <strong>Acl</strong> <em>Behavior</em> ou ficar apenas com o AuthComponent e criar diferentes <em>actions</em> para diferentes tipos de usuários.</p><p>Como possuímos apenas dois tipos de usuários (<em>admin</em> e <em>participant</em>) decidimos pela que seria mais simples inicialmente &#8211; mesmo sabendo que a manutenção no futuro poderia ser mais complicada &#8211; que foi criar diferentes <em>actions</em> para os tipos de usuários.</p><p>Para criar essa funcionalidade, definimos inicialmente um prefixo para cada tipo de usuário (prefixos &#8216;<em>admin</em>&#8216; e &#8216;<em>participant</em>&#8216;). Em seguida configuramos o <strong>AuthComponent</strong> desta maneira (código extraído do <em>AppController</em>):</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Configure AuthComponent</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">authorize</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'controller'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prefix'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prefix'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Routing.prefixes'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// all non-prefixed actions are allowed</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>Ou seja, toda ação que não tiver prefixo ou o prefixo não estiver definido nas configurações de rota serão públicas (assim é possível, por exemplo, deixar uma página com instruções acessível à qualquer usuário).</p><p>Mas como fica essa verificação de tipos no controlador? Como definimos o método de autorização do Auth como &#8216;controller&#8217;, precisamos definir em todos os controladores o método <strong>isAuthorized</strong> que deve retornar <em>true</em> quando o acesso é aprovado e <em>false</em> caso contrário.<br
/> Seguindo a ideia de que cada tipo de usuário possui um prefixo próprio nas ações, nosso método <em>isAuthorized</em> fica desta forma:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><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;">userLogged</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prefix'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> User<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span></pre></div></div><p>Onde o atributo <em>$this->userLogged</em> pertence a classe <em>AppController</em> e sua função é reduzir chamada ao método <em>$Auth->login()</em> e na segunda parte da condição temos uma comparação entre o prefixo da url acessada e o tipo do usuário &#8211; se ambos forem iguais, então o acesso está liberado.</p><p>Por fim, devemos criar nossas ações para cada tipo de usuário, onde o prefixo será usado para validar o acesso à aquela ação, veja o exemplo da ação &#8220;listar pagamentos&#8221;:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// ação exclusiva para admin - tem acesso aos pagamentos de todos os outros usuários</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> admin_index<span style="color: #009900;">&#40;</span><span style="color: #000088;">$event_id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</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;">Subscription</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">recursive</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$event_id</span><span style="color: #009900;">&#41;</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;">paginate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'conditions'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'event_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$event_id</span>
			<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">compact</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'event_id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'subscriptions'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">paginate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// ação exclusiva para participant - tem acesso somente aos próprios pagamentos</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> participant_index<span style="color: #009900;">&#40;</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;">Subscription</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">recursive</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'subscriptions'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">paginate</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> User<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>Como podem ver, isso permite a criação de diferentes regras de negócio para os diferentes tipos de usuários e embora aumente a quantidade de código &#8220;redundante&#8221; por repetir alguns procedimentos para todos os tipos de usuários, a leitura e entendimento do código é facilitada &#8211; basta ver o prefixo do método (ação) para saber quem terá acesso a ele.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a
href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema &#8211; quase tudo mudou</a></li><li><a
href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Dica Rápida &#8211; Otimizando código</title><link>http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/</link> <comments>http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/#comments</comments> <pubDate>Tue, 09 Feb 2010 01:12:36 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[dica]]></category> <category><![CDATA[otimização]]></category> <category><![CDATA[qualidade]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=203</guid> <description><![CDATA[Há um bom tempo atrás rolou uma discussão na lista do PHPMS sobre um comparativo de performance entre PHP x Python x Ruby x Perl. Bom, a conclusão que tirei do comparativo foi de que a velocidade de execução é &#8230; <a
href="http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Há um bom tempo atrás rolou uma discussão na lista do PHPMS sobre um <a
title="PHP x Python x Ruby x Perl" href="http://groups.google.com/group/phpms/browse_thread/thread/f4e76f4d94763866/f76cb1b77f28a25b" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/phpms/browse_thread/thread/f4e76f4d94763866/f76cb1b77f28a25b?referer=');">comparativo de performance</a> entre PHP x Python x Ruby x Perl.</p><p>Bom, a conclusão que tirei do comparativo foi de que a velocidade de execução é importante, mas mais do que isso, o programador é essencial. No exemplo da thread supracitada, o PHP perdia feio para as outras linguagens, mas olhando para o código escrito em PHP, dava para notar  vários erros de uso da linguagem e suas funções (ponto para o <a
href="http://twitter.com/begnini" onclick="pageTracker._trackPageview('/outgoing/twitter.com/begnini?referer=');">Begnini</a> que viu o código antes de todos).</p><p>Então a dica de hoje é: estude bem a linguagem. Procure a saber o funcionamento das funções e construções da linguagem, isso é essencial para se tornar um bom programador.</p><p>Exemplos de código</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//uso comum</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//forma mais adequada</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$c</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//outro caso, ao invés de forçar várias verificações</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//use a estrutura adequada</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">else</span> <span style="color: #666666; font-style: italic;">//não precisa fazer o último teste</span>
 <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// esse último caso que me inspirou a fazer o post</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// a pessoa só queria saber se o array $var tava vazio, e para isso contou todos os seus elementos</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// enquanto ela poderia ter usado uma verificação direta como</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span></pre></div></div><p>Este último caso, que motivou o post foi visto no changelog da versão 1.2.6 do CakePHP. Neste caso o &#8220;erro&#8221; foi encontrado e corrigido pelo brasileiro <a
title="Blog do Juan Basso" href="http://blog.cakephp-brasil.org/" onclick="pageTracker._trackPageview('/outgoing/blog.cakephp-brasil.org/?referer=');">Juan Basso</a> neste <a
title="Commit do Juan Basso para o CakePHP 1.2.6 - otimizações" href="http://github.com/cakephp/cakephp1x/commit/a96c157d948e2f3c1fa55b5d422121c323859626" onclick="pageTracker._trackPageview('/outgoing/github.com/cakephp/cakephp1x/commit/a96c157d948e2f3c1fa55b5d422121c323859626?referer=');">commit</a>.</p><p>O intuito do post não é meter o dedo na cara de ninguém, apenas alertar para situações onde culpamos uma determinada linguagem pelo desempenho de nossa aplicação quando o problema na verdade é o mal uso que estamos fazendo.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; Parte 3</a></li><li><a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li><li><a
href="http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/" rel="bookmark" class="crp_title">Dica Rápida &#8211; Evitando problemas com uso de jQuery e imagens</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>CakePHP 1.3 quase assado</title><link>http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/</link> <comments>http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/#comments</comments> <pubDate>Wed, 27 Jan 2010 02:49:50 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[CakePHP-1.3]]></category> <category><![CDATA[desenvolvimento]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=178</guid> <description><![CDATA[Pouco mais de um ano após o lançamento da versão 1.2.0 do CakePHP, está para ser lançado, dia 13 de fevereiro, a versão 1.3 deste poderoso framework. Tenho feito alguns testes em cima dele, estou inclusive reescrevendo um pequeno CMS &#8230; <a
href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Pouco mais de um ano após o lançamento da versão 1.2.0 do CakePHP, está para ser lançado, dia 13 de fevereiro, a versão 1.3 deste poderoso framework.</p><p>Tenho feito alguns testes em cima dele, estou inclusive reescrevendo um pequeno CMS que possuímos na empresa em cima desta versão (árvore 1.3-dev do repositório do projeto) e apesar de alguns pequenos bugs (ainda é uma versão de desenvolvimento, né?) esta versão possui muitas melhorias na sintaxe &#8211; que agora está mais concisa &#8211;  e novas funcionalidades.</p><p>Para a migração de nossa aplicação, não foi preciso alterar muita coisa, porém para grandes aplicações, deve-se considerar a necessidade do upgrade.</p><p>Abaixo segue uma lista de links para algumas páginas com informações sobre esta nova versão do CakePHP (todas em inglês):</p><ul><li><a
title="TODO list do CakePHP 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/13-todo-list" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/13-todo-list?referer=');">Lista de <em>TODO</em> (tudo que já foi realizado está riscado)</a></li><li><a
title="Lista de novas funcionalidades/recursos do CakePHP 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/13-new-features" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/13-new-features?referer=');">Novas <em>features</em></a></li><li><a
title="Guia de migração de uma aplicação utilizando CakePHP da versão 1.2 para a 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/13-migration-guide" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/13-migration-guide?referer=');">Guia de migração (upgrade de aplicação feita com o CakePHP 1.2 para 1.3)</a></li></ul><p>Caso tenha interesse em ajudar os desenvolvedores, baixe a <a
title="Fonte do CakePHP 1.3 no GitHub" href="http://github.com/cakephp/cakephp1x/tree/1.3" onclick="pageTracker._trackPageview('/outgoing/github.com/cakephp/cakephp1x/tree/1.3?referer=');">versão em desenvolvimento</a> e faça alguns testes. Só não esqueça de <a
title="Tickets do Cake 1.x" href="http://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets?referer=');">reportar</a> eventuais problemas ou patchs que você venha a produzir. Não se preocupem com o tempo de resposta da equipe de desenvolvimento, eles realmente estão empenhados em fazer um bom trabalho, é possível que tenha feedback de seu ticket/patch em menos de 1 hora &#8211; experiência própria.</p><p>Logo que concluir algumas tarefas e tiver feito mais testes colocarei aqui meu &#8220;parecer&#8221; sobre a nova versão, enquanto isso <a
title="Informações de desenvolvimento do CakePHP 1.x" href="http://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/overview" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648-cakephp-1x/overview?referer=');">acompanhe a página de desenvolvimento</a> para ficar por dentro das atualizações.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a
href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li><li><a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a
href="http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/" rel="bookmark" class="crp_title">Joomla! 1.6 &#8211; O que está para chegar&#8230;</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Trabalhando com PHP 5.2 no OpenSUSE 11.2 (Downgrade do PHP 5.3 para 5.2)</title><link>http://cauancabral.net/2010/01/17/trabalhando-com-php-5-2-no-opensuse-11-2-downgrade-do-php-5-3-para-5-2/</link> <comments>http://cauancabral.net/2010/01/17/trabalhando-com-php-5-2-no-opensuse-11-2-downgrade-do-php-5-3-para-5-2/#comments</comments> <pubDate>Sun, 17 Jan 2010 12:42:33 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[opensuse]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Tutoriais]]></category> <category><![CDATA[instalação]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[php5.3]]></category> <category><![CDATA[tutorial]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=167</guid> <description><![CDATA[No final de 2009 foi lançado a versão 11.2 do OpenSUSE, e como de costume para esta distro, todos os seus pacotes foram atualizados para a última (ou uma das últimas) versão estável. Isso aconteceu como PHP (que no lançamento &#8230; <a
href="http://cauancabral.net/2010/01/17/trabalhando-com-php-5-2-no-opensuse-11-2-downgrade-do-php-5-3-para-5-2/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>No final de 2009 foi lançado a versão 11.2 do OpenSUSE, e como de costume para esta distro, todos os seus pacotes foram atualizados para a última (ou uma das últimas) versão estável. Isso aconteceu como PHP (que no lançamento estava na versão 5.3) como o MySQL (versão 5.1) dentre vários outros.</p><p>Acontece que quem trabalha com Drupal, Joomla! ou CakePHP (última  versão estável é a 1.2) deve aguardar ainda para poder utilizar a versão 5.3 do PHP, que <a
title="Artigo sobre o PHP 5.3 feito antes de seu lançamento" href="http://phpms.org/artigos/4-codigo/66-o-futuro-do-php" onclick="pageTracker._trackPageview('/outgoing/phpms.org/artigos/4-codigo/66-o-futuro-do-php?referer=');">incluí</a> <a
title="Guia de migração para o PHP 5.3" href="http://br2.php.net/migration53" onclick="pageTracker._trackPageview('/outgoing/br2.php.net/migration53?referer=');">várias</a> <a
title="Lista de incompatibilidades entre a versão 5.3 e 5.2" href="http://br2.php.net/manual/en/migration53.incompatible.php" onclick="pageTracker._trackPageview('/outgoing/br2.php.net/manual/en/migration53.incompatible.php?referer=');">mudanças</a>, caso contrário eles podem não funcionar ou apresentar vários avisos.</p><p>Pesquisando sobre o problema descobri que não há no repositório do OpenSUSE (os oficiais nem nos mais conhecidos) o PHP 5.2 disponível, então como fazer? Baixar o fonte e compila-lo? É uma saída, mas queria algo &#8220;OpenSUSU-like&#8221; (mais fácil).</p><p>Dando uma vasculhada no oráculo encontrei <a
href="http://www.badzilla.co.uk/openSUSE-11.2-Downgrade-PHP-5.3-to-5.2" onclick="pageTracker._trackPageview('/outgoing/www.badzilla.co.uk/openSUSE-11.2-Downgrade-PHP-5.3-to-5.2?referer=');">openSUSE 11.2: Downgrade PHP 5.3 to 5.2</a></p><p>Resolvi adaptar algumas coisas e funcionou perfeitamente, vamos lá aos passos com minhas modificações:</p><ol><li>Abra o Gerenciador de Software;</li><li>Vá no menu &#8220;Configuração&#8221; -&gt; &#8220;Repositórios&#8221;;</li><li>Procure o repositório &#8220;Atualizações Para o OpenSUSE 11.2-0&#8243;, clique sobre ele e depois no botão editar, na parte inferior da janela;</li><li>No campo &#8220;Diretório do Servidor&#8221; altere o &#8220;11.2&#8243; para &#8220;11.1&#8243; e então clique em OK; Na versão 11.1 o PHP está na versão 5.2</li><li>Procure o repositório &#8220;OpenSUSE 11.2 OSS&#8221;, clique sobre ele e depois no botão editar; Este e o próximo passo são necessário caso você deseje fazer o downgrade do MySQL para versão 5.0 (eu recomendo isso para deixar tudo compatível, como era no OpenSUSE 11.1)</li><li>No campo &#8220;Diretório do Servidor&#8221; altere o &#8220;11.2&#8243; para &#8220;11.1&#8243; e então clique em OK;</li><li>Novamente clique em OK na listagem de repositórios;</li><li>De volta a janela de gerenciamento de software, pesquise por PHP5, caso você já tenha instalado o PHP 5.3 aproveite agora para remover tudo relativo a ele, caso contrário selecione os pacotes que precisar e tenha certeza de marcar a versão correta (para mim foi 5.2.11). Verifique a versão de cada pacote clicando sobre ele e em seguida na aba &#8220;Versões&#8221; da janela, se houver mais de uma, marque a relativa ao PHP 5.2.x (onde x for o maior disponível);</li><li>Agora, pesquise os pacotes relativos ao MySQL (utilize o termo &#8220;mysql&#8221; na caixa de busca);</li><li>Você deve marcar as opções &#8220;libmysqlclient15&#8243;, &#8220;mysql&#8221; e &#8220;mysqlclient&#8221; conferindo se todos estão com a versão selecionada para 5.0.x (onde x é o maior número disponível);</li><li>Clique agora em OK para instalar os pacotes, uma janela irá abrir informando a necessidade de instalar alguma dependência. Dê uma olhada se não há conflitos e clique em OK; Agora é só aguardar.</li><li>Abra agora o &#8220;Repositórios de Software&#8221; e volte os repositórios para sua configuração original (trocando o 11.1 para 11.2), caso contrário não receberá as últimas atualizações dos outros softwares. Recomendo também que vá ao &#8220;Gerenciador de Software&#8221; e bloqueie os pacotes que instalou, para que o OpenSUSE não tente atualiza-los (os pacotes do PHP e MySQL);</li><li>Depois de instalar os pacotes, reinicie seu Apache logando-se como root no terminal e executando o comando &#8220;rcapache2 restart&#8221;; Verifique se o PHP está funcionando corretamente. Deve estar;</li><li>No OpenSUSE 11.2 o <a
href="http://en.opensuse.org/MySQL-5.1" onclick="pageTracker._trackPageview('/outgoing/en.opensuse.org/MySQL-5.1?referer=');">socket do MySQL mudou de endereço</a>, mas como instalamos a versão antiga do MySQL não teremos essa alteração, porém alguns aplicativos (além do PHP) usam o MySQL (como o meu Amarok), então vamos criar um link simbólico onde deveria ser o endereço novo apontando para o antigo para que não haja problema, faremos isso como root;</li><li>Crie o diretório que é padrão para o socket na versão 11.2 do OpenSUSE: mkdir /var/run/mysql</li><li>Entre no diretório criado e crie o link simbólico para o socket: ln -s mysql.sock /var/lib/mysql/mysql.sock</li><li>Reinicie seu OpenSUSE e bom proveito.</li></ol><p>Caso tenha alguma dúvida deixe-a nos comentários. Se necessário tiro alguns screenshots para ilustrar melhor.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2009/02/06/novidades-de-janeiro/" rel="bookmark" class="crp_title">Novidades de janeiro</a></li><li><a
href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/" rel="bookmark" class="crp_title">CakePHP 1.3 quase assado</a></li><li><a
href="http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/" rel="bookmark" class="crp_title">Joomla! 1.6 &#8211; O que está para chegar&#8230;</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a
href="http://cauancabral.net/2009/01/14/ajax-com-prototype/" rel="bookmark" class="crp_title">AJAX com Prototype</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/01/17/trabalhando-com-php-5-2-no-opensuse-11-2-downgrade-do-php-5-3-para-5-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Latinoware 2009 &#8211; COLAPHP &#8211; Evento fantástico</title><link>http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/</link> <comments>http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/#comments</comments> <pubDate>Sat, 16 Jan 2010 14:56:24 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Desenvolvimento Web]]></category> <category><![CDATA[eventos]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[flex]]></category> <category><![CDATA[latinoware]]></category> <category><![CDATA[mini-curso]]></category> <category><![CDATA[palestra]]></category> <guid
isPermaLink="false">http://geek.cauancabral.net/?p=155</guid> <description><![CDATA[Eae pessoal, tudo tranquilo? Tenho andado bem corrido ultimamente e não tenho conseguido dar a atenção que queria ao blog. De agora em diante as coisas não devem melhorar muito, mas farei o possível para trazer coisas interessantes pra cá. &#8230; <a
href="http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Eae pessoal, tudo tranquilo?</p><p>Tenho andado bem corrido ultimamente e não tenho conseguido dar a atenção que queria ao blog. De agora em diante as coisas não devem melhorar muito, mas farei o possível para trazer coisas interessantes pra cá.</p><p>Desde o dia 21/10/2009 estou em Foz do Iguaçu &#8211; PR, para participar do Latinoware 2009, um dos maiores eventos de software livre das Américas.<br
/> Estou tendo a oportunidade de ministrar um minicurso e apresentar uma palestra no &#8220;subevento&#8221; COLAPHP &#8211; Congresso Latinoamericano de PHP, que possui uma trilha dedicada a linguagem dentro do  Latinoware.</p><p>A experiência não poderia estar sendo melhor. Pude conhecer excelentes profissionais e fazer muitas amizades.</p><p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; fim do rascunho 1 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p><p>Nos dias 23 e 24 de outubro tive a oportunidade de ministrar um minicurso e uma palestra dentro da trilha COLAPHP do Latinoware.</p><p>Ambos tratavam do CakePHP, no caso do minicurso fizemos uma introdução no framework, falando um pouco de seu funcionamento, suas convenções e criamos rapidamente uma aplicação simples utilizando o terminal com o Bake.</p><p>O slides utilizado no minicurso foi este:</p><p><object
style="margin:0px" width="425" height="355"><param
name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2474507&amp;doc=cakephp-091111083152-phpapp01" /><param
name="allowFullScreen" value="true"/><param
name="allowScriptAccess" value="always"/><param
name="wmode" value="transparent" /><embed
src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2474507&amp;doc=cakephp-091111083152-phpapp01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355" wmode="transparent"></embed></object></p><p>No caso da palestra, falei novamente sobre a integração de aplicações escritas em CakePHP e Flex, dando uma revisada na apresentação. Ela ficou assim:</p><p><object
style="margin:0px" width="425" height="355"><param
name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2928697&amp;doc=flexphp-100116083159-phpapp02" /><param
name="allowFullScreen" value="true"/><param
name="allowScriptAccess" value="always"/><param
name="wmode" value="transparent" /><embed
src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2928697&amp;doc=flexphp-100116083159-phpapp02" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355" wmode="transparent"></embed></object></p><p>Aproveito o espaço (e a disponibilidade de tempo) para agradecer todos que participaram do evento como um todo, seja na organização, apoio ou assistindo, perguntando, corrigindo e ajudando a gente durante as apresentações. Obrigado a todos.</p><p>&#8212;&#8212;&#8212;&#8212;&#8212;- fim do rascunho 2 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p><p>O texto do rascunho 1 foi escrito em 23/10/2009, o do rascunho 2 logo após o evento, hoje é 16/01/2010 e o textos ainda estevam como rascunho para ser publicado no blog. Pois é, esse final de ano foi realmente muito corrido, mas valeu a pena.</p><p>Agora é hora de se organizar para poder ter um 2010 ainda mais proveitoso (de começo ele já está sendo muito melhor).</p><p>Até breve.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/" rel="bookmark" class="crp_title">1º Workshop PHPMS &#8211; PHP Extremo, SUCESSO</a></li><li><a
href="http://cauancabral.net/2009/09/24/2%c2%ba-workshop-phpms/" rel="bookmark" class="crp_title">2º Workshop PHPMS</a></li><li><a
href="http://cauancabral.net/2008/09/21/software-freedom-day-08-sucesso/" rel="bookmark" class="crp_title">Software Freedom Day 08 &#8211; Sucesso!</a></li><li><a
href="http://cauancabral.net/2008/05/08/voltando-a-ativa-no-bom-sentido/" rel="bookmark" class="crp_title">Voltando a ativa ( no bom sentido )</a></li><li><a
href="http://cauancabral.net/2009/06/14/workshop-php-extremo/" rel="bookmark" class="crp_title">Workshop PHP Extremo</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>1º Workshop PHPMS &#8211; PHP Extremo, SUCESSO</title><link>http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/</link> <comments>http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/#comments</comments> <pubDate>Sun, 12 Jul 2009 03:42:54 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[eventos]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[amf]]></category> <category><![CDATA[flex]]></category> <category><![CDATA[phpms]]></category> <category><![CDATA[slides]]></category> <category><![CDATA[workshop]]></category> <guid
isPermaLink="false">http://geek.cauancabral.net/?p=132</guid> <description><![CDATA[É com grande alegria que informo a todos o sucesso que atingimos com a realização de nosso primeiro Workshop. Tudo no evento saiu melhor do que esperado (menos um pedacinho da minha apresentação, mas isso é detalhe,hehehe). Tivemos público maior &#8230; <a
href="http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>É com grande alegria que informo a todos o sucesso que atingimos com a realização de nosso primeiro Workshop. Tudo no evento saiu melhor do que esperado (menos um pedacinho da minha apresentação, mas isso é detalhe,hehehe).</p><p>Tivemos público maior do que o esperado, e todos muito participativos, a quantidade de empresas apoiando também foi grande &#8211; principalmente se pegarmos como referência outros eventos de Campo Grande. O nível das apresentações também estavam muito bem definido. Enfim, se melhorasse era perigoso estragar.</p><p>Passei a última semana inteira preparando minha apresentação no workshop, inclusive quase não durmi essa noite (3 horas exatas), mas no final tudo aconteceu dentro dos conformes. A participação dos presentes foi outro ponto que me chamou a atenção, serviu para provar que quem estava ali realmente sabia o que estava fazendo ali.</p><p>Quero aproveeitar mais uma vez para agradecer a todos que ajudaram de alguma forma no evento: organizadores e amigos<a
title="Blog do PorKaria" href="http://porkaria.wordpress.com" onclick="pageTracker._trackPageview('/outgoing/porkaria.wordpress.com?referer=');"> (porkaria, </a><a
title="Blog do José Ricardo, vulgo zehzinho" href="http://josericardo.eti.br" onclick="pageTracker._trackPageview('/outgoing/josericardo.eti.br?referer=');">zehzinho</a>, Leonardo), o sempre disposto palestrante e amigo <a
title="Raphox homepage" href="http://sites.google.com/site/raphoxaraujo/" onclick="pageTracker._trackPageview('/outgoing/sites.google.com/site/raphoxaraujo/?referer=');">Raphael</a> (raphox), aos apoiadores, aos patrocinadores e claro, a todos os presentes que acreditaram no evento e compareceram mesmo com o tempo ruim.</p><p>Para quem foi ao evento e gostaria de ver a apresentação de slides que utilizei, ela está acessível pelo endereço:<a
title="Slidshare - PHP + Flex" href="http://www.slideshare.net/cauancabral/php-flex" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/cauancabral/php-flex?referer=');"> http://www.slideshare.net/cauancabral/php-flex</a><br
/> Na apresentação falei sobre a utilização de Flex para construção de RIA&#8217;s juntamente com PHP (mais especificamente utilizando o framework  CakePHP), o exemplo da palestra pode ser encontrado no repositório svn: http://svn.radig.com.br/pagode &#8211; na data da  palestra a versão utilizada foi a #3, o sistema será complementado até que se torne realmente um sistema de controle financeiro pessoal. Portanto se tiver interesse no mesmo, acompanhe aqui no blog as novidades do projeto.</p><p>&#8212;&#8212;&#8212;-</p><p>O Raphox e o Porkaria também liberaram os slides das palestras, veja <a
title="PorKaria - PHP no Mundo Mobile" href="http://www.slideshare.net/porkaria/php-no-mundo-mobile" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/porkaria/php-no-mundo-mobile?referer=');">aqui</a> e a<a
title="Slides do Raphox - ORM" href="http://docs.google.com/Presentation?id=ajfp9mn744m4_8dbxjj8hh" onclick="pageTracker._trackPageview('/outgoing/docs.google.com/Presentation?id=ajfp9mn744m4_8dbxjj8hh&amp;referer=');">qui</a> respectivamente.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a
href="http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/" rel="bookmark" class="crp_title">Latinoware 2009 &#8211; COLAPHP &#8211; Evento fantástico</a></li><li><a
href="http://cauancabral.net/2008/09/21/software-freedom-day-08-sucesso/" rel="bookmark" class="crp_title">Software Freedom Day 08 &#8211; Sucesso!</a></li><li><a
href="http://cauancabral.net/2010/03/20/3%c2%ba-workshop-do-phpms/" rel="bookmark" class="crp_title">3º Workshop do PHPMS</a></li><li><a
href="http://cauancabral.net/2009/09/24/2%c2%ba-workshop-phpms/" rel="bookmark" class="crp_title">2º Workshop PHPMS</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>CakePHP &#8211; Dúvidas Comuns #2</title><link>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/</link> <comments>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/#comments</comments> <pubDate>Thu, 26 Feb 2009 00:36:54 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Desenvolvimento Web]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Programação]]></category> <category><![CDATA[i10n]]></category> <category><![CDATA[i18n]]></category> <category><![CDATA[validação]]></category> <guid
isPermaLink="false">http://geek.cauancabral.net/?p=111</guid> <description><![CDATA[Dúvida: Como usar habilitar a internacionalização &#8211; o famoso I18N &#8211; nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views? Habilitar a internacionalização e ter a localização em &#8230; <a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Dúvida: Como usar habilitar a internacionalização &#8211; o famoso I18N &#8211; nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views?</p><p>Habilitar a internacionalização e ter a localização em uma aplicação com CakePHP desde a versão 1.2  é relativamente simples: basta uma lida no nosso <a
title="Internacionalizando uma aplicação em CakePHP" href="http://book.cakephp.org/pt/view/161/Internacionalizando" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/161/Internacionalizando?referer=');">Cookbook</a> e pronto.</p><p>Outra coisa que é relativamente simples de se fazer é validar os dados, basta termos um atributo em nosso modelo chamado &#8220;validate&#8221; e seguir as dicas do <a
title="Validação de dados com CakePHP" href="http://book.cakephp.org/pt/view/125/Valida%C3%A7%C3%A3o-de-dados" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/125/Valida_C3_A7_C3_A3o-de-dados?referer=');">livro de receitas</a>.</p><p>Mas pelo Cookbook somos induzidos a fornecer a mensagem de erro na hora de criar a View, algo que eu particularmente não gosto. É até comum termos um modelo que é usado por Controllers diferentes e consequêntemente por Views diferentes.</p><p>Uma maneira de evitar isso, é definir as mensagens de erro já na definição das regras de validação, dentro do atributo &#8220;validate&#8221; do seu modelo. O grande problema é que para traduzir uma determinada expressão utilizamos um método, e a chamada de método na definição estática de um atributo não é permitida no PHP (dúvida? tente fazer o código abaixo)</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Modelo <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span> <span style="color: #339933;">=</span> _<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ola mundo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//esse código não devera ser executado</span></pre></div></div><p>A solução para isso é a atribuição das regras de validação no momento da instanciação da classe, ou seja, no seu método construtor, da seguinte maneira</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">class</span> Modelo <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #666666; font-style: italic;">/* aqui você pode definir as regras e mensagens,mesmo chamando um método */</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>Qualquer dúvida não deixem de utilizar os comentários ;]</p><p>&#8212;&#8212;&#8211;<br
/> Atualizado: havia esquecido da chamada ao construtor da superclasse AppModels ( através do parent::__construct() ) no último código mostrado.<br
/> &#8212;&#8212;&#8211;<br
/> <strong>Atualizado</strong></p><p>Obrigado ao José Tranca e Thiago Goulart pelos comentários, as soluções propostas por eles devem ser adotada em detrimento da minha, já que melhora consideravelmente a modularidade e reusabilidade das traduções.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li><li><a
href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li><li><a
href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>CakePHP &#8211; dúvidas comuns #1</title><link>http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/</link> <comments>http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/#comments</comments> <pubDate>Mon, 23 Feb 2009 19:47:02 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[ActionScript]]></category> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Joomla!]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Programação]]></category> <category><![CDATA[dúvidas]]></category> <category><![CDATA[habtm]]></category> <guid
isPermaLink="false">http://geek.cauancabral.net/?p=105</guid> <description><![CDATA[Como já comentei algumas vezes, estou desenvolvendo com um framework MVC em PHP chamado CakePHP. Ele foi construído com intuíto de provar o potencial do PHP (na época em comparação ao Ruby e o Ruby on Rails). Se precisar de &#8230; <a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Como já comentei algumas vezes, estou desenvolvendo com um framework <a
href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Model_E2_80_93view_E2_80_93controller?referer=');">MVC</a> em PHP chamado <a
title="Página oficial do framework CakePHP" href="http://www.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/www.cakephp.org?referer=');">CakePHP</a>. Ele foi construído com intuíto de provar o potencial do PHP (na época em comparação ao <a
href="http://www.ruby-lang.org/pt/" onclick="pageTracker._trackPageview('/outgoing/www.ruby-lang.org/pt/?referer=');">Ruby</a> e o <a
href="http://www.rubyonrails.pro.br/" onclick="pageTracker._trackPageview('/outgoing/www.rubyonrails.pro.br/?referer=');">Ruby on Rails</a>). Se precisar de mais informações sobre o framework sugiro leitura do seu <a
title="Documentação oficial do CakePHP" href="http://book.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org?referer=');">Cookbook</a> e de outros blogs a respeito.</p><p>Desde que descobri o CakePHP faço parte do grupo <a
title="Grupo de discussão sobre CakePHP em português" href="http://groups.google.com/group/cakephp-pt/" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/cakephp-pt/?referer=');">CakePHP Tuga</a> e ocasionalmente no canal de IRC do grupo #cakephp-pt na rede Freenode.org, e já tive a oportunidade de aprender e ajudar diversas vezes.</p><p>Vamos as dúvidas:</p><ol><li>Como salvar dados de um formulário que envolva um relacionamenteo de &#8220;muitos para muitos&#8221;/many-to- many ou ainda de HasAndBelongToMany (HABTM) ?</li></ol><p>Nesta dúvida temos que ter em mente que o CakePHP faz todas as ligações entre nossos modelos desde que sigamos suas convenções, caso façamos isso, não haverá dificuldades.<br
/> Mas quais são essas convenções? <a
title="Conveções do CakePHP" href="http://book.cakephp.org/pt/view/22/Conven%C3%A7%C3%B5es-no-CakePHP" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/22/Conven_C3_A7_C3_B5es-no-CakePHP?referer=');">Veja você mesmo</a>.</p><p>Um detalhe que não podemos esquecer é que por padrão o CakePHP está preparado para tratar suas convenções em inglês, então, se não quisermos ter de modificar as configurações padrões, temos de desenvolver em inglês. Ok?</p><p>Seguindo todas as conveções o que fica faltando? É preciso saber como um relacionamento HABTM se manifesta em um formulário, ou seja, como ele é apresentado. No CookBook temos um <a
title="Salvando dados em um HABTM" href="http://book.cakephp.org/pt/view/85/Salvando-dados-em-tabelas-relacionadas-HABTM" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/85/Salvando-dados-em-tabelas-relacionadas-HABTM?referer=');">texto</a> sobre o caso. Resumindo, o que temos de ter é:</p><ul><li>Um formulário com o nome de um dos modelos envolvidos no relacionamento. Por exemplo, em um blog temos um modelo Post e outro Tags, os dois estão ligados por um HABTM, então no formulário para inserir um Post, o nome de formulário seria Post.</li><li>Um ou mais campos identificados com o outro modelo parte do relacionamento e sua chave. No nosso exemplo seriam um ou mais campos com o nome &#8216;Tag.Tag&#8217;.</li></ul><p>No item anterior que surge a principal dúvida: como definir o nome do meu campo? que tipo de campo usar?</p><p>Primeiro definimos o tipo de campo a se utilizar: normalmente utilizamos um Select box para multiplas seleções OU um conjunto de Checkbox. Qualquer que seja a escolha o restante é bem simples:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/*
$tag é o retorno de um find('list') com os campos id e name selecionados
$tags = array( array('id' =&gt; 1, 'name' =&gt; 'tag 1'), array('id' =&gt; 2, 'name' =&gt; 'tag 2') );
&nbsp;
o índice 'multiple' só deve ser utilizado quando quiser um conjunto de checkbox
*/</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Tag.Tag'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'select'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'multiple'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'checkbox'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'options'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$tags</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'labels'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Selecione as tags'</span>
	<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>Com isso seu formulário já retornará o que é esperado pelo CakePHP e tudo que será necessário para salvar os dados do relacionamento é utilizar o método &#8216;saveAll&#8217; ao invés de &#8216;save&#8217;.</p><p>Ainda esta semana comentarei das dúvidas sobre validação.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a
href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li><li><a
href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Desenvolvimento rápido</title><link>http://cauancabral.net/2008/09/21/desenvolvimento-rapido/</link> <comments>http://cauancabral.net/2008/09/21/desenvolvimento-rapido/#comments</comments> <pubDate>Sun, 21 Sep 2008 22:41:27 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Desenvolvimento Web]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Programação]]></category> <category><![CDATA[ágil]]></category> <category><![CDATA[framework]]></category> <guid
isPermaLink="false">http://geek.cauancabral.net/2008/09/21/desenvolvimento-rapido/</guid> <description><![CDATA[Últimamente está na moda a palavra &#8220;ágil&#8221;. Você têm de projetar rápido, desenvolver rápido, implementar rápido para ser considerado ágil. E apesar do PHP fornecer centenas de funções prontas para diversas tarefas rotineiras, ele perde feio comparado a outras linguagens &#8230; <a
href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Últimamente está na moda a palavra &#8220;ágil&#8221;.<br
/> Você têm de projetar rápido, desenvolver rápido, implementar rápido para ser considerado ágil.</p><p>E apesar do <a
href="http://br.php.net" onclick="pageTracker._trackPageview('/outgoing/br.php.net?referer=');">PHP</a> fornecer centenas de funções prontas para diversas tarefas rotineiras, ele perde feio comparado a outras linguagens mais novas como Ruby ou Python, principalmente quando juntamos a estas seus grandes frameworks &#8211; Rails no caso do Ruby e Django no caso do Python.</p><p>Mas a comunidade PHP tem suas cartas na manga, vários frameworks agilizam o desenvolvimento tanto em aplicações simples como em aplicações sofisticadas.<br
/> E são várias as opções. Tem para todos os gostos, nos próximo posts vou falar um pouco deles.</p><p>Hoje começo com o <a
href="http://www.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/www.cakephp.org?referer=');">CakePHP</a>:</p><p><span
style="font-weight: bold;">Descrição:</span><br
/> Compete de frente com o Rails. Possui uma base bem estruturada, código bem organizado, comunidade participativa e uma licensa flexivel. Seu grande destaque está no baker, que gera ações básicas (criar,ler,atualizar e apagar entradas) para uma tabela do banco de dados.</p><p><span
style="font-weight: bold;">Como usa-lo?</span><br
/> É muito fácil, basta ir a página <a
href="http://cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/cakephp.org/?referer=');">dele</a> e fazer o download do último lançamento. Recomendo a versão 1.2.xx , apesar de ser RC2 (candidata a estável) ela já está bem estável e possui vários melhoramentos em relação a versão 1.1.xx.<br
/> Em seguida descompacte o arquivo onde achar melhor (dentro de seu servidor web) e pronto. Agora só falta você configurar o arquivo &#8220;/app/config/database.php&#8221;. Nele você encontra instruções de como inserir as informações para acessar o seu banco de dados, há até um exemplo de como fazer.<br
/> Agora é só acessar, através do navegador, a pasta que você descompactou o CakePHP.</p><p><span
style="font-weight: bold;">Onde encontrar material para estudo?</span><br
/> Como comentei antes, o CakePHP possui uma comunidade bem participativa, mas a maioria não fala português, então você encontrará bastante informação em inglês, aqui listo alguns sites e blogs com informações sobre o tema, bons estudos:</p><ul><li><a
href="http://cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/cakephp.org/?referer=');">CakePHP</a> &#8211; A página oficial, sempre com novidades (inglês)</li><li><a
href="http://book.cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/?referer=');">The Cookbook</a> &#8211; O manual oficial do cake. Possui conteúdo para versão 1.1 e 1.2, sendo que a segunda esta sendo finalizada. Obrigatório. (em inglês com parte do conteúdo em português, só alterar no rodapé da página).</li><li><a
href="http://api.cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/api.cakephp.org/?referer=');">API for CakePHP</a> &#8211; A documentação das classes, métodos e funcionalidades do CakePHP. Não é muito rica em detalhes, mas está melhorando. Obrigatório. (inglês)</li><li><a
href="http://lemoncake.wordpress.com/" onclick="pageTracker._trackPageview('/outgoing/lemoncake.wordpress.com/?referer=');">lemoncake</a> &#8211; Um blog com várias discussões sobre CakePHP e dicas/tutoriais de como usar recursos do Cake. Muito recomendado. (inglês).</li><li><a
href="http://aranworld.com/article/161/cakephp-acl-tutorial-what-is-it" onclick="pageTracker._trackPageview('/outgoing/aranworld.com/article/161/cakephp-acl-tutorial-what-is-it?referer=');">aranworld</a> &#8211; Um blog que tem posts esporádicos a respeito do CakePHP, mas no link que vinculei, há uma série de posts sobre o sistema de controle de acesso do CakePHP, uma ferramente extremamente poderosa mas que pode parecer complicada de utilizar no inicio. Muito recomendado. (inglês)</li><li><a
href="http://cakephp.com.br" onclick="pageTracker._trackPageview('/outgoing/cakephp.com.br?referer=');">CakePHP &#8211; Brasil</a> &#8211; Portal brasileiro sobre CakePHP, ótimo para quem não arrisca muito o inglês, possui dicas e até uma versão traduzida do manual. Muito recomendado. (português)</li></ul><p>E podem esperar que em breve haverá vários posts a respeito. Estou utilizando bastante o CakePHP e tenho gostado muito. Colocarei algumas dicas aqui logo logo.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/" rel="bookmark" class="crp_title">CakePHP 1.3 quase assado</a></li><li><a
href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li><li><a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2008/09/21/desenvolvimento-rapido/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
