<?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>KISS</title>
	<atom:link href="http://kiss.souagil.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://kiss.souagil.com.br</link>
	<description>Keep it simple, stupid!</description>
	<lastBuildDate>Mon, 26 Apr 2010 20:11:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lib para lidar com arquivos Zip no CakePHP</title>
		<link>http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/</link>
		<comments>http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 20:11:42 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/">Gabriel Gilini</span></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[lib]]></category>
		<category><![CDATA[zip]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=807</guid>
		<description><![CDATA[Em um projeto recente, precisei extrair arquivos zip no server, e no
processo criei uma classe para abstrair a manipulação dos arquivos.
Como no Dreamhost o PHP não vem com a zlib habilitada, não tem como
usar a ZipArchive, o que facilitaria muito as coisas. Mas o bom é que
o zlib é instalado no server, e os comandos [...]


<strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span>'><span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span></a> <small> A maioria já deve saber que o CakePHP está...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F04%2Flib-para-lidar-com-arquivos-zip-no-cakephp%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F04%2Flib-para-lidar-com-arquivos-zip-no-cakephp%2F" /></a></div><p>Em um projeto recente, precisei extrair arquivos zip no server, e no<br />
processo criei uma classe para abstrair a manipulação dos arquivos.</p>
<p>Como no Dreamhost o PHP não vem com a zlib habilitada, não tem como<br />
usar a ZipArchive, o que facilitaria muito as coisas. Mas o bom é que<br />
o zlib é instalado no server, e os comandos do PHP de execução de<br />
programas são habilitados, então criei a classe utilizando o `exec&#8217;<br />
para chamar o `unzip&#8217; e extrair os arquivos.</p>
<p>A classe está bem simples porque só implementei o necessário para meu<br />
projeto, mas é um esqueleto para quem precisar de algo mais completo.</p>
<p>Evitei o uso de expressões regulares por questão de performance. Aí vai o código:<br />
<script src="http://gist.github.com/379781.js"></script></p>
<p>Coloquem no diretório APP/lib, e usem assim:<br />
<script src="http://gist.github.com/379825.js?file=gistfile1.php"></script></p>


<p><strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span>'><span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span></a> <small> A maioria já deve saber que o CakePHP está...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validação de campos de texto com caracteres acentuados</title>
		<link>http://kiss.souagil.com.br/2010/04/validacao-de-campos-de-texto-com-caracteres-acentuados/</link>
		<comments>http://kiss.souagil.com.br/2010/04/validacao-de-campos-de-texto-com-caracteres-acentuados/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 17:00:56 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/04/validacao-de-campos-de-texto-com-caracteres-acentuados/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[utf-8]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=798</guid>
		<description><![CDATA[Recentemente tive um problema com a validação de um campo textual que me deu um pouco de dor de cabeça. Como acredito que esse pode ser um problema comum, vou compartilhar a solução aqui no blog.
Toda entrada textual deve ser representada com uma codificação de caracteres específica. Essas codificações são diversas, mas as mais conhecidas [...]


<strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-03-22 16:55:43" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" /><span rel="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" property="dc:title" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/">Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário</span>'><span property="dc:date" content="2010-03-22 16:55:43" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" /><span rel="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" property="dc:title" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/">Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário</span></a> <small>Uma das coisas mais frustrantes da navegação na internet é...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F04%2Fvalidacao-de-campos-de-texto-com-caracteres-acentuados%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F04%2Fvalidacao-de-campos-de-texto-com-caracteres-acentuados%2F" /></a></div><p>Recentemente tive um problema com a validação de um campo textual que me deu um pouco de dor de cabeça. Como acredito que esse pode ser um problema comum, vou compartilhar a solução aqui no blog.<br />
Toda entrada textual deve ser representada com uma <a href="http://en.wikipedia.org/wiki/Character_encoding">codificação de caracteres</a> específica. Essas codificações são diversas, mas as mais conhecidas e utilizadas são <acronym title="American Standard Code for Information Interchange"><a href="http://en.wikipedia.org/wiki/ASCII">ASCII</a></acronym>, <a href="http://en.wikipedia.org/wiki/ISO_8859-1">ISO 8859-1</a> e <a href="http://en.wikipedia.org/wiki/UTF-8">UTF-8</a>. Cada uma possui <a href="http://articles.sitepoint.com/article/guide-web-character-encoding">diferentes capacidades e características</a>, mas já adianto que a mais atraente delas é o UTF-8 (ou Unicode), sendo inclusive uma <a href="http://www.w3.org/International/O-charset.en.php">recomendação de utilização do W3C</a>.
</p>
<p>
Todo programador também sabe da importância de validar uma entrada do usuário antes de realizar qualquer operação com ela, e uma regra de validação comum é a quantidade de caracteres em uma entrada de texto. O CakePHP fornece <a href="http://book.cakephp.org/view/134/Core-Validation-Rules">regras de validação</a> como o <strong>minLength</strong>, <strong>maxLength</strong> e <strong>between</strong> para facilitar a vida do programador.
</p>
<p>
Agora imagine que você precisa validar um campo textual que deve ter entre 5 e 10 caracteres. Simples, defina a seguinte regra em seu modelo:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'campo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'rule'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'between'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'message'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Este campo precisa ter entre 5 e 10 caracteres.'</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Perfeito!</p>
<p>
Calma que não é bem assim. Imagine que o campo foi preenchido com o valor <em>&#8216;php é foda&#8217;</em>, uma string de tamanho 10. Curiosamente, essa string não passa na regra de validação. Por que?</p>
<p>
Ao observar a documentação das três regras que mencionei, vocês irão perceber que existe uma observação dizendo que o tamanho do dado é a quantidade de bytes utilizada para representá-lo. Na Web a <a href="http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html">maior parte dos textos é codificada em UTF-8, ISO-8859-1</a>, entre outros encodings, que podem <a href="http://revolucao.etc.br/archives/charsets-e-encodings/">utilizar mais de um byte para representar caracteres acentuados</a>, e esse é o motivo da regra de validação não funcionar para esse caso.</p>
<p>Também não adianta usar a função strlen() do PHP, porque ela possui o mesmo comportamento.</p>
<p>O que fazer então?</p>
<p>É claro que existe uma alternativa, que é a função <a href="http://www.php.net/manual/en/function.mb-strlen.php">mb_strlen</a>. Ela recebe 2 parâmetros, sendo o 2 opcional, mas de grande importância, que é justamente a codificação utilizada para a string do primeiro parâmetro.</p>
<p>O código</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #990000;">mb_strlen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'php é foda'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>retorna exatamente 10, o valor que desejamos.</p>
<p>Desse modo, nossa função de validação seria:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> validateInputLength<span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$encoding</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_detect_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'campo'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$lowerLimit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$upperLimit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">mb_strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'campo'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #000088;">$lowerLimit</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">mb_strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'campo'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$upperLimit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><p>Note o uso da função <a href="http://www.php.net/manual/en/function.mb-detect-encoding.php">mb_detect_encoding</a>, o que torna a função capaz de manipular qualquer tipo de string, não sendo dependente de nenhuma codificação de caracteres.</p>
<p>Apesar de ser uma questão simples, acredito que essa solução pode ajudar bastante.<br />
Alguém já teve problemas semelhantes? Como resolveram?</p>


<p><strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-03-22 16:55:43" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" /><span rel="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" property="dc:title" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/">Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário</span>'><span property="dc:date" content="2010-03-22 16:55:43" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" /><span rel="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" property="dc:title" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/">Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário</span></a> <small>Uma das coisas mais frustrantes da navegação na internet é...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/04/validacao-de-campos-de-texto-com-caracteres-acentuados/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Galeria de imagens similar à da Apple Store</title>
		<link>http://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/</link>
		<comments>http://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 14:42:05 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/">Gabriel Gilini</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[fancybox]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[mylib]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=795</guid>
		<description><![CDATA[Semana passada o dgmike fez um desafio em seu blog. O objetivo era construir uma galeria de imagens igual à vista na Apple Store do zero, e obviamente sem consultar o fonte do original.
Decidi que era uma boa oportunidade para treinar alguns conceitos de scripting e também divulgar meu trabalho. Além disso, vinha procurando uma [...]]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F03%2Fgaleria-de-imagens-similar-a-da-apple-store%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F03%2Fgaleria-de-imagens-similar-a-da-apple-store%2F" /></a></div><p>Semana passada o <a href="http://twitter.com/dgmike">dgmike</a> fez um <a href="http://dgmike.com.br/2010/03/23/desafio-javascript/trackback/">desafio</a> em seu blog. O objetivo era construir uma galeria de imagens igual à vista na <a href="http://store.apple.com/us/product/IPAD_KBDOCK?mco=MTcyMTgwOTg">Apple Store</a> do zero, e obviamente sem consultar o fonte do original.</p>
<p>Decidi que era uma boa oportunidade para treinar alguns conceitos de scripting e também divulgar meu trabalho. Além disso, vinha procurando uma desculpa pra trabalhar com a <a href="http://www.cinsoft.net/mylib.html">My Library</a>; melhor lib JavaScript já concebida, se você me perguntar.</p>
<p>Meti a mão na massa no fim de semana, e depois de quebrar a cabeça pra deixar algumas coisinhas redondas, consegui terminar uma <a href="http://www.souagil.com.br/gabriel/myimagegallery/">primeira versão do script</a>. Não testei extensivamente, mas sei que funciona em IE7, IE8, Opera8-10, Chrome e Firefox 2+.</p>
<p><a href="http://www.souagil.com.br/gabriel/myimagegallery/">Dê uma conferida no meu trabalho</a>, e diga o que achou aí nos comentários. Se encontrar qualquer bug ou tiver alguma sugestão, vou ficar feliz em ouvi-lo.</p>
<p>Update:<br />
<a href="http://www.cinsoft.net/mylib.html">David Mark</a> was nice enough to link my gallery at <a href="http://www.cinsoft.net/mylib-examples.html#userexamples">MyLib&#8217;s website</a>!<br />
Thanks, David!</p>
]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário</title>
		<link>http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/</link>
		<comments>http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 19:55:43 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/">Lucas Gameiro</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[erros HTTP]]></category>
		<category><![CDATA[experiência do usuário]]></category>
		<category><![CDATA[manipulação erros]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=743</guid>
		<description><![CDATA[Uma das coisas mais frustrantes da navegação na internet é quando você vê um link que te interessa e quando clica é redirecionado pra um erro.
O 404 é o mais comum deles, isso porque ele é muito fácil de acontecer. Se alguém citou uma página do seu site que não existe mais, ou algum erro [...]]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F03%2Fredirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F03%2Fredirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario%2F" /></a></div><p>Uma das coisas mais frustrantes da navegação na internet é quando você vê um link que te interessa e quando clica é redirecionado pra um erro.</p>
<p>O <a href="http://pt.wikipedia.org/wiki/HTTP_404">404</a> é o mais comum deles, isso porque ele é muito fácil de acontecer. Se alguém citou uma página do seu site que não existe mais, ou algum erro no script constroi uma url errada dinamicamente o 404 é invevitável você não vai percebê-lo rapidamente.</p>
<p>O CakePHP através do método link do <a href="http://book.cakephp.org/view/205/HTML">helper Html</a> já previne alguns problemas porém ainda não é possível administrar os erros de maneira fácil.<br />
Pensando nisso, eu desenvolvi um sistema para informar quando os 404 acontecem e criar redirecionamentos para que eles não se repitam. Isto não é difícil de ser feito já que o CakePHP tem boas maneiras de controlar este erro.</p>
<p>A primeira coisa a se fazer é criar a tabela onde ficaram armazenados estes erros.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`redirects`</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #ff0000;">`id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
    <span style="color: #ff0000;">`num_errors`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
    <span style="color: #ff0000;">`page_from`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
    <span style="color: #ff0000;">`page_to`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    <span style="color: #ff0000;">`num_redirects`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span><span style="color: #66cc66;">,</span>
    <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Após a tabela criamos o modelo com métodos para contar e manipular os erros e os redirecionamentos: (/models/redirect.php)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Redirect <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;">$name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Redirect'</span><span style="color: #339933;">;</span>  
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> manageError<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$redirects</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'first'</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;">'Redirect.page_from'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$url</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: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$redirects</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$redirects</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num_errors'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$redirects</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_from'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$url</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$redirects</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num_redirects'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$redirects</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_to'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$redirects</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num_errors'</span><span style="color: #009900;">&#93;</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: #000088;">$redirects</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> manageRedirect<span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlfrom</span><span style="color: #339933;">,</span> <span style="color: #000088;">$urlTo</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$redirect</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'first'</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;">'Redirect.page_from'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$urlfrom</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: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num_redirects'</span><span style="color: #009900;">&#93;</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: #000088;">$redirect</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Com isso, já podemos criar o armazenamento, redirecionamento e contagem dos erros. Esta será feita escrevendo a classe <a href="http://book.cakephp.org/view/154/Error-Handling">AppError</a> que é feita exatamente para manipular estes erros. (/app_error.php)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
    <span style="color: #000000; font-weight: bold;">class</span> AppError <span style="color: #000000; font-weight: bold;">extends</span> ErrorHandler<span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$Error</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> error404<span style="color: #009900;">&#40;</span><span style="color: #000088;">$params</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;">Redirect</span> <span style="color: #339933;">=</span> ClassRegistry<span style="color: #339933;">::</span><span style="color: #004000;">init</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$page</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Redirect</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span>
                <span style="color: #0000ff;">'first'</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;">'page_from'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</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: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$page</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_to'</span><span style="color: #009900;">&#93;</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;">Redirect</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">manageRedirect</span><span style="color: #009900;">&#40;</span>
                    <span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                    <span style="color: #000088;">$page</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_to'</span><span style="color: #009900;">&#93;</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$Dispatcher</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Dispatcher<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$Dispatcher</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_to'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Redirect</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">manageError</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</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;">controller</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_outputMessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error404'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora os erros já estão sendo contados e redirecionados porém sua administração tem que ser feita diretamente no banco de dados. É interessante portanto também criar métodos para gerenciar estes erros e redirecionamentos. ficamos então com o controller: (/controllers/redirects_controller.php)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> RedirectsController <span style="color: #000000; font-weight: bold;">extends</span> AppController <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Redirects'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$helpers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Html'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Form'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$paginate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'limit'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'num_errors'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'desc'</span>
        <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">function</span> 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;">Redirect</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;">'redirects'</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>
	<span style="color: #000000; font-weight: bold;">function</span> create_redirect<span style="color: #009900;">&#40;</span><span style="color: #000088;">$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: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$id</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</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;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirecionamento Inválido'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</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;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</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;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Redirect</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</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;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'O Redirecionamento foi salvo.'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</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;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'O Redirecionamento não pode ser salvo. Por favor, tente novamente.'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</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;">data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Redirect</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">function</span> delete<span style="color: #009900;">&#40;</span><span style="color: #000088;">$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: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$id</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;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirecionamento com id inválido'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</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;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Redirect</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">del</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$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;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirecionamento excluído'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</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;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Observem que este controller não está utilizando nenhum método de autenticação. Fica em aberto o método a ser utilizado sendo que todas as páginas devem ficar invisíveis ao usuário comum. As views necessárias para este controller são:<br />
create_redirect (/views/redirects/create_redirect.ctp):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;div class=&quot;redirects form&quot;&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'create_redirect'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
	&lt;fieldset&gt;
 		&lt;legend&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Criar Redirecionamento'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/legend&gt;
	<span style="color: #000000; font-weight: bold;">&lt;?php</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;">'id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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;">'page_from'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'URL do 404'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'disabled'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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;">'page_to'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Redirecionar para'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">?&gt;</span>
	&lt;/fieldset&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">end</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Criar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;
&lt;div class=&quot;actions&quot;&gt;
	&lt;ul&gt;
		&lt;li&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span>
					__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Excluir'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
					<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
						<span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'delete'</span><span style="color: #339933;">,</span>
						<span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">value</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirect.id'</span><span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
					<span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span>
					<span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span>
						__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Você tem certeza que deseja excluir # %s?'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
						<span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">value</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirect.id'</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: #000000; font-weight: bold;">?&gt;</span>
		&lt;/li&gt;
		&lt;li&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span>
					__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Listar 404s'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
					<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">?&gt;</span>
		&lt;/li&gt;
	&lt;/ul&gt;
&lt;/div&gt;</pre></div></div>

<p>e index (/views/redirects/index.ctp):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;div class=&quot;redirects index&quot;&gt;
&lt;h2&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Redirecionamentos'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/h2&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tr&gt;
    &lt;th&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sort</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'URL do 404'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'page_from'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/th&gt;
	&lt;th&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sort</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'número de erros'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'num_errors'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/th&gt;
	&lt;th&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sort</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'URL a redirecionar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'page_to'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/th&gt;
	&lt;th&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sort</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'número de redirecionamentos'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'num_redirects'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/th&gt;
	&lt;th class=&quot;actions&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Ações'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/th&gt;
&lt;/tr&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$redirects</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$redirect</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
	&lt;tr&gt;
		&lt;td&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_from'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		&lt;/td&gt;
		&lt;td&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num_errors'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		&lt;/td&gt;
		&lt;td&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page_to'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		&lt;/td&gt;
		&lt;td&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num_redirects'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		&lt;/td&gt;
		&lt;td class=&quot;actions&quot;&gt;
			<span style="color: #000000; font-weight: bold;">&lt;?php</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span>
					__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Criar Redirecionamento'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
					<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
						<span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'create_redirect'</span><span style="color: #339933;">,</span>
						<span style="color: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span>
					<span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">?&gt;</span>
            <span style="color: #000000; font-weight: bold;">&lt;?php</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span>
					__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Excluir'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
					<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
						<span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'delete'</span><span style="color: #339933;">,</span>
						<span style="color: #000088;">$redirect</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Redirect'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span>
					<span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">?&gt;</span>
		&lt;/td&gt;
	&lt;/tr&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paging&quot;&gt;
	<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prev</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;&lt; '</span><span style="color: #339933;">.</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'anterior'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'disabled'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
 | 	<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">numbers</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">next</span><span style="color: #009900;">&#40;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'próxima'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' &gt;&gt;'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'disabled'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<p>Pronto, agora temos uma ferramenta para gerenciar os erros 404 do site. Tomara que algum dia a frustração de pensar que um link solucionará meus problemas e tomar um 404 na lata diminua</p>
<p>Criei um projeto no github pra facilitar a baixar os arquivos. Está tudo neste <a target="_blank" href="http://github.com/lucasgameiro/CakePHP-HTTP-Error-Manager">link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>A importância do software livre e padrões abertos na Web</title>
		<link>http://kiss.souagil.com.br/2010/03/a-importancia-do-software-livre-e-padroes-abertos-na-web/</link>
		<comments>http://kiss.souagil.com.br/2010/03/a-importancia-do-software-livre-e-padroes-abertos-na-web/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 14:48:08 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/03/a-importancia-do-software-livre-e-padroes-abertos-na-web/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[padrões web]]></category>
		<category><![CDATA[software livre]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=745</guid>
		<description><![CDATA[
Ano passado um aluno de jornalismo da UEL me procurou para falar um pouco sobre minha &#8220;experiência&#8221; com software livre. Ele desejava saber minhas opiniões tanto no papel de usuário quanto de desenvolvedor, tanto para o mercado quanto para a área científica. Uma parte do resultado da pesquisa do Lucas de Godoy pode ser visto [...]


<strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span>'><span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span></a> <small>Acredito que Web vem tomando um caminho interessante com decisões...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F03%2Fa-importancia-do-software-livre-e-padroes-abertos-na-web%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F03%2Fa-importancia-do-software-livre-e-padroes-abertos-na-web%2F" /></a></div><p>
Ano passado um aluno de jornalismo da <abbr title="Universidade Estadual de Londrina">UEL</abbr> me procurou para falar um pouco sobre minha &#8220;experiência&#8221; com software livre. Ele desejava saber minhas opiniões tanto no papel de usuário quanto de desenvolvedor, tanto para o mercado quanto para a área científica. Uma parte do resultado da pesquisa do Lucas de Godoy pode ser visto <a href="http://vidaoperaria.blogspot.com/2010/03/o-software-livre-na-universidade.html">nesse post</a> do blog dele.
</p>
<p>
Há algum tempo o <a href="http://kiss.souagil.com.br/author/joaojose/">João José</a> postou aqui no blog sobre <a href="http://kiss.souagil.com.br/author/joaojose/">práticas para se tornar um melhor desenvolvedor CakePHP</a> e entre elas muitas estão relacionadas ao software livre ou a padrões abertos. Mas acredito que essas práticas não ajudam somente o desenvolvedor CakePHP, mas qualquer desenvolvedor.
</p>
<p>
Por que?<br />
Imagine a Web dependente da vontade de players de mercado com suas soluções proprietária e obscuras? Difícil? Então vamos voltar um pouco no tempo e lembrar da época da guerra dos browsers. Netscape e Microsoft disputavam quem tinha o melhor browser e para isso também disputavam a preferência dos desenvolvedores Web. Pouca importância era dada aos padrões do <a href="http://www.w3.org">W3C</a> e era muito comum implementar duas versões de um mesmo aplicativo Web.
</p>
<p>
Até hoje sofremos um pouco com os resultados dessa época negra da Web, mas o cenário mudou. Hoje os browsers brigam entre si para ver quem é o mais rápido em dar suporte total a <a href="http://www.w3.org/TR/html5/">HTML 5</a>, <a href="http://www.w3.org/TR/css3-roadmap/">CSS 3</a>, <a href="http://www.ecmascript.org/docs.php">EcmaScript</a> o que é muito positivo e na minha opinião o caminho certo. Não sou só eu que penso assim, <a href="http://www.w3.org/People/Berners-Lee/">Tim Berners-Lee</a>, o criador da nossa tão querida <abbr title="World Wide Web">WWW</abbr> é um dos maiores incentivadores de padrões abertos. Vantagens, você só precisa aprender uma vez, pois todos seguem o mesmo padrão o que torna a Web muito mais acessível. O usuário também ganha pois, por mais que não saiba, tem a liberdade de escolher o browser de sua preferência e visualizar a aplicação Web da mesma maneira em todos eles.
</p>
<p>
Falando um pouco sobre o server side, não tem como negar que o software livre é praticamente a base da Web atual. O servidor Web mais utilizado é o <a href="http://news.netcraft.com/archives/2010/03/17/march_2010_web_server_survey.html">Apache</a> e a linguagem de programação o <a href="http://www.langpop.com/">PHP</a>. Ambos são disponibilizados com licenças abertas, o que facilita a sua adoção. Também possuem uma ampla comunidade que está sempre disposta a ajudar e uma boa documentação que ajuda tanto iniciantes quanto desenvolvedores mais experientes. Com nosso <a href="http://www.cakephp.org">framework preferido</a> também não é diferente.
</p>
<p>
Tudo isso ajuda a fazer um desenvolvedor melhor. Ter a oportunidade de ver o código do que você utiliza para desenvolver suas soluções dá uma compreensão melhor de como as coisas funcionam, te ajuda a entender melhor a lógica por trás da mágica, te faz entrar em contato com outras metodologias de programação, etc. Participar de comunidades de software livre, lendo threads, postando perguntas e ajudando com respostas também tem um peso muito positivo, ajuda a entender necessidades de outros desenvolvedores, compreender códigos diferentes dos seus, solucionar problemas que não são seus, entrar em contato com outros profissionais com mais ou menos experiência, etc.<br />
Se você for um pouco mais hardcore pode até colaborar no desenvolvimento, e o convite sempre está aberto para quem deseja ajudar. Se você não é um programador fabuloso, ainda pode ajudar na documentação, tradução ou simplesmente sendo ativo na comunidade.
</p>
<p>
E o software proprietário? Não sou contra de maneira alguma, mas algo tão abrangente e revolucionário como a Web não pode ser baseado em licenças proprietárias.<br />
E você, o que acha sobre a importância do software livre e dos padrões abertos para o desenvolvimento Web?</p>


<p><strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span>'><span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span></a> <small>Acredito que Web vem tomando um caminho interessante com decisões...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/03/a-importancia-do-software-livre-e-padroes-abertos-na-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Migrando para o CakePHP 1.3</title>
		<link>http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/</link>
		<comments>http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:39:06 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=727</guid>
		<description><![CDATA[
A maioria já deve saber que o CakePHP está com a versão 1.3 do framework em estado beta. Me recordo que a versão 1.2 do framework já era bem agradável quando estava em fase beta, e portanto decidi testar o que o CakePHP 1.3 tinha de novo. Fiz o download e fui direto para a [...]


<strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2009-12-15 14:21:18" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" /><span rel="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/">Gerando HTML 4.01 com o HTML Helper do CakePHP</span>'><span property="dc:date" content="2009-12-15 14:21:18" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" /><span rel="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/">Gerando HTML 4.01 com o HTML Helper do CakePHP</span></a> <small> Apesar das melhorias introduzidas no HTMLHelper do CakePHP 1.2,...</small></li>
<li><a href='http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-04-26 17:11:42" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" /><span rel="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/">Lib para lidar com arquivos Zip no CakePHP</span>'><span property="dc:date" content="2010-04-26 17:11:42" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" /><span rel="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/">Lib para lidar com arquivos Zip no CakePHP</span></a> <small>Em um projeto recente, precisei extrair arquivos zip no server,...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F02%2Fmigrando-para-o-cakephp-1-3%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2010%2F02%2Fmigrando-para-o-cakephp-1-3%2F" /></a></div><p>
A maioria já deve saber que o <a href="http://bakery.cakephp.org/articles/view/cakephp-1-3-0-beta-has-landed">CakePHP está com a versão 1.3 do framework em estado beta</a>. Me recordo que a versão 1.2 do framework já era bem agradável quando estava em fase beta, e portanto decidi testar o que o CakePHP 1.3 tinha de novo. Fiz o <a href="http://github.com/cakephp/cakephp1x/downloads">download</a> e fui direto para a página que contém a descrição das <a href="http://cakephp.lighthouseapp.com/projects/42648/13">principais mudanças da versão 1.2 para a 1.3</a>. Quando vi que ela tinha um tamanho um pouco grande decidi testar logo alguma aplicação que eu tinha funcionando na versão 1.2.
</p>
<p>
Para minha surpresa ela não exibiu nem a página inicial, e ao invés disso várias mensagens de erro foram mostradas. Então vi que era realmente necessário ler a extensa página. Durante a leitura percebi que diversas mudanças importantes ocorreram, e logo vi o porque da minha aplicação sequer funcionar. Como a leitura é um pouco extensa, decidi resumir as principais mudanças aqui. As novidades vão ficar para depois, porque também são várias.
</p>
<h3>Principais mudanças do CakePHP 1.3</h3>
<ul>
<li>Adicionadas configurações específicas do <strong>config/core.php</strong> para quem utiliza o <strong>PHP 5.3</strong></li>
<li>O arquivo <strong>webroot/index.php</strong> foi alterado, e deve ser substituído em sua aplicação</li>
<li>Recomenda-se que todos os métodos e classes deprecados não sejam mais utilizados</li>
<li><strong>Admin routes</strong> foram removidas por uma configuração mais geral, chamada <strong>routes prefix</strong>. O route prefix admin pode ser definido com a linha

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Configure<span style="color: #339933;">::</span><span style="color: #004000;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Routing.prefixes'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</li>
<li>O método de remoção no modelo agora é único,

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Model<span style="color: #339933;">::</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

</li>
<li>O Model teve os métodos métodos <strong>findAll()</strong>, <strong>findCount()</strong> e <strong>findNeighbours()</strong> removidos</li>
<li>Os diretórios <strong>css</strong>, <strong>js</strong> e <strong>img</strong> foram removidos dos diretórios <strong>app/vendors</strong> e <strong>plugin/vendors</strong> e substituídos com os diretórios plugin e theme no webroot</li>
<li>Somente a variável

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

<p> poderá ser definida para o título da página, tanto no <strong>Controller</strong> quanto na <strong>View</strong></li>
<li>Deve-se selecionar o ponto da aplicação desejado para <strong>dump de sql</strong> quando o <strong>debug</strong> está definido para <strong>2</strong>, utilizando a linha de código

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">element</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sql_dump'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> em qualquer ponto da aplicação</li>
<li><strong>SessionHelper</strong> e <strong>SessionComponent</strong> não são mais carregados por padrão. Agora devem ser declarados como qualquer outro helper ou component. Para manter o comportamento antigo, adicione a declaração de helpers e components em seu AppController</li>
<li>A função

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">SessionComponent<span style="color: #339933;">::</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> teve seu segundo parâmetro alterado para usar um <strong>element</strong> e não um <strong>layout</strong>. Para alterar sua aplicação primeiro mova seus layouts para a pasta de elements e renomeie a variável</p>

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

<p> para</p>

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

</li>
<li>Não existe mais o nível 3 de debug</li>
<li><strong>PaginatorHelper</strong> agora produz a saída dos métodos

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">prev</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> first<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> last<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> englobada por</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;span&gt;</pre></div></div>

<p> e não</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;</pre></div></div>

<p> para tornar a estilização mais fácil</li>
<li>Os métodos

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">dateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> year<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> month<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> day<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> minute<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> meridian<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> select<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> do <strong>FormHelper</strong> não possuem mais o parâmetro</p>

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

<p>, e agora utilizam</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$attributes</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'empty'</span><span style="color: #009900;">&#93;</span></pre></div></div>

</li>
<li>
<pre lanh="php">FormHelper::submit()</pre>
<p> agora pode criar outros inputs além de <strong>type=submit</strong>. Para isso utilize a option <strong>type</strong></li>
<li>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">FormHelper<span style="color: #339933;">::</span><span style="color: #004000;">button</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> agora cria elementos <strong>button</strong> ao invés de <strong>inputs reset</strong>. Para criar inputs de reset, utilize</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">FormHelper<span style="color: #339933;">::</span><span style="color: #004000;">submit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> com o parâmetro <strong>option</strong> definindo <strong>&#8216;type&#8217; => &#8216;reset&#8217;</strong></li>
<li>O método

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">FormHelper<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> não cria mais elementos <strong>fieldset</strong> escondidos, agora <strong>substituídos por divs</strong> escondidas, o que ajuda na validação de HTML 4</li>
<li>No <strong>HtmlHelper</strong> os métodos

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">link</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> para<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> div<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> tag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> não pussuem mais o parâmetro</p>

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

<p>, que foi substituído por</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'escape'</span><span style="color: #009900;">&#93;</span></pre></div></div>

<p>. Similarmente os métodos</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">meta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> css<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> tiveram o parâmetro</p>

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

<p> substituído por</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'inline'</span><span style="color: #009900;">&#93;</span></pre></div></div>

</li>
<li>Agora as chamadas a

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">flash</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> não são mais auto-exibidas, sendo necessário adicionar</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span></pre></div></div>

<p> antes da chamada a função, como em qualquer método de helper</li>
<li><strong>JavascriptHelper</strong> e <strong>AjaxHelper</strong> estão deprecados, e agora deve-se utilizar o <strong>JsHelper</strong> em conjunto com o <strong>HtmlHelper</strong>.

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$javascript</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p> agora é
<pre lang="php>$html->script()</pre>
<p>, e
<pre lang="php>$javascript->codeBlock()</pre>
<p> é</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">scriptBlock</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

</li>
</ul>
<p>
Já deu para perceber que vai dar trabalho mudar algumas coisas. E essas são apenas as alterações que considerei mais importantes, na página de <a href="http://cakephp.lighthouseapp.com/projects/42648/13">migração do 1.2 para o 1.3</a> está a lista completa. Verifique nessa se alguma mudança afeta as suas aplicações.
</p>
<p>
Pelas alterações deu para perceber que o framework está mais preocupado com a padronização do seu comportamento, de código, utilização de Web Standards e desempenho, questões que são sempre importantes.<br />
Bom, é isso, espero ter ajudado. Na próxima vamos dar uma olhada nas novidades do Cake 1.3.</p>


<p><strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2009-12-15 14:21:18" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" /><span rel="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/">Gerando HTML 4.01 com o HTML Helper do CakePHP</span>'><span property="dc:date" content="2009-12-15 14:21:18" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" /><span rel="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/">Gerando HTML 4.01 com o HTML Helper do CakePHP</span></a> <small> Apesar das melhorias introduzidas no HTMLHelper do CakePHP 1.2,...</small></li>
<li><a href='http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-04-26 17:11:42" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" /><span rel="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/">Lib para lidar com arquivos Zip no CakePHP</span>'><span property="dc:date" content="2010-04-26 17:11:42" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" /><span rel="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" property="dc:title" resource="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/">Lib para lidar com arquivos Zip no CakePHP</span></a> <small>Em um projeto recente, precisei extrair arquivos zip no server,...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JavaScript: buscar a posição de um elemento em uma matriz</title>
		<link>http://kiss.souagil.com.br/2009/12/javascript-buscar-a-posicao-de-um-elemento-em-uma-matriz/</link>
		<comments>http://kiss.souagil.com.br/2009/12/javascript-buscar-a-posicao-de-um-elemento-em-uma-matriz/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 19:00:03 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2009/12/javascript-buscar-a-posicao-de-um-elemento-em-uma-matriz/">Gabriel Gilini</span></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=710</guid>
		<description><![CDATA[Recebi uma pergunta curiosa no Aardvark há pouco, perguntando se eu não conhecia algum código JavaScript que buscasse a posição exata de um elemento dentro de um array multidimensional &#8212; matriz &#8212; qualquer.
Não é novidade pra ninguém que eu me divirto escrevendo código nessa linguagem, então resolvi bolar alguma coisa pra resolver o problema do [...]]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F12%2Fjavascript-buscar-a-posicao-de-um-elemento-em-uma-matriz%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F12%2Fjavascript-buscar-a-posicao-de-um-elemento-em-uma-matriz%2F" /></a></div><p>Recebi uma <a href="http://vark.com/t/e2207a">pergunta</a> curiosa no <a href="http://vark.com">Aardvark</a> há pouco, perguntando se eu não conhecia algum código JavaScript que buscasse a posição exata de um elemento dentro de um array multidimensional &mdash; matriz &mdash; qualquer.</p>
<p>Não é novidade pra ninguém que eu me divirto escrevendo código nessa linguagem, então resolvi bolar alguma coisa pra resolver o problema do rapaz em necessidade. Aí vai o código (gist):</p>
<p><script src="http://gist.github.com/266289.js"></script></p>
<p>Exemplo de uso:</p>
<p><script src="http://gist.github.com/266291.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2009/12/javascript-buscar-a-posicao-de-um-elemento-em-uma-matriz/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gerando HTML 4.01 com o HTML Helper do CakePHP</title>
		<link>http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/</link>
		<comments>http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 17:21:18 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=700</guid>
		<description><![CDATA[
Apesar das melhorias introduzidas no HTMLHelper do CakePHP 1.2, sempre achei ridículo ele gerar marcação apenas em XHTML. Sempre preferi HTML, e me via engessado pelo CakePHP nesse aspecto.


Acredito que muitos passam por essa dificuldade quando estão trabalhando com o HTMLHelper e FormHelper do CakePHP. Uma das principais consequências disso, é que o código gerado [...]


<strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span>'><span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span></a> <small> A maioria já deve saber que o CakePHP está...</small></li>
<li><a href='http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span>'><span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span></a> <small>Acredito que Web vem tomando um caminho interessante com decisões...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F12%2Fgerando-html-4-01-com-o-html-helper-do-cakephp%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F12%2Fgerando-html-4-01-com-o-html-helper-do-cakephp%2F" /></a></div><p>
Apesar das melhorias introduzidas no <a href="http://book.cakephp.org/view/205/HTML">HTMLHelper</a> do CakePHP 1.2, sempre achei ridículo ele gerar marcação apenas em XHTML. Sempre preferi HTML, e me via engessado pelo CakePHP nesse aspecto.
</p>
<p>
Acredito que muitos passam por essa dificuldade quando estão trabalhando com o HTMLHelper e <a href="http://book.cakephp.org/view/182/Form">FormHelper</a> do CakePHP. Uma das principais consequências disso, é que o código gerado na maioria das vezes não é <a href="http://validator.w3.org/">válido</a>, pois mistura tags <a href="http://www.w3.org/TR/xhtml1/#diffs">HTML e XHTML</a>.
</p>
<p>
Mas sempre imaginei que deveria haver um meio de contornar isso. Certa vez verifiquei que existia um método chamado <a href="http://api.cakephp.org/class/html-helper#method-HtmlHelperdocType">docType</a> no HTMLHelper, e que era possível definir HTML 4.01 com ele. Mas minha alegria logo acabou quando percebi que ele não alterava o comportamento do Helper para gerar tags HTML.
</p>
<p>
Finalmente, hoje acabei me deparando com uma alternativa. Cansado de mensagens de código inválido fiz uma leitura mais cuidadosa do manual do CakePHP e encontrei a página que diz <a href="http://book.cakephp.org/view/862/Changing-the-tags-output-by-HtmlHelper">como gerar tags HTML 4.01</a>. A solução não é muito elegante, mas é uma alternativa presente no próprio framework.<br />
Espero que a solução sirva para vocês também!
</p>
<p><ins datetime="2009-12-15T18:39:04+00:00"><strong>Update 1</strong>:Para quem estiver com preguiça de fazer o arquivo do zero, fiz um <a href="http://github.com/fabricioferracioli/HTML-Tags-for-CakePHP-HTML-Helper">repositório no Github</a> com o arquivo e algumas tags. Conforme for sentindo necessidade vou aumentar o conteúdo dele. Quem quiser colaborar, está convidado!</ins></p>
<p>
<ins datetime="2009-12-18T20:06:00+00:00"><strong>Update 2</strong>: Apliquei as sugestões do Juan Basso, agora um Helper está disponível para manter as tags HTML 4.01. Vejam a discussão abaixo. O link do Github contínua o mesmo. Mantive o arquivo anterior para quem preferir o método da documentação do Cake.</ins></p>


<p><strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span>'><span property="dc:date" content="2010-02-22 13:39:06" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" /><span rel="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" property="dc:title" resource="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/">Migrando para o CakePHP 1.3</span></a> <small> A maioria já deve saber que o CakePHP está...</small></li>
<li><a href='http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span>'><span property="dc:date" content="2009-09-04 15:18:54" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" /><span rel="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/" property="dc:title" resource="http://kiss.souagil.com.br/2009/09/aumentando-a-semantica-com-rdfa/">Aumentando a semântica com RDFa</span></a> <small>Acredito que Web vem tomando um caminho interessante com decisões...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Criando thumbnails no shell do Linux de maneira simples</title>
		<link>http://kiss.souagil.com.br/2009/11/criando-thumbnails-no-shell-do-linux-de-maneira-simples/</link>
		<comments>http://kiss.souagil.com.br/2009/11/criando-thumbnails-no-shell-do-linux-de-maneira-simples/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 22:59:08 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2009/11/criando-thumbnails-no-shell-do-linux-de-maneira-simples/">Gabriel Gilini</span></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=680</guid>
		<description><![CDATA[Hello, peeps.
Hoje precisei converter um bocado de imagens para um tamanho reduzido, e como um bom linuxer, fui procurar como fazer isso no shell.
Uma pesquisadinha rápida no Google, e trombei com esse &#8220;how to&#8221;. Simples e direto, resolveu minha dúvida. Chequei se o ImageMagick já estava instalado, e estava. Mas esse script que o cara [...]]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F11%2Fcriando-thumbnails-no-shell-do-linux-de-maneira-simples%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F11%2Fcriando-thumbnails-no-shell-do-linux-de-maneira-simples%2F" /></a></div><p>Hello, peeps.</p>
<p>Hoje precisei converter um bocado de imagens para um tamanho reduzido, e como um bom linuxer, fui procurar como fazer isso no shell.</p>
<p>Uma pesquisadinha rápida no Google, e trombei com <a href="http://www.cyberciti.biz/tips/howto-linux-creating-a-image-thumbnails-from-shell-prompt.html" title="Howto: Linux Creating a Image Thumbnails from shell prompt">esse &#8220;how to&#8221;</a>. Simples e direto, resolveu minha dúvida. Chequei se o <a href="http://www.imagemagick.org/script/index.php" title="ImageMagick website">ImageMagick</a> já estava instalado, e estava. Mas esse script que o cara colocou no tutorial tá meio pobre, não dá pra passar nada por parâmetro. Cada vez que eu precisar disso vou ter que abrir o script e modificar? Ah, não.</p>
<p>Dez minutinhos de <abbr title="improved vi">vim</abbr> aberto depois, surge o <strong>thumbalizr</strong>:</p>
<p><img src="http://kiss.souagil.com.br/wp-content/uploads/2009/11/thumbalizr.png" alt="exemplo de uso do thumbalizr" title="exemplo de uso do thumbalizr" class="size-full wp-image-681" /></p>
<p>Você tem que passar width OU height (eu sei, tá errada a marcação dos parâmetros no exemplo de uso, se alguém souber o certo me fala), e pode passar uma string pra ser inserida antes do nome original da imagem. Caso contrário, as imagens serão substituídas.</p>
<p>UPDATE:<br />
Agora o script aceita a flag &#8220;-a string_pra_concatenar&#8221; que concatena uma string no final do nome do thumbnail. E também fiz algumas mudanças pra compatibilidade.</p>
<p>Para &#8220;thumbalizar&#8221; imagens em vários diretórios, faça algo como:</p>
<p><script src="http://gist.github.com/243142.js?file=gistfile1.sh"></script></p>
<p>Aí vai o código do script:<br />
<script src="http://gist.github.com/243081.js?file=thumbalizr"></script></p>
<p>Ou você pode baixar o script <a href="http://souagil.com.br/gabriel/thumbalizr" title="Download do thumbalizr">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2009/11/criando-thumbnails-no-shell-do-linux-de-maneira-simples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programador, nem sempre é você que está errado!</title>
		<link>http://kiss.souagil.com.br/2009/11/programador-nem-sempre-e-voce-que-esta-errado/</link>
		<comments>http://kiss.souagil.com.br/2009/11/programador-nem-sempre-e-voce-que-esta-errado/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 17:51:11 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2009/11/programador-nem-sempre-e-voce-que-esta-errado/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=662</guid>
		<description><![CDATA[Pois é amigos, quando estamos falando de programação nem sempre você é o cara errado da história.
Digo isso pois acabo de passar por uma situação em que estava certo, mas por não acreditar muito nisso acabei perdendo algum tempo procurando erros inexistentes.
Estava testando uma aplicação e apenas um caso de teste falhava.
Ao verificar o código [...]]]></description>
			<content:encoded><![CDATA[<div class="bzbutton" style="float:left;margin-right:10px;float:left;margin-right:10px;float: right; margin-left: 10px;"><a href="http://buzzvolume.com/compartilhar?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F11%2Fprogramador-nem-sempre-e-voce-que-esta-errado%2F"><img src="http://buzzvolume.com/button.png?url=http%3A%2F%2Fkiss.souagil.com.br%2F2009%2F11%2Fprogramador-nem-sempre-e-voce-que-esta-errado%2F" /></a></div><p>Pois é amigos, quando estamos falando de programação nem sempre você é o cara errado da história.</p>
<p>Digo isso pois acabo de passar por uma situação em que estava certo, mas por não acreditar muito nisso acabei perdendo algum tempo procurando erros inexistentes.</p>
<p>Estava testando uma aplicação e apenas um caso de teste falhava.<br />
Ao verificar o código aparentemente não havia nada errado, e poucos dias atrás o mesmo trecho não apresentava problemas. O que estaria acontecendo?</p>
<p><img src="http://kiss.souagil.com.br/wp-content/uploads/2009/11/test_fail.png" alt="Teste com 1 falha" title="Teste com 1 falha" width="667" height="245" class="size-full wp-image-664" /></p>
<p>
Fiquei um bom tempo tentando encontrar algum erro bobo de lógica em um código que eu havia acabado de inserir, mas não encontrava nada. Além disso, o trecho de código que falhava nos testes não tinha relação nenhuma com as alterações que havia feito.</p>
<p>Então pensei que poderia ser uma alteração do <a href="http://www.cakephp.org">CakePHP 1.2.5</a> que não havia passado para o meu código. Também procurei por isso em vão. Então percebi que o problema estava com uma função que utiliza <a href="http://en.wikipedia.org/wiki/Database_transaction">transações</a>, o que já foi uma fonte de problemas nesse projeto, ou seja, um problema recorrente.</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;">$init_transaction</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$db</span> <span style="color: #339933;">=&amp;</span> ConnectionManager<span style="color: #339933;">::</span><span style="color: #004000;">getDataSource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">useDbConfig</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$balloonContents</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'BalloonContent'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$index</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$content</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$content</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'balloon_id'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$balloon_id</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$save</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$status</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$status</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$save</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$init_transaction</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$status</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$status</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">commit</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</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>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rollback</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>É um código simples, e não existe nenhum problema com ele. Como eu acabei de instalar o <a href="http://en.opensuse.org">openSuse 11.2</a>, que agora está com o <a href="http://en.opensuse.org/MySQL-5.1">MySQL 5.1 nativo</a>, me lembrei que ele poderia não estar configurado corretamente para usar a storage engine <a href="http://dev.mysql.com/doc/refman/5.1/en/innodb.html">InnoDB</a>. E era exatamente isso! Como o <a href="http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html">MyISAM</a> fica habilitado por padrão, e essa storage engine <a href="http://book.cakephp.org/view/75/Saving-Your-Data">não tem suporte total a transações</a>, se você deseja utilizar esse recurso deve dizer ao banco de dados.<br />
Ou seja, meu ambiente estava configurado de modo inconsistente com as necessidades da aplicação. Alterei o arquivo de configuração do MySQL, o <a href="http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_default-storage-engine">my.cnf</a>, adicionando a seguinte opção:</P></p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">default-storage-engine=InnoDB</pre></div></div>

<p>Depois disso o teste passou e tudo voltou ao normal.</p>
<p><img src="http://kiss.souagil.com.br/wp-content/uploads/2009/11/test_passed.png" alt="Testes passando após trocar a storage engine" title="Todos os testes passando" width="665" height="107" class="size-full wp-image-671" /></p>
<p>
Portanto rapaziada, em alguns casos não adianta procurar pelos seus erros. Procure se lembrar que qualquer tarefa necessita de subsídios, e no caso de nós programadores, um ambiente bem configurado faz toda diferença.</p>
<p>Alguém já passou por situação semelhante?</p>
]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2009/11/programador-nem-sempre-e-voce-que-esta-errado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
