<?xml version="1.0" encoding="UTF-8"?>
<rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>KISS - Keep it simple, stupid!</title>
	
	<link>http://kiss.souagil.com.br</link>
	<description>Blog sobre desenvolvimento de aplicações WEB e metodologia ágil. Principal foco é o framework CakePHP</description>
	<lastBuildDate>Tue, 07 Jun 2011 14:51:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kiss-keepitsimple" /><feedburner:info uri="kiss-keepitsimple" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Inserindo índices automaticamente nos relacionamentos</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/j4dhsavnkTg/</link>
		<comments>http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 14:27:01 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/">Lucas Gameiro</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Índices]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[cakephp shell]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=839</guid>
		<description><![CDATA[Durante o desenvolvimento de uma aplicação legada, percebi que muitos gastos do banco de dados era devido a falta de índices nas tabelas do banco de dados.
Para não criar todos os índices na mão resolvi desenvolver um shell para o cakephp que os insira sempre que um relacionamento for detectado.
O script pode ser encontrado aqui [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o desenvolvimento de uma aplicação legada, percebi que muitos gastos do banco de dados era devido a falta de índices nas tabelas do banco de dados.</p>
<p>Para não criar todos os índices na mão resolvi desenvolver um shell para o cakephp que os insira sempre que um relacionamento for detectado.</p>
<p>O script pode ser encontrado <a href="https://github.com/lucasgameiro/Insert-Index-Shell">aqui</a> no meu <a href="https://github.com/lucasgameiro">github</a>.</p>
<p>Segue o código para quem não trabalha com git:</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>
App<span style="color: #339933;">::</span><span style="color: #004000;">import</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Model'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">class</span> InsertIndexShell <span style="color: #000000; font-weight: bold;">extends</span> Shell <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$models</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getModels</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">insertIndexes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$models</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> getModels<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> App<span style="color: #339933;">::</span><span style="color: #004000;">objects</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'model'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> insertIndexes<span style="color: #009900;">&#40;</span><span style="color: #000088;">$models</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$models</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$model</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            App<span style="color: #339933;">::</span><span style="color: #004000;">import</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Model'</span><span style="color: #339933;">,</span><span style="color: #000088;">$model</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: #009900;">&#123;</span><span style="color: #000088;">$model</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$model</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #000088;">$model</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">recursive</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fieldsToIndex</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #000088;">$model</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> fieldsToIndex<span style="color: #009900;">&#40;</span><span style="color: #000088;">$modelObj</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$modelObj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">belongsTo</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$relacionamento</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$field</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$modelObj</span><span style="color: #339933;">-&gt;</span>_schema<span style="color: #009900;">&#91;</span><span style="color: #000088;">$relacionamento</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'foreignKey'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</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: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'key'</span><span style="color: #339933;">,</span><span style="color: #000088;">$field</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;">$modelObj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ALTER TABLE `<span style="color: #006699; font-weight: bold;">{$modelObj-&gt;tablePrefix}</span><span style="color: #006699; font-weight: bold;">{$modelObj-&gt;table}</span>` ADD INDEX (`<span style="color: #006699; font-weight: bold;">{$relacionamento['foreignKey']}</span>`)&quot;</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;">out</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Indice <span style="color: #006699; font-weight: bold;">{$relacionamento['foreignKey']}</span> adicionado em <span style="color: #006699; font-weight: bold;">{$modelObj-&gt;table}</span>&quot;</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;">out</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;impossivel adicionar indice <span style="color: #006699; font-weight: bold;">{$relacionamento['foreignKey']}</span> em <span style="color: #006699; font-weight: bold;">{$modelObj-&gt;table}</span>&quot;</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: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Obs1.: Está específico para o MySQL.<br />
Obs2.: Na próxima versão verificarei as colunas que estão sendo utilizadas nos conditions.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=j4dhsavnkTg:Ln5KlDVPmfE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=j4dhsavnkTg:Ln5KlDVPmfE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=j4dhsavnkTg:Ln5KlDVPmfE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=j4dhsavnkTg:Ln5KlDVPmfE:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/</feedburner:origLink></item>
		<item>
		<title>Logando queries no Shell do CakePHP</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/hMepyJZBG3o/</link>
		<comments>http://kiss.souagil.com.br/2011/06/logando-queries-no-shell-do-cakephp/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 17:59:53 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2011/06/logando-queries-no-shell-do-cakephp/">Gabriel Gilini</span></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cakephp shell]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=836</guid>
		<description><![CDATA[Se você é como eu, adora criar shells em projetos CakePHP. São fáceis, herdam pouca estrutura e te dão acesso a quase tudo que precisa para tarefas de manutenção.
Apesar de todos os pontos positivos, passei por um problema sério recentemente: a incapacidade de se extender sua classe super. Todo shell deve herdar a classe Shell, que [...]


<strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2011-06-07 11:27:01" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" /><span rel="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" property="dc:title" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/">Inserindo índices automaticamente nos relacionamentos</span>'><span property="dc:date" content="2011-06-07 11:27:01" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" /><span rel="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" property="dc:title" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/">Inserindo índices automaticamente nos relacionamentos</span></a> <small>Durante o desenvolvimento de uma aplicação legada, percebi que muitos...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Se você é como eu, adora criar shells em projetos CakePHP. São fáceis, herdam pouca estrutura e te dão acesso a quase tudo que precisa para tarefas de manutenção.</p>
<p>Apesar de todos os pontos positivos, passei por um problema sério recentemente: a incapacidade de se extender sua classe super. Todo shell deve herdar a classe <code>Shell</code>, que é declarada no core do CakePHP (cake/console/libs/shell.php). Este pequeno fato torna inviável qualquer mudança na classe Shell, já que alterar código terceiro em um projeto não é algo que eu considero inteligente.</p>
<p>A solução foi criar uma classe intermediária, assim como temos o AppController e o AppModel, podemos ter o AppShell.</p>
<p>Crie um arquivo app.php no caminho <code>app/vendors/shells/app.php</code> e crie sua classe AppShell:</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> AppShell <span style="color: #000000; font-weight: bold;">extends</span> Shell
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ok, temos uma classe intermediária que podemos extender à vontade, é só fazer com que nossos shells extendam AppShell, com um pequeno porém: o Cake não vai incluir por padrão o arquivo de sua base class. E agora?</p>
<p>Simples! Vamos incluir o arquivo usando o método canivete suíço App::import.</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>
App<span style="color: #339933;">::</span><span style="color: #004000;">import</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Shell'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'App'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">class</span> SomeApplicationSpecificShell <span style="color: #000000; font-weight: bold;">extends</span> AppShell
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Call some parent methods</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E é só isso!</p>
<p>Mas o que você vai colocar na sua super classe? Eu tenho uma sugestão.</p>
<p>Sinto muita falta do element sql_dump, que apresenta um log de todas as transações ocorridas nos datasources durante o load da página. Abri o código do element e portei para nossa classe de shell:</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> AppShell <span style="color: #000000; font-weight: bold;">extends</span> Shell
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getDatabaseLogs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ConnectionManager'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'debug'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">2</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;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$sources</span> <span style="color: #339933;">=</span> ConnectionManager<span style="color: #339933;">::</span><span style="color: #004000;">sourceList</span><span style="color: #009900;">&#40;</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: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$logs</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$logs</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: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sources</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$source</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;">$source</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;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isInterfaceSupported</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'getLog'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000088;">$logs</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$source</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLog</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>
&nbsp;
        <span style="color: #000088;">$out</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: #000088;">$out</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Nr<span style="color: #000099; font-weight: bold;">\t</span>Query<span style="color: #000099; font-weight: bold;">\t</span>Error<span style="color: #000099; font-weight: bold;">\t</span>Affected<span style="color: #000099; font-weight: bold;">\t</span>Num. rows<span style="color: #000099; font-weight: bold;">\t</span>Took (ms)&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$logs</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$source</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$logInfo</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$text</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$logInfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'count'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span> ? <span style="color: #0000ff;">'queries'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'query'</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000088;">$tmp</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: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$logInfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$k</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$tmp</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$k</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #339933;">.</span> h<span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">{$i['error']}</span><span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">{$i['affected']}</span><span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">{$i['numRows']}</span><span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">{$i['took']}</span>&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #000088;">$out</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'(%s) %s %s took %s ms'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$source</span><span style="color: #339933;">,</span> <span style="color: #000088;">$logInfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'count'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #000088;">$logInfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'time'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                <span style="color: #000088;">$tmp</span>
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$out</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como vocês podem ver, simplesmente peguei o conteúdo do element sql_dump, removi a marcação, inseri tabulações para facilitar a visualização, joguei tudo num array e simplesmente retornei. Fica a cargo do desenvolvedor do projeto tratar e exibir a saída.</p>
<p>E você, que método é imprescindível em seus scripts shell?</p>


<p><strong>Posts relacionados:</strong><ol><li><a href='http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2011-06-07 11:27:01" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" /><span rel="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" property="dc:title" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/">Inserindo índices automaticamente nos relacionamentos</span>'><span property="dc:date" content="2011-06-07 11:27:01" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" /><span rel="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/" property="dc:title" resource="http://kiss.souagil.com.br/2011/06/inserindo-indices-automaticamento-nos-relacionamentos/">Inserindo índices automaticamente nos relacionamentos</span></a> <small>Durante o desenvolvimento de uma aplicação legada, percebi que muitos...</small></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=hMepyJZBG3o:9NsOR8tnjn4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=hMepyJZBG3o:9NsOR8tnjn4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=hMepyJZBG3o:9NsOR8tnjn4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=hMepyJZBG3o:9NsOR8tnjn4:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2011/06/logando-queries-no-shell-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2011/06/logando-queries-no-shell-do-cakephp/</feedburner:origLink></item>
		<item>
		<title>CakePHP Component para o Google URL Shortener</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/bGYPiF6QD7k/</link>
		<comments>http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 01:57:06 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[goo.gl]]></category>
		<category><![CDATA[google url shortener]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=829</guid>
		<description><![CDATA[Fala Galera!
Hoje comecei um Component para o CakePHP que utiliza as funções básicas do Google URL Shortener, ou goo.gl.
Essas duas funções já estão prontas, e futuramente pretendo adicionar a função de estatísticas de cliques, também disponível na API.
O projeto se encontra nesse repositório do GitHub. Espero que seja útil para vocês, e caso alguém tenha [...]]]></description>
			<content:encoded><![CDATA[<p>Fala Galera!</p>
<p>Hoje comecei um Component para o CakePHP que utiliza as funções básicas do <a href="http://code.google.com/intl/pt-BR/apis/urlshortener/">Google URL Shortener</a>, ou <a href="http://goo.gl">goo.gl</a>.<br />
Essas duas funções já estão prontas, e futuramente pretendo adicionar a função de estatísticas de cliques, também disponível na API.</p>
<p>O projeto se encontra <a href="https://github.com/fabricioferracioli/CakePHP-Google-URL-Shortener-Component">nesse repositório</a> do GitHub. Espero que seja útil para vocês, e caso alguém tenha alguma opinião ou dúvida, utilize os comentários.</p>
<p>Update: um exemplo de utilização sempre cai bem, não é?</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> ExamplesController <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;">'Examples'</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//sua chave gerada pelo google pode ser fornecida aqui</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$components</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'GoogleUrlShortener'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'apiKey'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'sua-chave-da-api-aqui'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> action<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//essa é outra maneira de fornecer sua chave da api</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GoogleUrlShortener</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">apiKey</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'sua-chave-da-api'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GoogleUrlShortener</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">generateShortUrl</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;">&#91;</span><span style="color: #0000ff;">'longUrl'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$original</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GoogleUrlShortener</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOriginalUrl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</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: #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>Agora sim, fica simples de usar!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=bGYPiF6QD7k:Zl9JDfprVl4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=bGYPiF6QD7k:Zl9JDfprVl4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=bGYPiF6QD7k:Zl9JDfprVl4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=bGYPiF6QD7k:Zl9JDfprVl4:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/</feedburner:origLink></item>
		<item>
		<title>Oficina de personalização de Wordpress</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/JZh7ImA0gs0/</link>
		<comments>http://kiss.souagil.com.br/2010/11/oficina-de-personalizacao-de-wordpress/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 10:35:40 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://kiss.souagil.com.br/2010/11/oficina-de-personalizacao-de-wordpress/">Fabrício Ferracioli</span></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[artes visuais]]></category>
		<category><![CDATA[unopar]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://kiss.souagil.com.br/?p=819</guid>
		<description><![CDATA[Fala galera, tudo certo?
Esse blog anda um pouco inativo mas ainda funciona! 
Talvez seja porque os autores estão muito ocupados em suas atividades atuais, mas não esquecemos de vocês.
Esse post vai ser bem rápido, e direcionado para um pessoal que normalmente não entraria nesse blog. Nos dias 8 e 9 desse mês, eu e o [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera, tudo certo?</p>
<p>Esse blog anda um pouco inativo mas ainda funciona! </p>
<p>Talvez seja porque os autores estão muito ocupados em suas atividades atuais, mas não esquecemos de vocês.</p>
<p>Esse post vai ser bem rápido, e direcionado para um pessoal que normalmente não entraria nesse blog. Nos dias 8 e 9 desse mês, eu e o <a href="http://twitter.com/rennan_martini">Rennan Martini</a> ministramos uma oficina de personalização para Wordpress a pedido do professor <a href="http://twitter.com/dhidhi">Dhiego Bicudo</a> para a turma do último período de Artes Visuais da Unopar. Durante a apresentação prometi para eles disponibilizar o arquivo que utilizei, então <a href='http://kiss.souagil.com.br/wp-content/uploads/2010/11/wordpress.ppt'>aqui está ele</a>.</p>
<p>Agradeço a oportunidade dada pelo Dhiego e a atenção de todos. Como tenho certeza que vocês estão cheio de dúvidas, utilizem os comentários que tento ajudar.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=JZh7ImA0gs0:MOITk8fkgGY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=JZh7ImA0gs0:MOITk8fkgGY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=JZh7ImA0gs0:MOITk8fkgGY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=JZh7ImA0gs0:MOITk8fkgGY:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/11/oficina-de-personalizacao-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/11/oficina-de-personalizacao-de-wordpress/</feedburner:origLink></item>
		<item>
		<title>Lib para lidar com arquivos Zip no CakePHP</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/RLXZ6wMfMgk/</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/2011/04/cakephp-component-para-o-google-url-shortener/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2011-04-19 22:57:06" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" /><span rel="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" property="dc:title" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/">CakePHP Component para o Google URL Shortener</span>'><span property="dc:date" content="2011-04-19 22:57:06" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" /><span rel="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" property="dc:title" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/">CakePHP Component para o Google URL Shortener</span></a> <small>Fala Galera! Hoje comecei um Component para o CakePHP que...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<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/2011/04/cakephp-component-para-o-google-url-shortener/' rel='bookmark' title='Permanent Link: <span property="dc:date" content="2011-04-19 22:57:06" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" /><span rel="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" property="dc:title" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/">CakePHP Component para o Google URL Shortener</span>'><span property="dc:date" content="2011-04-19 22:57:06" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" /><span rel="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/" property="dc:title" resource="http://kiss.souagil.com.br/2011/04/cakephp-component-para-o-google-url-shortener/">CakePHP Component para o Google URL Shortener</span></a> <small>Fala Galera! Hoje comecei um Component para o CakePHP que...</small></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=RLXZ6wMfMgk:uExb92B-kMA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=RLXZ6wMfMgk:uExb92B-kMA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=RLXZ6wMfMgk:uExb92B-kMA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=RLXZ6wMfMgk:uExb92B-kMA:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/</feedburner:origLink></item>
		<item>
		<title>Validação de campos de texto com caracteres acentuados</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/ttWjdy-E1Aw/</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 [...]]]></description>
			<content:encoded><![CDATA[<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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=ttWjdy-E1Aw:bGLClJtU0TA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=ttWjdy-E1Aw:bGLClJtU0TA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=ttWjdy-E1Aw:bGLClJtU0TA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=ttWjdy-E1Aw:bGLClJtU0TA:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/04/validacao-de-campos-de-texto-com-caracteres-acentuados/</feedburner:origLink></item>
		<item>
		<title>Galeria de imagens similar à da Apple Store</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/YZR2QtqSlBM/</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[<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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=YZR2QtqSlBM:7PLE7YQrytA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=YZR2QtqSlBM:7PLE7YQrytA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=YZR2QtqSlBM:7PLE7YQrytA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=YZR2QtqSlBM:7PLE7YQrytA:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/</feedburner:origLink></item>
		<item>
		<title>Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/2qCnOHz_-Kc/</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[<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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=2qCnOHz_-Kc:zP6B-zvo7i8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=2qCnOHz_-Kc:zP6B-zvo7i8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=2qCnOHz_-Kc:zP6B-zvo7i8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=2qCnOHz_-Kc:zP6B-zvo7i8:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>8</slash:comments>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/</feedburner:origLink></item>
		<item>
		<title>A importância do software livre e padrões abertos na Web</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/oppUEVOZ6Ig/</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 [...]]]></description>
			<content:encoded><![CDATA[<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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=oppUEVOZ6Ig:NW_a7hlwA48:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=oppUEVOZ6Ig:NW_a7hlwA48:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=oppUEVOZ6Ig:NW_a7hlwA48:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=oppUEVOZ6Ig:NW_a7hlwA48:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/03/a-importancia-do-software-livre-e-padroes-abertos-na-web/</feedburner:origLink></item>
		<item>
		<title>Migrando para o CakePHP 1.3</title>
		<link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/SVy23ixRFpg/</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 [...]]]></description>
			<content:encoded><![CDATA[<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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=SVy23ixRFpg:r9iaZPfQe-0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=SVy23ixRFpg:r9iaZPfQe-0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a=SVy23ixRFpg:r9iaZPfQe-0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/kiss-keepitsimple?i=SVy23ixRFpg:r9iaZPfQe-0:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/</feedburner:origLink></item>
	</channel>
</rss>

