<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:base="http://planetcakephp.org">
<channel>
 <title>Planet CakePHP - Português</title>
 <link>http://planetcakephp.org/taxonomy/term/6/0</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/planet-cakephp-aggregator-portuguese" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="planet-cakephp-aggregator-portuguese" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-portuguese" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-portuguese" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-portuguese" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/planet-cakephp-aggregator-portuguese" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-portuguese" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-portuguese" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fplanet-cakephp-aggregator-portuguese" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
 <title>Test-Driven Development with CakePHP 1.3 TDD</title>
 <link>http://cobaia.net/2010/09/test-driven-development-with-cakephp-1-3-tdd/</link>
 <description>&lt;p&gt;Today I found a good article about TDD, Test Driven Development using &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt; 1.3. Nowadays with the constantly changes of scope in one web project the TDD is something that all programmer must know and practice, and some frameworks like the CakePHP give the support for that.&lt;br /&gt;
In a recently article for the php architect magazine, &lt;a href="http://www.phparch.com/author/canderson/"&gt;Carl Anderson&lt;/a&gt; describe a great article how to use the TDD inside the CakePHP 1.3.&lt;br /&gt;
You can &lt;a href="http://www.phparch.com/files/2010/08/PHPA-AUG-10-cakephp.pdf"&gt;download&lt;/a&gt; that tutorial by free &lt;a href="http://www.phparch.com/files/2010/08/PHPA-AUG-10-cakephp.pdf"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/pwAFqbpAOO0" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Wed, 01 Sep 2010 20:25:12 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5560 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Plugin PagSeguro para CakePHP</title>
 <link>http://blog.ftgoncalves.com/2010/08/plugin-pagseguro-para-cakephp-2/</link>
 <description>&lt;p&gt;Veja também em:&lt;br /&gt;
&lt;a href="http://www.itweb.com.br/blogs/blog.asp?cod=162" title="http://www.itweb.com.br/blogs/blog.asp?cod=162"&gt;http://www.itweb.com.br/blogs/blog.asp?cod=162&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Plugin PagSeguro&lt;/strong&gt;&lt;br /&gt;
Sem dúvida, uma das grandes dificuldades quando o assunto é pagamento on-line é a integração com as operadoras de cartões e bancos. Uma das ferramentas disponíveis para quem utiliza esses serviços e que traz vantagens tanto para o desenvolvedor quanto para o cliente ao qual se afilia às operadoras de pagamentos são os Gatways de pagamento. Esses serviços geralmente trabalham com várias bandeiras e bancos, disponibilizando um grande diferencial para pagamento em e-commerces e sistemas que utilizam paramento on-line.&lt;br /&gt;
Um Gatway de pagamento muito interessante é o PagSeguro, pertencente ao grupo UOL. Esse serviço se integra a diversos bancos e bandeiras, tornando-se muito simples para o desenvolvedor. Pensando nisso, criei um plugin para o CakePHP que, além de integrar-se, também faz o tratamento dos dados para envio ao PagSeguro.&lt;br /&gt;
&lt;strong&gt;Instalação&lt;/strong&gt;&lt;br /&gt;
A primeira parte é o download da última versão do plugin que está disponível no Github &lt;a href="http://github.com/ftgoncalves/pagseguro" title="http://github.com/ftgoncalves/pagseguro"&gt;http://github.com/ftgoncalves/pagseguro&lt;/a&gt;. Após realizar o download e colocar o plugin na pasta plugins do CakePHP, basta começar a utilizá-lo.&lt;br /&gt;
&lt;strong&gt; Utilização&lt;/strong&gt;&lt;br /&gt;
Esse plugin disponibiliza um component e um helper, sendo o componente responsável por transformar e organizar as informações conforme especificações do PagSeguro e o helper por criar o formulário conforme as informações geradas pelo component.&lt;br /&gt;
&lt;strong&gt;Component&lt;/strong&gt;&lt;br /&gt;
Para utilizar o component, basta declará-lo no controller onde será utilizado:&lt;/p&gt;
&lt;p&gt;var $components = array('PagSeguro.PagSeguro');&lt;/p&gt;
&lt;p&gt;Isso disponibilizará o component a ser utilizado no controller com 3 métodos. O init, que é obrigatório, tem o objetivo de especificar as informações de configuração da compra. Segue um exemplo com as informações defaults:&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;PagSeguro-&amp;gt;init(array(&lt;br /&gt;
'pagseguro' =&amp;gt; array(&lt;br /&gt;
'e-mail' =&amp;gt; 'teste@teste.com',&lt;br /&gt;
'reference' =&amp;gt; null,&lt;br /&gt;
'freight_type' =&amp;gt; 'EN',&lt;br /&gt;
'theme' =&amp;gt; 1,&lt;br /&gt;
'currency' =&amp;gt; 'BRL'&lt;br /&gt;
),&lt;br /&gt;
'definitions' =&amp;gt; array(&lt;br /&gt;
'currency_type' =&amp;gt; 'dolar',&lt;br /&gt;
'weight_type' =&amp;gt; 'kg',&lt;br /&gt;
'encode' =&amp;gt; 'utf-8'&lt;br /&gt;
),&lt;br /&gt;
'customer' =&amp;gt; array(&lt;br /&gt;
'cliente_nome' =&amp;gt; null,&lt;br /&gt;
'cliente_cep' =&amp;gt; null,&lt;br /&gt;
'cliente_end' =&amp;gt; null,&lt;br /&gt;
'cliente_num' =&amp;gt; null,&lt;br /&gt;
'cliente_compl' =&amp;gt; null,&lt;br /&gt;
'cliente_bairro' =&amp;gt; null,&lt;br /&gt;
'cliente_cidade' =&amp;gt; null,&lt;br /&gt;
'cliente_uf' =&amp;gt; null,&lt;br /&gt;
'cliente_pais' =&amp;gt; null,&lt;br /&gt;
'cliente_ddd ' =&amp;gt; null,&lt;br /&gt;
'cliente_tel' =&amp;gt; null,&lt;br /&gt;
'cliente_email' =&amp;gt; null&lt;br /&gt;
),&lt;br /&gt;
'format' =&amp;gt; array(&lt;br /&gt;
'item_id' =&amp;gt; 'item_id',&lt;br /&gt;
'item_descr' =&amp;gt; 'item_descr',&lt;br /&gt;
'item_quant' =&amp;gt; 'item_quant',&lt;br /&gt;
'item_valor' =&amp;gt; 'item_valor',&lt;br /&gt;
'item_frete' =&amp;gt; 'item_frete',&lt;br /&gt;
'item_peso' =&amp;gt; 'item_peso'&lt;br /&gt;
)));&lt;/p&gt;
&lt;p&gt;As informações fornecidas são divididas em 4 partes: pagseguro, definitions, customer e format.&lt;br /&gt;
&lt;strong&gt; Array Pagseguro&lt;/strong&gt;&lt;br /&gt;
Especifica as informações de configuração para o pagseguro, sendo obrigatório o e-mail de cobrança. Caso esse não seja especificado, será gerado um fatal error. O índice reference especifica um código único da compra, geralmente o id da venda. O índice freight_type especifica o tipo de frete utilizado, sendo suportados EN (PAC) e SD (Sedex). Caso você não utilize o sistema de frete ou o mesmo seja gratuito, o recomendado é setar em freight_type com EN e o valor do frete de cada produto para zero reais. O índice theme especifica o tipo de botão utilizado no formulário de envio (estão disponíveis 5 tipos). O índice currency especifica o tipo de câmbio, sendo suportado somente pelo PagSeguro, o BRL. E por último o índice extras, este indica um valor que deve ser acrescentado ou decrementado do valor total da venda.&lt;br /&gt;
&lt;strong&gt;Array Definitions&lt;/strong&gt;&lt;br /&gt;
É utilizado pelo core do plugin para tratar as informações dos produtos. O índice currency_type especifica como o valor do(s) produto(s) e o valor do(s) frete(s) estão chegando para o plugin. Exemplo:&lt;br /&gt;
Caso as informações guardadas no banco de dados estejam com separador de decimal (ponto), no formato americano, então o valor especificado deve ser dolar. Caso esteja com separador de decimal (vírgula), no formato brasileiro, então o valor especificado deve ser real. O índice weight_type especifica a unidade de medida peso. Os dois únicos valores suportados são kg (quilograma) ou g (grama). Este já identifica se o valor fornecido é com separador decimal em vírgula ou ponto. O índice encode especifica o tipo de codificação das strings.&lt;br /&gt;
&lt;strong&gt;Array Custome&lt;/strong&gt;&lt;br /&gt;
Especifica os dados do cliente, cliente_nome, cliente_cep, cliente_end, cliente_num, cliente_compl, cliente_bairro, cliente_cidade, cliente_uf, cliente_pais, cliente_ddd, cliente_tel e cliente_email. Os índices são obrigatórios e a passagem dos valores opcionais pois caso você não passe o pagseguro fara um pré solicitação das informações do cliente.&lt;br /&gt;
&lt;strong&gt;Array Format&lt;/strong&gt;&lt;br /&gt;
Este array definirá os significados dos índices e a conversão automática:&lt;br /&gt;
Funciona da seguinte forma. Suponha que você tenha o modelo ItemVenda e o mesmo tem os campos id, produto, valor e quantidade. Para especificar o que o plugin deve considerar basta setar:&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
array('format' =&amp;gt; array(&lt;br /&gt;
'item_id' =&amp;gt; 'id',&lt;br /&gt;
'item_descr' =&amp;gt; 'produto',&lt;br /&gt;
'item_valor' =&amp;gt; 'valor'));&lt;/p&gt;
&lt;p&gt;E assim para todas informações, item_id, item_descr, item_quant, item_valor, item_frete, item_peso. Caso seja acrescentado no array informações que não sejam utilizados pelo pagseguro as mesmas seram descartadas.&lt;br /&gt;
&lt;strong&gt; &lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Criação de um carrinho de compras&lt;/strong&gt;&lt;br /&gt;
Esta disponível também o método create do plugin pagseguro, este é responsável por organizar e tratar as informações dos produtos. Exemplo:&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
$this-&amp;gt;PagSeguro-&amp;gt;create(array(&lt;br /&gt;
array(&lt;br /&gt;
'item_id' =&amp;gt; 1,&lt;br /&gt;
'item_descr' =&amp;gt; 'Produto A',&lt;br /&gt;
'item_valor' =&amp;gt; 12.03,&lt;br /&gt;
'item_peso' =&amp;gt; 1,&lt;br /&gt;
'item_quant' =&amp;gt; 1,&lt;br /&gt;
'item_frete' =&amp;gt; 3.50&lt;br /&gt;
)));&lt;/p&gt;
&lt;p&gt;Obs.: lembrando-se que no campo valor e frete será aplicado a modificação conforme setado em init[definitions][currency_type] e em peso será aplicado conforme init[definitions][weight_type].E por último, o methodo render enviará o array já formatado:&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;set('datas', $this-&amp;gt;PagSeguro-&amp;gt;render());&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helper&lt;/strong&gt;&lt;br /&gt;
O helper do plugin é mais simples ainda, seu funcionamento depende das informações geradas pelo component e estão disponíveis 3 métodos. Form, data e submit.&lt;/p&gt;
&lt;p&gt;echo $pagSeguro-&amp;gt;form($data);&lt;/p&gt;
&lt;p&gt;O método form tem como finalidade setar as informações geradas pelo component e escrever a tag html form correto, para envio ao pagseguro.&lt;/p&gt;
&lt;p&gt;$pagSeguro-&amp;gt;data();&lt;/p&gt;
&lt;p&gt;O método data escreve os infindáveis hiddens que sua compra pode ter. Obs não é necessário dar echo.&lt;/p&gt;
&lt;p&gt;echo $pagSeguro-&amp;gt;submit();&lt;/p&gt;
&lt;p&gt;O método submit escreve o botão submit do formulário. Muitas vezes os botões padrões do pagseguro não satisfazem o designer, então é necessário trocar de botão. Para isso basta acrescentar um array de configuração semelhante ao método submit do helper Html. Exemplo:&lt;/p&gt;
&lt;p&gt;$pagSeguro-&amp;gt;submit(array('src' =&amp;gt; '/img/submit.png', 'theme' =&amp;gt; false));&lt;/p&gt;
&lt;p&gt;Lembrando que o botão vem da configuração do component em definitions theme.&lt;br /&gt;
&lt;strong&gt;Retorno automático&lt;/strong&gt;&lt;br /&gt;
Para Ativar a funcionalidade de retorno automático basta utilizar os métodos do componente, para isso temos:&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;PagSeguro-&amp;gt;isConfirmation();&lt;/p&gt;
&lt;p&gt;Retorna true ou false caso seja POST a solicitação. Lembrando que o PagSeguro acessa esta action 2 veses uma em methodo POST, para envio do estatus da venda e outra de redirecionamento do pagseguro para o site.&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;PagSeguro-&amp;gt;getDataPayment();&lt;/p&gt;
&lt;p&gt;Recebe o array já tratado das informações do PagSeguro.&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;Pagseguro-&amp;gt;confirm();&lt;/p&gt;
&lt;p&gt;Retorna VERIFICADO ou FALSO ou NADA. Geralmente usado para verificar se o post informado é valido.&lt;br /&gt;
Exemplo de uso:&lt;/p&gt;
&lt;p&gt;if($this-&amp;gt;PagSeguro-&amp;gt;isConfirmation()){&lt;br /&gt;
$this-&amp;gt;PagSeguro-&amp;gt;init(array(&lt;br /&gt;
'pagseguro' =&amp;gt; array(&lt;br /&gt;
'email' =&amp;gt; 'test@test.com',&lt;br /&gt;
'token' =&amp;gt; '39839uj3jij3i3jui3uiu3iu3iu3i'&lt;br /&gt;
),&lt;br /&gt;
'format' =&amp;gt; array(&lt;br /&gt;
'item_id' =&amp;gt; 'id',&lt;br /&gt;
'item_descr' =&amp;gt; 'description',&lt;br /&gt;
'item_quant' =&amp;gt; 'amount',&lt;br /&gt;
'item_valor' =&amp;gt; 'price'&lt;br /&gt;
)));&lt;br /&gt;
$verificado = $this-&amp;gt;PagSeguro-&amp;gt;confirm();&lt;br /&gt;
if($verificado == 'VERIFICADO'){&lt;br /&gt;
$dados_da_venda = $this-&amp;gt;PagSeguro-&amp;gt;getDataPayment();&lt;br /&gt;
//logica&lt;br /&gt;
}eles if($verificado == 'FALSO'){&lt;br /&gt;
//logica&lt;br /&gt;
}else{&lt;br /&gt;
//logica&lt;br /&gt;
}&lt;br /&gt;
//retorno do cliente via site do pagseguro.&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Obs.: é necessário passar o token no array pagseguro gerado pelo site do pagseguro.&lt;br /&gt;
Para gerar o token e ativar a url de retorno: &lt;a href="https://pagseguro.uol.com.br/preferences/automaticReturn.jhtml" title="https://pagseguro.uol.com.br/preferences/automaticReturn.jhtml"&gt;https://pagseguro.uol.com.br/preferences/automaticReturn.jhtml&lt;/a&gt;&lt;br /&gt;
Pessoal é isso espero ter ajudado, qualquer dúvida estou ai.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/zHrSOikCfFI" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Tue, 31 Aug 2010 14:58:16 +0000</pubDate>
 <dc:creator>Felipe Theodoro</dc:creator>
 <guid isPermaLink="false">5552 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Tudo sobre Rotas no CakePHP</title>
 <link>http://blog.ftgoncalves.com/2010/08/tudo-sobre-rotas-no-cakephp/</link>
 <description>&lt;p&gt;Este post foi lançado também na ItWeb:&lt;br /&gt;
&lt;a title="itweb" href="http://www.itweb.com.br/noticias/index.asp?cod%3D71088" target="_blank"&gt;http://www.itweb.com.br/noticias/index.asp?cod=71088&lt;/a&gt;&lt;br /&gt;
A funcionalidade de rotas do CakePHP sem dúvida é uma das grandes  vantagens do framework, seu funcionamento engloba todas camadas as quais  utilizam o sistema de roteamento. Seu funcionamento engloba passagem de  parâmetros, parâmetros nomeados, prefixos, referências a plugins,  controllers, actions, expressão regular, extensão de arquivos etc.&lt;br /&gt;
&lt;strong&gt;Rotas definidas&lt;/strong&gt;&lt;br /&gt;
Imagine o caso onde temos um controller products e a action index, e nossa regra de negócio prevê um endereço de acesso web &lt;a href="http://www.exemplo.com.br/estoque"&gt;www.exemplo.com.br/estoque&lt;/a&gt;. Por padrão as rotas do CakePHP são reconhecidas como /controller/action. Por conta deste padrão teremos&lt;br /&gt;
uma rota de acesso ao nosso exemplo, como /products/index. Para a action  index também responder ao endereço /estoque devemos criar uma rota de  acesso, onde definimos uma referência e um endereço.&lt;br /&gt;
&lt;em&gt;Router::connect(”/estoque”, array(”controller” =&amp;gt; ” products”, “action” =&amp;gt; “index”));&lt;/em&gt;&lt;br /&gt;
Após definirmos nossa rota, o endereço de acesso /estoque já esta  apontando para a action índex do nosso controller de exemplo products.&lt;br /&gt;
&lt;strong&gt;Rotas com parâmetros&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
O roteamento do CakePHP também prevê rotas cuja sua construção varia  conforme o que o endereço especifica. Retomando nosso exemplo, imagine  que temos que disponibilizar endereços amigáveis de acesso para cada um  dos produtos. Nossa nova rota deve, além de especificar uma referência  também deve haver uma variável para identificar o produto (neste caso,  utilizaremos o nome do produto&lt;br /&gt;
como identificador).&lt;br /&gt;
&lt;em&gt;Router::connect(”/estoque/:produto”, array(”controller” =&amp;gt; ”  products”, “action” =&amp;gt; “index”), array(”pass” =&amp;gt; “produto”));&lt;/em&gt;&lt;br /&gt;
No código acima, temos a referência /estoque e a variável produto. Agora  já é possível acessar nossa action index, passando o nome do produto  como exemplo /estoque/nome_do_produto (é necessário também implementar a  action ao qual receberá este parâmetro).&lt;br /&gt;
Um modo interessante de tratar os dados a serem enviados para a action é  filtrá-los com expressão regular. Para validar os parâmetros, basta  inserir uma expressão regular para o identificador:&lt;br /&gt;
&lt;em&gt;Router::connect(”/estoque/:produto”, array(”controller” =&amp;gt; ”  products”, “action” =&amp;gt; “index”), array(”pass” =&amp;gt; “produto”,  “produto” =&amp;gt; “[a-z_]+”));&lt;/em&gt;&lt;br /&gt;
As url somente serão casadas com essa rota caso a variável seja  preenchida com pelo menos um ou mais caracteres, sendo letra(s) de “a” a  “z” e/ou “_”.&lt;br /&gt;
Um modo conveniente de generalização para utilizar parâmetros são os identificadores defaults:&lt;br /&gt;
&lt;em&gt;Router::connect(”/:controller/:action/:produto”, array(), array(”pass” =&amp;gt; “produto”, “produto” =&amp;gt; “[a-z_]+”));&lt;/em&gt;&lt;br /&gt;
Esse exemplo casará todos os endereços com a variável produto.&lt;br /&gt;
É sempre bom lembrar que ao utilizar um parâmetro no endereçamento o  identificado deve ou não ser adicionado em nosso controller dependerá da  necessidade. Para isso basta especificar o pass. Ilustrando estes dois  casos podemos ter um endereçamento cujo o mesmo especifica um id único e  esse é usado em nosso controller para identifica-lo&lt;br /&gt;
&lt;em&gt;Router::connect(”/estoque/:id”, array(”controller” =&amp;gt; “products”, “action” =&amp;gt; “edit”), array(”pass” =&amp;gt; “id”));&lt;/em&gt;&lt;br /&gt;
Para o id identificado no pass, esse será anexado no controller pelo &lt;em&gt;$this-&amp;gt;params["pass"]&lt;/em&gt;.  Caso não quisermos atribuir esse parâmetro no controller, não será  necessário identificá-lo no pass, fazendo com que o parâmetro id seja  meramente de roteamento.&lt;br /&gt;
Outra funcionalidade interessante é o persist. Ele fará com que o parâmetro seja persistente à todas funções de roteamento:&lt;br /&gt;
&lt;em&gt;Router::connect(”/estoque/:id”, array(”controller” =&amp;gt; “products”,  “action” =&amp;gt; “edit”), array(”persist” =&amp;gt; “id”)); endereço:  /estoque/8&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;$html-&amp;gt;url(array(”controller” =&amp;gt; “products”, “action” =&amp;gt; “edit”));&lt;/em&gt;&lt;br /&gt;
para este methodo será criado o endereço: &lt;em&gt;/estoque/8&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;Rotas com parâmetros nomeados&lt;/strong&gt;&lt;br /&gt;
Para rotas cuja sua construção dependa de parâmetros nomeados há um  método disponível, o connectNamed cuja sua função é acrescentar ou  remover endereçamentos via parâmetros nomeados. Seu funcionamento é bem  simples, sendo o primeiro parâmetro um array onde será especificado as  referências.&lt;br /&gt;
&lt;em&gt;Router::connectNamed(array(”id”, “name”));&lt;/em&gt;&lt;br /&gt;
Essas referências podem ser especificadas para serem utilizadas em locais específicos.&lt;br /&gt;
&lt;em&gt;Router::connectNamed(array(”id” =&amp;gt; array(”action” =&amp;gt; “index”)));&lt;/em&gt;&lt;br /&gt;
Voltando ao nosso exemplo, podemos também construir um endereço do seguinte modo:&lt;br /&gt;
&lt;em&gt;Router::connectNamed(array(”produto”));&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Router::connect(”/estoque”, array(”controller” =&amp;gt; “products”, “action” =&amp;gt; “index”));&lt;/em&gt;&lt;br /&gt;
Agora nosso endereço de acesso ao produto é &lt;em&gt;/estoque/produto:nome_do_produto.&lt;/em&gt;&lt;br /&gt;
Uma dúvida muito comum em utilizar o connectNamed e especificar um  parâmetro é se essa referência estará disponível para todas as actions. A  resposta é sim, porém não há problemas em disponibilizá-la para as  actions, pois dependerá se o método utilizará ou não este parâmetro. Um  modo para restringir a visibilidade do parâmetro nomeado é utilizar um  array de endereço:&lt;br /&gt;
&lt;em&gt;Router::connectNamed(array(”produto” =&amp;gt; array(”controller” =&amp;gt; “products”, “action” =&amp;gt; “index”)));&lt;/em&gt;&lt;br /&gt;
Com isso, somente o endereço /estoque/index terá disponível o parâmetro nomeado produto.&lt;br /&gt;
&lt;strong&gt;Mapeamento REST&lt;/strong&gt;&lt;br /&gt;
Outro artifício bem interessante é o mapeamento para webservice REST.  Caso tenhamos um controller e queiramos criar um webservice para este  serviço, será necessário configurar as rotas para responder a esta  chamada. Existem dois modos de mapear uma rota para trabalhar com REST.&lt;br /&gt;
O primeiro modo é mais simples. Mapeará somente o controller para responder as chamadas REST.&lt;br /&gt;
&lt;em&gt;Router::mapResources(”products”);&lt;/em&gt;&lt;br /&gt;
Isso fará com que as actions do controller products sejam  disponibilizadas via REST. Agora, para tornar essa função mais  padronizada, colocaremos no fim de nossa url uma extensão, o XML. Para  habilitar essa funcionalidade, basta inserir o seguinte código:&lt;br /&gt;
&lt;em&gt;Router::mapResources(”products”);&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Router::parseExtensions(”xml”);&lt;/em&gt;&lt;br /&gt;
Agora nossas url”s podem ser acessadas via REST e com a extensão XML. Para ilustrar essa funcionalidade, podemos ter &lt;em&gt;/estoque/produto.xml&lt;/em&gt;.&lt;br /&gt;
Existe também o modo mais controlado:&lt;br /&gt;
Router::connect&lt;em&gt;(”/estoque”, array(”controller” =&amp;gt; “products”, “action” =&amp;gt; “index”, “[method]” =&amp;gt; “PUT”, array(”ext” =&amp;gt; “xml”)));&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;Conclusão:&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
Existem várias formas de mapear rotas no CakePHP. Algumas delas  facilitam a vida de qualquer desenvolvedor. Uma boa dica para estudo é  consultar a documentação oficial, a não oficial e os próprios fontes do  CakePHP.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/1-Z554aJHZg" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Thu, 19 Aug 2010 12:23:43 +0000</pubDate>
 <dc:creator>Felipe Theodoro</dc:creator>
 <guid isPermaLink="false">5501 at http://planetcakephp.org</guid>
</item>
<item>
 <title>MySQL, Multiple select in the same table with the result together and order condition applied on all result</title>
 <link>http://cobaia.net/2010/08/mysql-multiple-select-in-the-same-table-with-the-result-together-and-order-condition-applied-on-all-result/</link>
 <description>&lt;p&gt;Today I needed made a multiple select, more than one SELECT command in the same table, but the result should comes together and I also needed apply one condition for ORDER in all result.&lt;br /&gt;
Firstly I tried read if CakePHP has supports for it, but CakePHP doesn’t has, so I pass to try a MySQL query solution for that, and that solution is the command &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/union.html"&gt;UNION&lt;/a&gt;.&lt;br /&gt;
For example:&lt;br /&gt;
Table &lt;strong&gt;people&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;id&lt;br /&gt;
name&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;age &lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;If for example we want show &lt;strong&gt;30 person with age equal 2&lt;/strong&gt;0 and more 20 with the age equal 10.&lt;/strong&gt;&lt;br /&gt;
With the union condition this is simple.&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
(SELECT * FROM people WHERE age=20 LIMIT 30)&lt;br /&gt;
UNION&lt;br /&gt;
(SELECT * FROM people WHERE age=10 LIMIT 20);&lt;/p&gt;
&lt;p&gt;So how you can check, it’s  pretty simple, make your two queries and apply the command UNION, if you want to apply one order or another thing in the result you should put it in the end&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
(SELECT * FROM people WHERE age=20 LIMIT 30)&lt;br /&gt;
UNION&lt;br /&gt;
(SELECT * FROM people WHERE age=10 LIMIT 20)&lt;br /&gt;
ORDER BY name ASC;&lt;/p&gt;
&lt;p&gt;Worth remembering, the fields that result will come should be equal, this in the case that you are not using the same table, but two tables distinct with different fields between these.&lt;br /&gt;
In the case of CakePHP framework, apply the query method of your model for example:&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
$nodes = $this-&amp;gt;Node-&amp;gt;query('&lt;br /&gt;
(SELECT Node.* FROM nodes AS Node WHERE type=3 ORDER BY date DESC LIMIT 30)&lt;br /&gt;
UNION&lt;br /&gt;
(SELECT Node.* FROM nodes AS Node WHERE type!=3 ORDER BY date DESC LIMIT 200)&lt;br /&gt;
ORDER BY date DESC;');&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/dlVAwVATRUg" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Thu, 12 Aug 2010 13:31:32 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5487 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Xavante na WEB, Experimento em HTML5, CSS3, jQuery e CakePHP com Crawler usando phpQuery</title>
 <link>http://cobaia.net/2010/08/xavante-na-web-experimento-em-html5-css3-jquery-e-cakephp-com-crawler-usando-phpquery/</link>
 <description>&lt;p&gt;Hoje postei no ar um &lt;a href="http://xavante.cobaia.net"&gt;experimento(projeto)&lt;/a&gt; o Xavante na Web, para testar algumas tecnologias são elas HTML5, CSS3, &lt;a href="http://jquery.com"&gt;Jquery&lt;/a&gt; e o &lt;a href="http://code.google.com/p/phpquery/"&gt;phpQuery&lt;/a&gt;, junto com a integração de algumas API’s, hoje 09.08 de agosto a do twitter já está no ar, e a do Flickr e Youtube, virão em seguida visto que as duas já foram codificadas bastando o cacheamento das mesmas.&lt;br /&gt;
Para o mesmo foi gasto 3 horas de desenvolvimento, mais 1 hora de acertos que com sua publicação ficou beirando as 5 horas, usando P&lt;a href="http://php.net"&gt;HP 5.2&lt;/a&gt;, &lt;a href="http://mysql.org"&gt;MySQL 5&lt;/a&gt; e &lt;a href="http://cakephp.org"&gt;CakePHP 1.3&lt;/a&gt;.&lt;br /&gt;
O &lt;a href="http://xavante.cobaia.net"&gt;Xavante na Web&lt;/a&gt;, nada mais é que um agregador de notícias, assuntos, imagens vídeos relacionados ao Grêmio Esportivo Brasil, meu time de coração!&lt;br /&gt;
Pretendo nele ir aplicando novas técnicas, e por em prática HTML5 e CSS3 que venho estudando, para o mesmo criei uma Classe PHP para fazer a parte de &lt;a href="http://pt.wikipedia.org/wiki/Web_crawler"&gt;Crawler&lt;/a&gt;, que após eu ter uma suite de teste dela pretendo publicar por aqui, por hora é isso.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/981cLBDueVE" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Tue, 10 Aug 2010 01:56:32 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5472 at http://planetcakephp.org</guid>
</item>
<item>
 <title>ISO country list in SQL adapted for CakePHP applications</title>
 <link>http://cobaia.net/2010/08/iso-country-list-in-sql-adapted-for-cakephp-applications/</link>
 <description>&lt;p&gt;More than one time I needed looking for a list of all countries in SQL to use in CakePHP projects, so this time that I need once more I resolved create that post to share the SQL adapted with the CakePHP rules. The SQL with the list of countries I got from that &lt;a href="http://27.org/isocountrylist/"&gt;site&lt;/a&gt;.&lt;br /&gt;
Get the &lt;a href="http://cobaia.net/countries.sql"&gt;SQL file here&lt;/a&gt; or copy the code below.&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15&lt;br /&gt;
16&lt;br /&gt;
17&lt;br /&gt;
18&lt;br /&gt;
19&lt;br /&gt;
20&lt;br /&gt;
21&lt;br /&gt;
22&lt;br /&gt;
23&lt;br /&gt;
24&lt;br /&gt;
25&lt;br /&gt;
26&lt;br /&gt;
27&lt;br /&gt;
28&lt;br /&gt;
29&lt;br /&gt;
30&lt;br /&gt;
31&lt;br /&gt;
32&lt;br /&gt;
33&lt;br /&gt;
34&lt;br /&gt;
35&lt;br /&gt;
36&lt;br /&gt;
37&lt;br /&gt;
38&lt;br /&gt;
39&lt;br /&gt;
40&lt;br /&gt;
41&lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
45&lt;br /&gt;
46&lt;br /&gt;
47&lt;br /&gt;
48&lt;br /&gt;
49&lt;br /&gt;
50&lt;br /&gt;
51&lt;br /&gt;
52&lt;br /&gt;
53&lt;br /&gt;
54&lt;br /&gt;
55&lt;br /&gt;
56&lt;br /&gt;
57&lt;br /&gt;
58&lt;br /&gt;
59&lt;br /&gt;
60&lt;br /&gt;
61&lt;br /&gt;
62&lt;br /&gt;
63&lt;br /&gt;
64&lt;br /&gt;
65&lt;br /&gt;
66&lt;br /&gt;
67&lt;br /&gt;
68&lt;br /&gt;
69&lt;br /&gt;
70&lt;br /&gt;
71&lt;br /&gt;
72&lt;br /&gt;
73&lt;br /&gt;
74&lt;br /&gt;
75&lt;br /&gt;
76&lt;br /&gt;
77&lt;br /&gt;
78&lt;br /&gt;
79&lt;br /&gt;
80&lt;br /&gt;
81&lt;br /&gt;
82&lt;br /&gt;
83&lt;br /&gt;
84&lt;br /&gt;
85&lt;br /&gt;
86&lt;br /&gt;
87&lt;br /&gt;
88&lt;br /&gt;
89&lt;br /&gt;
90&lt;br /&gt;
91&lt;br /&gt;
92&lt;br /&gt;
93&lt;br /&gt;
94&lt;br /&gt;
95&lt;br /&gt;
96&lt;br /&gt;
97&lt;br /&gt;
98&lt;br /&gt;
99&lt;br /&gt;
100&lt;br /&gt;
101&lt;br /&gt;
102&lt;br /&gt;
103&lt;br /&gt;
104&lt;br /&gt;
105&lt;br /&gt;
106&lt;br /&gt;
107&lt;br /&gt;
108&lt;br /&gt;
109&lt;br /&gt;
110&lt;br /&gt;
111&lt;br /&gt;
112&lt;br /&gt;
113&lt;br /&gt;
114&lt;br /&gt;
115&lt;br /&gt;
116&lt;br /&gt;
117&lt;br /&gt;
118&lt;br /&gt;
119&lt;br /&gt;
120&lt;br /&gt;
121&lt;br /&gt;
122&lt;br /&gt;
123&lt;br /&gt;
124&lt;br /&gt;
125&lt;br /&gt;
126&lt;br /&gt;
127&lt;br /&gt;
128&lt;br /&gt;
129&lt;br /&gt;
130&lt;br /&gt;
131&lt;br /&gt;
132&lt;br /&gt;
133&lt;br /&gt;
134&lt;br /&gt;
135&lt;br /&gt;
136&lt;br /&gt;
137&lt;br /&gt;
138&lt;br /&gt;
139&lt;br /&gt;
140&lt;br /&gt;
141&lt;br /&gt;
142&lt;br /&gt;
143&lt;br /&gt;
144&lt;br /&gt;
145&lt;br /&gt;
146&lt;br /&gt;
147&lt;br /&gt;
148&lt;br /&gt;
149&lt;br /&gt;
150&lt;br /&gt;
151&lt;br /&gt;
152&lt;br /&gt;
153&lt;br /&gt;
154&lt;br /&gt;
155&lt;br /&gt;
156&lt;br /&gt;
157&lt;br /&gt;
158&lt;br /&gt;
159&lt;br /&gt;
160&lt;br /&gt;
161&lt;br /&gt;
162&lt;br /&gt;
163&lt;br /&gt;
164&lt;br /&gt;
165&lt;br /&gt;
166&lt;br /&gt;
167&lt;br /&gt;
168&lt;br /&gt;
169&lt;br /&gt;
170&lt;br /&gt;
171&lt;br /&gt;
172&lt;br /&gt;
173&lt;br /&gt;
174&lt;br /&gt;
175&lt;br /&gt;
176&lt;br /&gt;
177&lt;br /&gt;
178&lt;br /&gt;
179&lt;br /&gt;
180&lt;br /&gt;
181&lt;br /&gt;
182&lt;br /&gt;
183&lt;br /&gt;
184&lt;br /&gt;
185&lt;br /&gt;
186&lt;br /&gt;
187&lt;br /&gt;
188&lt;br /&gt;
189&lt;br /&gt;
190&lt;br /&gt;
191&lt;br /&gt;
192&lt;br /&gt;
193&lt;br /&gt;
194&lt;br /&gt;
195&lt;br /&gt;
196&lt;br /&gt;
197&lt;br /&gt;
198&lt;br /&gt;
199&lt;br /&gt;
200&lt;br /&gt;
201&lt;br /&gt;
202&lt;br /&gt;
203&lt;br /&gt;
204&lt;br /&gt;
205&lt;br /&gt;
206&lt;br /&gt;
207&lt;br /&gt;
208&lt;br /&gt;
209&lt;br /&gt;
210&lt;br /&gt;
211&lt;br /&gt;
212&lt;br /&gt;
213&lt;br /&gt;
214&lt;br /&gt;
215&lt;br /&gt;
216&lt;br /&gt;
217&lt;br /&gt;
218&lt;br /&gt;
219&lt;br /&gt;
220&lt;br /&gt;
221&lt;br /&gt;
222&lt;br /&gt;
223&lt;br /&gt;
224&lt;br /&gt;
225&lt;br /&gt;
226&lt;br /&gt;
227&lt;br /&gt;
228&lt;br /&gt;
229&lt;br /&gt;
230&lt;br /&gt;
231&lt;br /&gt;
232&lt;br /&gt;
233&lt;br /&gt;
234&lt;br /&gt;
235&lt;br /&gt;
236&lt;br /&gt;
237&lt;br /&gt;
238&lt;br /&gt;
239&lt;br /&gt;
240&lt;br /&gt;
241&lt;br /&gt;
242&lt;br /&gt;
243&lt;br /&gt;
244&lt;br /&gt;
245&lt;br /&gt;
246&lt;br /&gt;
247&lt;br /&gt;
248&lt;br /&gt;
249&lt;br /&gt;
CREATE TABLE  `countries` (&lt;br /&gt;
  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `iso` char(2) NOT NULL,&lt;br /&gt;
  `name` varchar(80) NOT NULL,&lt;br /&gt;
  `printable_name` varchar(80)  NOT NULL,&lt;br /&gt;
  `iso3` char(3) DEFAULT NULL,&lt;br /&gt;
  `numcode` smallint(6) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM AUTO_INCREMENT=240 DEFAULT CHARSET=utf8;&lt;br /&gt;
 &lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AF','AFGHANISTAN','Afghanistan','AFG','004');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AL','ALBANIA','Albania','ALB','008');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'DZ','ALGERIA','Algeria','DZA','012');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AS','AMERICAN SAMOA','American Samoa','ASM','016');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AD','ANDORRA','Andorra','AND','020');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AO','ANGOLA','Angola','AGO','024');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AI','ANGUILLA','Anguilla','AIA','660');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AQ','ANTARCTICA','Antarctica',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AG','ANTIGUA AND BARBUDA','Antigua and Barbuda','ATG','028');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AR','ARGENTINA','Argentina','ARG','032');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AM','ARMENIA','Armenia','ARM','051');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AW','ARUBA','Aruba','ABW','533');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AU','AUSTRALIA','Australia','AUS','036');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AT','AUSTRIA','Austria','AUT','040');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AZ','AZERBAIJAN','Azerbaijan','AZE','031');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BS','BAHAMAS','Bahamas','BHS','044');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BH','BAHRAIN','Bahrain','BHR','048');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BD','BANGLADESH','Bangladesh','BGD','050');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BB','BARBADOS','Barbados','BRB','052');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BY','BELARUS','Belarus','BLR','112');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BE','BELGIUM','Belgium','BEL','056');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BZ','BELIZE','Belize','BLZ','084');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BJ','BENIN','Benin','BEN','204');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BM','BERMUDA','Bermuda','BMU','060');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BT','BHUTAN','Bhutan','BTN','064');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BO','BOLIVIA','Bolivia','BOL','068');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BA','BOSNIA AND HERZEGOVINA','Bosnia and Herzegovina','BIH','070');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BW','BOTSWANA','Botswana','BWA','072');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BV','BOUVET ISLAND','Bouvet Island',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BR','BRAZIL','Brazil','BRA','076');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IO','BRITISH INDIAN OCEAN TERRITORY','British Indian Ocean Territory',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BN','BRUNEI DARUSSALAM','Brunei Darussalam','BRN','096');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BG','BULGARIA','Bulgaria','BGR','100');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BF','BURKINA FASO','Burkina Faso','BFA','854');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'BI','BURUNDI','Burundi','BDI','108');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KH','CAMBODIA','Cambodia','KHM','116');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CM','CAMEROON','Cameroon','CMR','120');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CA','CANADA','Canada','CAN','124');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CV','CAPE VERDE','Cape Verde','CPV','132');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KY','CAYMAN ISLANDS','Cayman Islands','CYM','136');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CF','CENTRAL AFRICAN REPUBLIC','Central African Republic','CAF','140');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TD','CHAD','Chad','TCD','148');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CL','CHILE','Chile','CHL','152');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CN','CHINA','China','CHN','156');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CX','CHRISTMAS ISLAND','Christmas Island',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CC','COCOS (KEELING) ISLANDS','Cocos (Keeling) Islands',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CO','COLOMBIA','Colombia','COL','170');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KM','COMOROS','Comoros','COM','174');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CG','CONGO','Congo','COG','178');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CD','CONGO, THE DEMOCRATIC REPUBLIC OF THE','Congo, the Democratic Republic of the','COD','180');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CK','COOK ISLANDS','Cook Islands','COK','184');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CR','COSTA RICA','Costa Rica','CRI','188');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CI','COTE D\'IVOIRE','Cote D\'Ivoire','CIV','384');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'HR','CROATIA','Croatia','HRV','191');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CU','CUBA','Cuba','CUB','192');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CY','CYPRUS','Cyprus','CYP','196');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CZ','CZECH REPUBLIC','Czech Republic','CZE','203');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'DK','DENMARK','Denmark','DNK','208');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'DJ','DJIBOUTI','Djibouti','DJI','262');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'DM','DOMINICA','Dominica','DMA','212');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'DO','DOMINICAN REPUBLIC','Dominican Republic','DOM','214');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'EC','ECUADOR','Ecuador','ECU','218');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'EG','EGYPT','Egypt','EGY','818');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SV','EL SALVADOR','El Salvador','SLV','222');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GQ','EQUATORIAL GUINEA','Equatorial Guinea','GNQ','226');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ER','ERITREA','Eritrea','ERI','232');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'EE','ESTONIA','Estonia','EST','233');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ET','ETHIOPIA','Ethiopia','ETH','231');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'FK','FALKLAND ISLANDS (MALVINAS)','Falkland Islands (Malvinas)','FLK','238');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'FO','FAROE ISLANDS','Faroe Islands','FRO','234');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'FJ','FIJI','Fiji','FJI','242');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'FI','FINLAND','Finland','FIN','246');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'FR','FRANCE','France','FRA','250');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GF','FRENCH GUIANA','French Guiana','GUF','254');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PF','FRENCH POLYNESIA','French Polynesia','PYF','258');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TF','FRENCH SOUTHERN TERRITORIES','French Southern Territories',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GA','GABON','Gabon','GAB','266');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GM','GAMBIA','Gambia','GMB','270');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GE','GEORGIA','Georgia','GEO','268');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'DE','GERMANY','Germany','DEU','276');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GH','GHANA','Ghana','GHA','288');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GI','GIBRALTAR','Gibraltar','GIB','292');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GR','GREECE','Greece','GRC','300');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GL','GREENLAND','Greenland','GRL','304');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GD','GRENADA','Grenada','GRD','308');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GP','GUADELOUPE','Guadeloupe','GLP','312');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GU','GUAM','Guam','GUM','316');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GT','GUATEMALA','Guatemala','GTM','320');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GN','GUINEA','Guinea','GIN','324');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GW','GUINEA-BISSAU','Guinea-Bissau','GNB','624');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GY','GUYANA','Guyana','GUY','328');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'HT','HAITI','Haiti','HTI','332');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'HM','HEARD ISLAND AND MCDONALD ISLANDS','Heard Island and Mcdonald Islands',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VA','HOLY SEE (VATICAN CITY STATE)','Holy See (Vatican City State)','VAT','336');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'HN','HONDURAS','Honduras','HND','340');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'HK','HONG KONG','Hong Kong','HKG','344');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'HU','HUNGARY','Hungary','HUN','348');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IS','ICELAND','Iceland','ISL','352');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IN','INDIA','India','IND','356');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ID','INDONESIA','Indonesia','IDN','360');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IR','IRAN, ISLAMIC REPUBLIC OF','Iran, Islamic Republic of','IRN','364');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IQ','IRAQ','Iraq','IRQ','368');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IE','IRELAND','Ireland','IRL','372');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IL','ISRAEL','Israel','ISR','376');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'IT','ITALY','Italy','ITA','380');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'JM','JAMAICA','Jamaica','JAM','388');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'JP','JAPAN','Japan','JPN','392');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'JO','JORDAN','Jordan','JOR','400');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KZ','KAZAKHSTAN','Kazakhstan','KAZ','398');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KE','KENYA','Kenya','KEN','404');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KI','KIRIBATI','Kiribati','KIR','296');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KP','KOREA, DEMOCRATIC PEOPLE\'S REPUBLIC OF','Korea, Democratic People\'s Republic of','PRK','408');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KR','KOREA, REPUBLIC OF','Korea, Republic of','KOR','410');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KW','KUWAIT','Kuwait','KWT','414');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KG','KYRGYZSTAN','Kyrgyzstan','KGZ','417');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LA','LAO PEOPLE\'S DEMOCRATIC REPUBLIC','Lao People\'s Democratic Republic','LAO','418');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LV','LATVIA','Latvia','LVA','428');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LB','LEBANON','Lebanon','LBN','422');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LS','LESOTHO','Lesotho','LSO','426');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LR','LIBERIA','Liberia','LBR','430');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LY','LIBYAN ARAB JAMAHIRIYA','Libyan Arab Jamahiriya','LBY','434');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LI','LIECHTENSTEIN','Liechtenstein','LIE','438');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LT','LITHUANIA','Lithuania','LTU','440');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LU','LUXEMBOURG','Luxembourg','LUX','442');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MO','MACAO','Macao','MAC','446');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MK','MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF','Macedonia, the Former Yugoslav Republic of','MKD','807');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MG','MADAGASCAR','Madagascar','MDG','450');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MW','MALAWI','Malawi','MWI','454');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MY','MALAYSIA','Malaysia','MYS','458');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MV','MALDIVES','Maldives','MDV','462');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ML','MALI','Mali','MLI','466');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MT','MALTA','Malta','MLT','470');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MH','MARSHALL ISLANDS','Marshall Islands','MHL','584');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MQ','MARTINIQUE','Martinique','MTQ','474');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MR','MAURITANIA','Mauritania','MRT','478');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MU','MAURITIUS','Mauritius','MUS','480');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'YT','MAYOTTE','Mayotte',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MX','MEXICO','Mexico','MEX','484');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'FM','MICRONESIA, FEDERATED STATES OF','Micronesia, Federated States of','FSM','583');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MD','MOLDOVA, REPUBLIC OF','Moldova, Republic of','MDA','498');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MC','MONACO','Monaco','MCO','492');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MN','MONGOLIA','Mongolia','MNG','496');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MS','MONTSERRAT','Montserrat','MSR','500');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MA','MOROCCO','Morocco','MAR','504');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MZ','MOZAMBIQUE','Mozambique','MOZ','508');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MM','MYANMAR','Myanmar','MMR','104');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NA','NAMIBIA','Namibia','NAM','516');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NR','NAURU','Nauru','NRU','520');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NP','NEPAL','Nepal','NPL','524');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NL','NETHERLANDS','Netherlands','NLD','528');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AN','NETHERLANDS ANTILLES','Netherlands Antilles','ANT','530');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NC','NEW CALEDONIA','New Caledonia','NCL','540');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NZ','NEW ZEALAND','New Zealand','NZL','554');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NI','NICARAGUA','Nicaragua','NIC','558');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NE','NIGER','Niger','NER','562');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NG','NIGERIA','Nigeria','NGA','566');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NU','NIUE','Niue','NIU','570');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NF','NORFOLK ISLAND','Norfolk Island','NFK','574');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'MP','NORTHERN MARIANA ISLANDS','Northern Mariana Islands','MNP','580');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'NO','NORWAY','Norway','NOR','578');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'OM','OMAN','Oman','OMN','512');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PK','PAKISTAN','Pakistan','PAK','586');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PW','PALAU','Palau','PLW','585');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PS','PALESTINIAN TERRITORY, OCCUPIED','Palestinian Territory, Occupied',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PA','PANAMA','Panama','PAN','591');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PG','PAPUA NEW GUINEA','Papua New Guinea','PNG','598');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PY','PARAGUAY','Paraguay','PRY','600');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PE','PERU','Peru','PER','604');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PH','PHILIPPINES','Philippines','PHL','608');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PN','PITCAIRN','Pitcairn','PCN','612');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PL','POLAND','Poland','POL','616');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PT','PORTUGAL','Portugal','PRT','620');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PR','PUERTO RICO','Puerto Rico','PRI','630');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'QA','QATAR','Qatar','QAT','634');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'RE','REUNION','Reunion','REU','638');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'RO','ROMANIA','Romania','ROM','642');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'RU','RUSSIAN FEDERATION','Russian Federation','RUS','643');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'RW','RWANDA','Rwanda','RWA','646');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SH','SAINT HELENA','Saint Helena','SHN','654');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'KN','SAINT KITTS AND NEVIS','Saint Kitts and Nevis','KNA','659');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LC','SAINT LUCIA','Saint Lucia','LCA','662');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'PM','SAINT PIERRE AND MIQUELON','Saint Pierre and Miquelon','SPM','666');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VC','SAINT VINCENT AND THE GRENADINES','Saint Vincent and the Grenadines','VCT','670');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'WS','SAMOA','Samoa','WSM','882');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SM','SAN MARINO','San Marino','SMR','674');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ST','SAO TOME AND PRINCIPE','Sao Tome and Principe','STP','678');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SA','SAUDI ARABIA','Saudi Arabia','SAU','682');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SN','SENEGAL','Senegal','SEN','686');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CS','SERBIA AND MONTENEGRO','Serbia and Montenegro',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SC','SEYCHELLES','Seychelles','SYC','690');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SL','SIERRA LEONE','Sierra Leone','SLE','694');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SG','SINGAPORE','Singapore','SGP','702');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SK','SLOVAKIA','Slovakia','SVK','703');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SI','SLOVENIA','Slovenia','SVN','705');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SB','SOLOMON ISLANDS','Solomon Islands','SLB','090');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SO','SOMALIA','Somalia','SOM','706');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ZA','SOUTH AFRICA','South Africa','ZAF','710');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GS','SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS','South Georgia and the South Sandwich Islands',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ES','SPAIN','Spain','ESP','724');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'LK','SRI LANKA','Sri Lanka','LKA','144');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SD','SUDAN','Sudan','SDN','736');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SR','SURINAME','Suriname','SUR','740');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SJ','SVALBARD AND JAN MAYEN','Svalbard and Jan Mayen','SJM','744');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SZ','SWAZILAND','Swaziland','SWZ','748');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SE','SWEDEN','Sweden','SWE','752');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'CH','SWITZERLAND','Switzerland','CHE','756');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'SY','SYRIAN ARAB REPUBLIC','Syrian Arab Republic','SYR','760');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TW','TAIWAN, PROVINCE OF CHINA','Taiwan, Province of China','TWN','158');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TJ','TAJIKISTAN','Tajikistan','TJK','762');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TZ','TANZANIA, UNITED REPUBLIC OF','Tanzania, United Republic of','TZA','834');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TH','THAILAND','Thailand','THA','764');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TL','TIMOR-LESTE','Timor-Leste',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TG','TOGO','Togo','TGO','768');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TK','TOKELAU','Tokelau','TKL','772');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TO','TONGA','Tonga','TON','776');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TT','TRINIDAD AND TOBAGO','Trinidad and Tobago','TTO','780');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TN','TUNISIA','Tunisia','TUN','788');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TR','TURKEY','Turkey','TUR','792');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TM','TURKMENISTAN','Turkmenistan','TKM','795');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TC','TURKS AND CAICOS ISLANDS','Turks and Caicos Islands','TCA','796');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'TV','TUVALU','Tuvalu','TUV','798');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'UG','UGANDA','Uganda','UGA','800');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'UA','UKRAINE','Ukraine','UKR','804');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'AE','UNITED ARAB EMIRATES','United Arab Emirates','ARE','784');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'GB','UNITED KINGDOM','United Kingdom','GBR','826');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'US','UNITED STATES','United States','USA','840');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'UM','UNITED STATES MINOR OUTLYING ISLANDS','United States Minor Outlying Islands',NULL,NULL);&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'UY','URUGUAY','Uruguay','URY','858');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'UZ','UZBEKISTAN','Uzbekistan','UZB','860');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VU','VANUATU','Vanuatu','VUT','548');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VE','VENEZUELA','Venezuela','VEN','862');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VN','VIET NAM','Viet Nam','VNM','704');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VG','VIRGIN ISLANDS, BRITISH','Virgin Islands, British','VGB','092');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'VI','VIRGIN ISLANDS, U.S.','Virgin Islands, U.s.','VIR','850');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'WF','WALLIS AND FUTUNA','Wallis and Futuna','WLF','876');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'EH','WESTERN SAHARA','Western Sahara','ESH','732');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'YE','YEMEN','Yemen','YEM','887');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ZM','ZAMBIA','Zambia','ZMB','894');&lt;br /&gt;
INSERT INTO countries VALUES (NULL, 'ZW','ZIMBABWE','Zimbabwe','ZWE','716');&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/w-T_gN98C1c" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Mon, 02 Aug 2010 12:33:52 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5454 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Nova estrutura de diretório no CakePHP 2.0</title>
 <link>http://blog.cakephp-brasil.org/2010/07/28/nova-estrutura-de-diretorio-no-cakephp-2-0/</link>
 <description>&lt;p&gt;O CakePHP, além dos novos recursos e alterações que está sofrendo, terá sua estrutura de diretórios alterada. Esta alteração vem da adoção de um padrão criado pelo grupo &lt;a href="http://groups.google.com/group/php-standards/"&gt;PHP Standards Working Group&lt;/a&gt;.&lt;br /&gt;
O padrão é usado em alguns frameworks e CMS. Para quem quiser ver as regras pode consulta o site &lt;a href="http://groups.google.com/group/php-standards/web/psr-0-final-proposal"&gt;http://groups.google.com/group/php-standards/web/psr-0-final-proposal&lt;/a&gt;.&lt;br /&gt;
No CakePHP ainda está em fase de estudos e adequações, as últimas decisões sobre o assunto pode ser conferida na página &lt;a href="http://cakephp.lighthouseapp.com/projects/42648/20-php-standards-group-file-naming"&gt;2.0 – PHP standards group file naming&lt;/a&gt; na &lt;a href="http://cakephp.lighthouseapp.com/"&gt;LightHouseApp&lt;/a&gt;. As alterações no código devem começar em breve nos branches da release 2.0.&lt;br /&gt;
Essa alteração certamente vai preocupar muita gente na hora de migrar o código, mas acredito ser inevitável para melhorar a padronização e a performance do framework. Com as alterações existentes hoje a melhora de performance já foi bem significativa, em alguns casos passando de 30%.&lt;br /&gt;
Bem, vamos esperar para ver o que vem por aí, mas podem ter certeza que coisa boa é.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/gy5wAoaQZUk" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Thu, 29 Jul 2010 01:05:51 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5449 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Virando a página – Cake 2.0</title>
 <link>http://blog.cakephp-brasil.org/2010/07/16/virando-a-pagina-cake-2-0/</link>
 <description>&lt;p&gt;Agora que o CakePHP 2.0 já está um pouco mais maduro, vou comentar um pouco sobre a nova versão, daqui pra frente pretendo publicar alguns posts mais detalhado de cada novo recurso, por enquanto vamos numa visão mais macro.&lt;br /&gt;
Pra começo de conversa, pra quem não sabe o CakePHP 2.0 é a versão que está em desenvolvimento pelo time do cake. As versões 1.2 e 1.3 são versões estáveis e que daqui para frente só terão correções de bugs, nada de recurso novo. Não há em vista uma versão 1.4 (que seriam novos recursos com compatibilidade pro PHP4).&lt;br /&gt;
A versão 2.0 tem como requisito PHP 5.2 em diante. Por este fato, trará muitos recursos novos e facilidades no desenvolvimento das aplicações. Além disso, a versão poderá otimizar muitos itens, tornando a sua aplicação mais rápida ainda.&lt;br /&gt;
Alguns itens previstos pro Cake 2.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fim da compatibilidade com PHP 4&lt;/li&gt;
&lt;li&gt;Lazy load para models, helpers e componentes (Não sabe o que é? Eu explico eu outro post)&lt;/li&gt;
&lt;li&gt;Remover a “mágica” que mudava os textos, adotando o “&lt;em&gt;What you type is what you get&lt;/em&gt;” (ou “O que você escrever é o que você verá”).&lt;/li&gt;
&lt;li&gt;Ajustes do código para utilizar classes Spl, interfaces, abstracts, etc. e corrigir a visibilidade dos métodos (public/private/protected)&lt;/li&gt;
&lt;li&gt;As buscas retornarão objetos e não mais arrays, facilitando ações e aumentando a performance&lt;/li&gt;
&lt;li&gt;Helpers, Behaviors e Components poderão ter aliases, ou seja, você poderá fazer seu próprio HtmlHelper e dizer que o helper Html será o seu customizado&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gostou? Essa era só uma palinha sobre o que vem por aí. Em breve mais comentários e detalhes sobre o funcionamento destes itens.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/vk4Em54biAM" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Fri, 16 Jul 2010 22:44:52 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5434 at http://planetcakephp.org</guid>
</item>
<item>
 <title>AjusteFloat e outras novidades no CakePtbr</title>
 <link>http://blog.cakephp-brasil.org/2010/06/04/ajustefloat-e-outras-novidades-no-cakeptbr/</link>
 <description>&lt;p&gt;Pessoal,&lt;br /&gt;
Venho aqui anunciar que o &lt;a href="http://github.com/jrbasso/cake_ptbr"&gt;projeto CakePtbr&lt;/a&gt; sofreu algumas alterações. A primeira foi a inclusão do behavior AjusteFloat criado pelo &lt;a href="http://twitter.com/zehzinho"&gt;Zé Ricardo&lt;/a&gt; (Obrigado, Zé!), com alguns complementos meus (docs, formatação e testes). Este behavior está disponível para o CakePHP 1.2 e 1.3.&lt;br /&gt;
Em segundo lugar, como a release 1.3 do CakePHP está estável, movi o conteúdo do master (que referia-se ao CakePHP 1.2) para o branch 1.2 e transformei o branch 1.3 em master. Daqui pra frente as melhorias serão feitas aqui e o branch 1.2 conterá apenas correções de bug.&lt;br /&gt;
Abraços e bom uso.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/175SEfV6UfI" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Fri, 04 Jun 2010 22:59:10 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5311 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Croogo falando um pouco de português</title>
 <link>http://cobaia.net/2010/05/croogo-falando-um-pouco-de-portugues/</link>
 <description>&lt;p&gt;Comecei a utilizar o &lt;a href="http://croogo.org"&gt;croogo&lt;/a&gt;, e vendo que ele tem potencial e tendo vontade de investir algumas horas no desenvolvimento de plugins para ele, resolvi passar ele para o idioma nativo, então surgiu no &lt;a href="http://github.com/krolow/croogo-pt_BR"&gt;github o projeto do Croogo falando Português do Brasil&lt;/a&gt;, já tendo uma versão inicial da tradução para Português do Brasil, fico disposto a tentar manter esta tradução do mesmo.&lt;br /&gt;
Bom para utilização basta o &lt;a href="http://github.com/krolow/croogo-pt_BR/downloads"&gt;download do zip&lt;/a&gt; e fazer o upload dentro do próprio croogo no módulo de Locale, é necessário permissão de escrita no folder do locale que se encontra dentro de app.&lt;br /&gt;
Irei fazer mais revisões pois esta é apenas uma inicial, e aguardo feedback e pessoas dispostas a manter a mesma e ou reportar erros de tradução.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/ozVIcQ5y9sI" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Wed, 19 May 2010 02:08:48 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5257 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP force download</title>
 <link>http://cobaia.net/2010/05/cakephp-force-download/</link>
 <description>&lt;p&gt;A common stuff that we need do using PHP is force the download of files, a common routine for it is when we can not give access for the users for the folder where are the files, so we must force the download.&lt;br /&gt;
To do it with CakePHP is very simple, for it we have the Media view, let’s go to the code.&lt;br /&gt;
some_controller.php&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15&lt;br /&gt;
16&lt;br /&gt;
17&lt;br /&gt;
18&lt;br /&gt;
19&lt;br /&gt;
&amp;lt; ? php&lt;br /&gt;
class SomeController extends AppController {&lt;br /&gt;
 &lt;br /&gt;
    public $uses = null;&lt;br /&gt;
 &lt;br /&gt;
    public function download() {&lt;br /&gt;
         $this-&amp;gt;view = 'Media';&lt;br /&gt;
         $params = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;br /&gt;
                'id' =&amp;gt; 'video.flv',&lt;br /&gt;
                'name' =&amp;gt; 'video',&lt;br /&gt;
                'download' =&amp;gt; true,&lt;br /&gt;
                'extension' =&amp;gt; 'flv',&lt;br /&gt;
                'path' =&amp;gt; APP . 'files' . DS&lt;br /&gt;
        );&lt;br /&gt;
        $this-&amp;gt;set($params);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;So let’s explain quickly, we set the id of the file, the name of the file, the extension, and the path indicate where is the file, and the important set the download with true and so pass it for the view Media, and the magic happens, the class Media get the hard work and force the download.&lt;br /&gt;
You can see more things that Media can do for you in the &lt;a href="http://book.cakephp.org/view/489/Media-Views"&gt;CakePHP Book&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/45T5Dz_XEWM" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Thu, 13 May 2010 01:58:24 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5218 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP 1.3 without database</title>
 <link>http://cobaia.net/2010/05/cakephp-1-3-without-database/</link>
 <description>&lt;p&gt;To use the CakePHP 1.3 without database is pretty simple, we must create a new datasource, I’ll call it “Without”, so let’s go do it.&lt;br /&gt;
Firstly we must set the DATABASE_CONFIG, go to the config folder and edit the database.php:&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
&amp;lt; ?php&lt;br /&gt;
class DATABASE_CONFIG {&lt;br /&gt;
 &lt;br /&gt;
 var $default = &lt;a href="http://www.php.net/array"&gt;array&lt;/a&gt;('driver' =&amp;gt; 'without');&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;We defined there the driver to “without”, so let’s create the dbo_without.php inside the folder models/datasources/ with the code below:&lt;/p&gt;
&lt;p&gt;1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
&amp;lt; ?php&lt;br /&gt;
class DboWithout extends DataSource {&lt;br /&gt;
 &lt;br /&gt;
public function isConnected() {&lt;br /&gt;
       return true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;Just it, we just need create a method called isConnected returning it true, compared with the version 1.2 is more easy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/H7mLWK0m81Y" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Wed, 12 May 2010 12:36:40 +0000</pubDate>
 <dc:creator>Vinícius Krolow</dc:creator>
 <guid isPermaLink="false">5214 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakeFest 2010</title>
 <link>http://blog.cakephp-brasil.org/2010/05/11/cakefest-2010/</link>
 <description>&lt;p&gt;Opa!&lt;br /&gt;
Como muitos já devem saber, todo ano acontece um encontro entre desenvolvedores, usuários, apreciadores, gente nova e de tudo que é tipo e lugar num evento chamada CakeFest.&lt;br /&gt;
Este ano a CakeFest acontecerá nos EUA (já aconteceu na Argentina, Alemanha, Japão, … Cada ano em um país) e neste momento está convidando as pessoas/empresas para participarem como palestrantes ou patrocinadores. As palestras devem ser em inglês e relacionadas ao CakePHP (meio óbvio  ).&lt;br /&gt;
Quem tiver interesse, pode entrar no site oficial da festa e entrar em contato para maiores detalhes: &lt;a href="http://cakefest.org/"&gt;http://cakefest.org/&lt;/a&gt;&lt;br /&gt;
Os patrocínios podem ser de qualquer quantia. O pessoal lá tem um prospecto explicando tudo, basta pedir as informações. Se você trabalha numa empresa que usa o CakePHP, peça ao seu chefe (ou se você for o chefe) para ajudar a quem ajuda vocês. Com isso estarão promovendo e melhorando ainda mais este maravilhoso framework de desenvolvimento.&lt;br /&gt;
A propósito, quem já está se programando para ir para lá? Eu estou pensando seriamente em ir (dinheiro?! sei lá da onde vou tirar).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/YfFlxdKnAP4" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Tue, 11 May 2010 21:09:18 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5212 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Behavior Super Find veio ao mundo</title>
 <link>http://blog.cakephp-brasil.org/2010/04/27/behavior-super-find-veio-ao-mundo/</link>
 <description>&lt;p&gt;Depois de ter criado o post sobre o &lt;a href="http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/"&gt;Behavior para melhorar o find&lt;/a&gt;, cá está ele! Ontem a noite criei o projeto e enviei o código que tenho para o GitHub, no projeto entitulado de &lt;a href="http://github.com/jrbasso/super_find"&gt;super_find&lt;/a&gt;.&lt;br /&gt;
Tinha dito que o nome seria power find, mas depois de ver alguns projetos na internet como o &lt;a href="http://github.com/Theaxiom/SuperAuth"&gt;SuperAuth&lt;/a&gt;, &lt;a href="http://github.com/tPl0ch/cakephp-super-validatable-plugin"&gt;SuperValidatable&lt;/a&gt;, etc., resolvi manter o nome de SuperFind.&lt;br /&gt;
Bem, vamos ao que interessa, o que faz e como funciona… Basicamente, ele serve para fazer um find podendo colocar condições de relacionamentos hasMany e HABTM. No CakePHP puro isto não é possível, pois ele joga estas condições na query direto e acaba causando um erro de SQL. Aí você dizer, mas e o Containable?! Bem, ele até faz alguns filtros, mas o filtro que ele faz é em cima do valor retornado da consulta principal. Vamos a um exemplo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"&gt;?&lt;/a&gt;&lt;a href=";"&gt;View Code&lt;/a&gt; PHP1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15&lt;br /&gt;
16&lt;br /&gt;
17&lt;br /&gt;
18&lt;br /&gt;
19&lt;br /&gt;
20&lt;br /&gt;
21&lt;br /&gt;
22&lt;br /&gt;
23&lt;br /&gt;
24&lt;br /&gt;
25&lt;br /&gt;
26&lt;br /&gt;
27&lt;br /&gt;
28&lt;br /&gt;
29&lt;br /&gt;
30&lt;br /&gt;
31&lt;br /&gt;
32&lt;br /&gt;
33&lt;br /&gt;
$this-&amp;gt;Usuario-&amp;gt;find('all', array('contain' =&amp;gt; array('Tarefa.nome = "Tarefa 1")));&lt;br /&gt;
/* Retorno:&lt;br /&gt;
    array(&lt;br /&gt;
        array(&lt;br /&gt;
            'Usuario' =&amp;gt; array('id' =&amp;gt; 1, 'nome' =&amp;gt; 'Usuario 1'),&lt;br /&gt;
            'Tarefa' =&amp;gt; array(&lt;br /&gt;
                array('id' =&amp;gt; 1, 'nome' =&amp;gt; 'Task 1', 'usuario_id' =&amp;gt; 1)&lt;br /&gt;
            )&lt;br /&gt;
        ),&lt;br /&gt;
        array(&lt;br /&gt;
            'Usuario' =&amp;gt; array('id' =&amp;gt; 2, 'nome' =&amp;gt; 'Usuario 2'),&lt;br /&gt;
            'Tarefa' =&amp;gt; array(&lt;br /&gt;
            )&lt;br /&gt;
        ),&lt;br /&gt;
        array(&lt;br /&gt;
            'Usuario' =&amp;gt; array('id' =&amp;gt; 3, 'nome' =&amp;gt; 'Usuario 3'),&lt;br /&gt;
            'Tarefa' =&amp;gt; array(&lt;br /&gt;
            )&lt;br /&gt;
        ),&lt;br /&gt;
    )&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
$this-&amp;gt;Usuario-&amp;gt;superFind('all', array('conditions' =&amp;gt; array('Tarefa.nome' =&amp;gt; 'Tarefa 1')));&lt;br /&gt;
/* Retorna:&lt;br /&gt;
    array(&lt;br /&gt;
        array(&lt;br /&gt;
            'Usuario' =&amp;gt; array('id' =&amp;gt; 1, 'nome' =&amp;gt; 'Usuario 1'),&lt;br /&gt;
            'Tarefa' =&amp;gt; array(&lt;br /&gt;
                array('id' =&amp;gt; 1, 'nome' =&amp;gt; 'Tarefa 1', 'usuario_id' =&amp;gt; 1)&lt;br /&gt;
            )&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
*/&lt;/p&gt;
&lt;p&gt;Em resumo, no Containable ele listou todos os usuários e no relacionamento &lt;em&gt;Tarefa&lt;/em&gt; veio apenas os que tinham a ‘Tarefa 1′. Já no SuperFind ele mostrou apenas os usuários que tinham a ‘Tarefa 1′.&lt;br /&gt;
O mesmo funciona com relacionamentos HABTM. Para os relacionamentos hasOne e belongsTo não são necessários, pois isto já funciona nativamente.&lt;br /&gt;
Por enquanto é possível fazer isto apenas com um nível de filtro, ou seja, você não poderá colocar nas condições algo como &lt;em&gt;Tarefa.Projeto.nome&lt;/em&gt;.&lt;br /&gt;
Bem, por enquanto é isso. Alguém tem mais sugestões do que poderia entrar? O que sente falta no find?&lt;br /&gt;
Abraços e bom uso.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/1qc7J2YE_sU" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Tue, 27 Apr 2010 21:49:59 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5162 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Lib para lidar com arquivos Zip no CakePHP</title>
 <link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/RLXZ6wMfMgk/</link>
 <description>&lt;p&gt;&lt;a href="http://buzzvolume.com/compartilhar?url%3Dhttp://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/"&gt;&lt;/a&gt;Em um projeto recente, precisei extrair arquivos zip no server, e no&lt;br /&gt;
processo criei uma classe para abstrair a manipulação dos arquivos.&lt;br /&gt;
Como no Dreamhost o PHP não vem com a zlib habilitada, não tem como&lt;br /&gt;
usar a ZipArchive, o que facilitaria muito as coisas. Mas o bom é que&lt;br /&gt;
o zlib é instalado no server, e os comandos do PHP de execução de&lt;br /&gt;
programas são habilitados, então criei a classe utilizando o `exec’&lt;br /&gt;
para chamar o `unzip’ e extrair os arquivos.&lt;br /&gt;
A classe está bem simples porque só implementei o necessário para meu&lt;br /&gt;
projeto, mas é um esqueleto para quem precisar de algo mais completo.&lt;br /&gt;
Evitei o uso de expressões regulares por questão de performance. Aí vai o código:&lt;/p&gt;
&lt;p&gt;Coloquem no diretório APP/lib, e usem assim:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Posts relacionados:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/" rel="bookmark" /&gt;Migrando para o CakePHP 1.3"&amp;gt;Migrando para o CakePHP 1.3&lt;/a&gt;  A maioria já deve saber que o CakePHP está...&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DRLXZ6wMfMgk:uExb92B-kMA:yIl2AUoC8zA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DRLXZ6wMfMgk:uExb92B-kMA:7Q72WNTAKBA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DRLXZ6wMfMgk:uExb92B-kMA:D7DqB2pKExk"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/WpbOuNorB9o" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Mon, 26 Apr 2010 20:11:42 +0000</pubDate>
 <dc:creator>KISS - souÁgil</dc:creator>
 <guid isPermaLink="false">5233 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Nova release do CakePHP</title>
 <link>http://blog.cakephp-brasil.org/2010/04/23/nova-release-do-cakephp/</link>
 <description>&lt;p&gt;Hoje foi liberada a release 1.2.7 do CakePHP, corrigindo 36 bugs, sendo um uma questão de segurança.&lt;br /&gt;
Uma pequena correção de segurança também foi feita nesta versão. Este problema de segurança afeta apenas os sistemas que utilizam o modo debug em produção. Caso deseja apenas corrigir o problema de segurança, sem atualizar o core inteiro, você pode aplicar o patch disponibilzado por eles em &lt;a href="http://bin.cakephp.org/view/1459556460"&gt;http://bin.cakephp.org/view/1459556460&lt;/a&gt;.&lt;br /&gt;
A nova versão (1.2.7) está disponível no &lt;a href="http://github.com/cakephp/cakephp1x/downloads"&gt;GitHub&lt;/a&gt;. A lista completa das alterações pode ser vista no &lt;a href="http://cakephp.lighthouseapp.com/projects/42648/changelog-1-2-7"&gt;Changelog&lt;/a&gt;.&lt;br /&gt;
Lembro também que está previsto para domingo o lançamento da versão 1.3.0-RC5! Vamos aguardar pra ver.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/tT6u0Tn3Fis" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Fri, 23 Apr 2010 11:22:18 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5134 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Behavior para melhorar o find</title>
 <link>http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/</link>
 <description>&lt;p&gt;Hola!&lt;br /&gt;
Estava aqui implementando alguns projetos e vi o quão chato é ter que implementar os models no cake sempre pensando nas queries que ele irá gerar.&lt;br /&gt;
As vezes vou fazer um find em models que tenham hasMany e quero fazer um filtro pelo model do hasMany e não consigo. Se eu coloco no conditions ele diz que a tabela do hasMany não existe. Se eu uso Containable ele mostra todos os registros do model que fiz o find com alguns tendo associações vazias. Ou seja, ele não faz JOIN com as tabelas hasMany nesses casos, sempre gerar queries diferentes e não sabe tratar direito.&lt;br /&gt;
Pensei em implementar isto no core do cake e propor para eles, mas a release 1.3 está fechada para enhancements, então ficaria para a versão 1.4/2.0 que sabe-se lá quando vem… Pensei então em um plugin para implementar isto, mas aí entra meu maior problema em computação: qual o nome?!&lt;br /&gt;
Alguém tem alguma sugestão? Como será um projeto a nível internacional, pensei em “SuperFind”, “FindPlusPlus”, “xFind”… Alguém tem alguma melhor?&lt;br /&gt;
No começo será mais para melhorar os relacionamentos de joins e afins, mas futuramente trabalhar melhor um pouco os casos de limit nos relacionamentos e outras coisitas a mais do find.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/4jjsllS6NG8" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Thu, 22 Apr 2010 22:14:08 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5124 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Plugin CakePtbr</title>
 <link>http://blog.cakephp-brasil.org/2010/04/04/plugin-cakeptbr/</link>
 <description>&lt;p&gt;Como alguns já devem conhecer, dou continuidade ao trabalho iniciado pelo &lt;a href="http://github.com/gabrielgilini/cake_ptbr"&gt;Gabriel Gilini no GitHub&lt;/a&gt;. Ele iniciou colocando as inflections geradas pelo &lt;a href="http://labs.sadjow.com/"&gt;Sadjow&lt;/a&gt;, depois algumas atualizações que fiz, e assim foi… Depois de um tempo fiz um fork do projeto dele no GitHub e fui incluindo novas features, como validações (cpf, cnpj, etc.), behaviors, helpers, etc. Além disso, inclui testes automatizados para todos os itens existentes no plugin. No link do projeto você pode ver todos recursos que foram feitos: &lt;a href="http://github.com/jrbasso/cake_ptbr" title="http://github.com/jrbasso/cake_ptbr"&gt;http://github.com/jrbasso/cake_ptbr&lt;/a&gt;&lt;br /&gt;
Agora, com as releases candidates do CakePHP 1.3, criei um &lt;a href="http://github.com/jrbasso/cake_ptbr/tree/1.3"&gt;branch&lt;/a&gt; (chamado 1.3) para fazer os devidos ajustes. Ou seja, se você já está usando o CakePHP 1.3, use a versão do branch 1.3 do cake_ptbr.&lt;br /&gt;
Neste branch da versão 1.3 entraram e sairam algumas coisas, dentre elas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validação de CPF/CNPJ: Foram removidas. O código delas foi transferido para o &lt;a href="http://github.com/cakephp/localized"&gt;plugin oficial do Cake&lt;/a&gt; (localized) que trata só de internacionalização;&lt;/li&gt;
&lt;li&gt;Geração de bolos em português: Quando você gerar models, views ou controllers via bake, eles já sairam do forno falando português!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Os demais recursos existentes na versão 1.2 continuarão valendo para a versão 1.3. Novos recursos estão na lista para serem implementados (falta um pouco de tempo): integração com PagSeguro, geração de boletos bancários e ajuste de número.&lt;br /&gt;
Quem tiver novas idéias de itens para implementar neste plugin, responda este post ou então crie uma &lt;a href="http://github.com/jrbasso/cake_ptbr/issues"&gt;issue no GitHub&lt;/a&gt;.&lt;br /&gt;
Abraços e bom uso para todos.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/Fqy_2sElbTo" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Sun, 04 Apr 2010 20:15:39 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">5011 at http://planetcakephp.org</guid>
</item>
<item>
 <title>MVC para iniciantes – Parte 1</title>
 <link>http://blog.thiagobelem.net/php/mvc-para-iniciantes-parte-1/</link>
 <description>&lt;p&gt;Um artigo explicando o que é o modelo &lt;strong&gt;MVC&lt;/strong&gt; (Model-View-Controller) e por que essa nova forma de organização de software está tomando o mercado.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/hdJl8joWAoo" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Sun, 04 Apr 2010 01:25:43 +0000</pubDate>
 <dc:creator>Thiago Belem</dc:creator>
 <guid isPermaLink="false">4998 at http://planetcakephp.org</guid>
</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>
 <description>&lt;p&gt;&lt;a href="http://buzzvolume.com/compartilhar?url%3Dhttp://kiss.souagil.com.br/2010/04/validacao-de-campos-de-texto-com-caracteres-acentuados/"&gt;&lt;/a&gt;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.&lt;br /&gt;
Toda entrada textual deve ser representada com uma &lt;a href="http://en.wikipedia.org/wiki/Character_encoding"&gt;codificação de caracteres&lt;/a&gt; específica. Essas codificações são diversas, mas as mais conhecidas e utilizadas são &lt;a href="http://en.wikipedia.org/wiki/ASCII"&gt;ASCII&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/ISO_8859-1"&gt;ISO 8859-1&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/UTF-8"&gt;UTF-8&lt;/a&gt;. Cada uma possui &lt;a href="http://articles.sitepoint.com/article/guide-web-character-encoding"&gt;diferentes capacidades e características&lt;/a&gt;, mas já adianto que a mais atraente delas é o UTF-8 (ou Unicode), sendo inclusive uma &lt;a href="http://www.w3.org/International/O-charset.en.php"&gt;recomendação de utilização do W3C&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://book.cakephp.org/view/134/Core-Validation-Rules"&gt;regras de validação&lt;/a&gt; como o &lt;strong&gt;minLength&lt;/strong&gt;, &lt;strong&gt;maxLength&lt;/strong&gt; e &lt;strong&gt;between&lt;/strong&gt; para facilitar a vida do programador.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;var $validate = array(&lt;br /&gt;
    'campo' =&amp;gt; array(&lt;br /&gt;
        'rule' =&amp;gt; array('between', 5, 10),&lt;br /&gt;
        'message' =&amp;gt; 'Este campo precisa ter entre 5 e 10 caracteres.'&lt;br /&gt;
    )&lt;br /&gt;
);&lt;/p&gt;
&lt;p&gt;Perfeito!&lt;/p&gt;
&lt;p&gt;Calma que não é bem assim. Imagine que o campo foi preenchido com o valor &lt;em&gt;‘php é foda’&lt;/em&gt;, uma string de tamanho 10. Curiosamente, essa string não passa na regra de validação. Por que?&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html"&gt;maior parte dos textos é codificada em UTF-8, ISO-8859-1&lt;/a&gt;, entre outros encodings, que podem &lt;a href="http://revolucao.etc.br/archives/charsets-e-encodings/"&gt;utilizar mais de um byte para representar caracteres acentuados&lt;/a&gt;, e esse é o motivo da regra de validação não funcionar para esse caso.&lt;br /&gt;
Também não adianta usar a função strlen() do PHP, porque ela possui o mesmo comportamento.&lt;br /&gt;
O que fazer então?&lt;br /&gt;
É claro que existe uma alternativa, que é a função &lt;a href="http://www.php.net/manual/en/function.mb-strlen.php"&gt;mb_strlen&lt;/a&gt;. 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.&lt;br /&gt;
O código&lt;/p&gt;
&lt;p&gt;    mb_strlen('php é foda', 'utf-8');&lt;/p&gt;
&lt;p&gt;retorna exatamente 10, o valor que desejamos.&lt;br /&gt;
Desse modo, nossa função de validação seria:&lt;/p&gt;
&lt;p&gt;function validateInputLength($input)&lt;br /&gt;
{&lt;br /&gt;
    $encoding = mb_detect_encoding($input['campo']);&lt;br /&gt;
    $lowerLimit = 5;&lt;br /&gt;
    $upperLimit = 10;&lt;br /&gt;
    return mb_strlen($input['campo'], $encoding) &amp;gt;= $lowerLimit &amp;amp;&amp;amp; mb_strlen($input['campo'], $encoding) &amp;lt;= $upperLimit;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Note o uso da função &lt;a href="http://www.php.net/manual/en/function.mb-detect-encoding.php"&gt;mb_detect_encoding&lt;/a&gt;, o que torna a função capaz de manipular qualquer tipo de string, não sendo dependente de nenhuma codificação de caracteres.&lt;br /&gt;
Apesar de ser uma questão simples, acredito que essa solução pode ajudar bastante.&lt;br /&gt;
Alguém já teve problemas semelhantes? Como resolveram?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Posts relacionados:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/" rel="bookmark" /&gt;Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário"&amp;gt;Redirecionamento de Erros: descubra os 404 e diminua a insatisfação do usuário&lt;/a&gt; Uma das coisas mais frustrantes da navegação na internet é...&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DttWjdy-E1Aw:bGLClJtU0TA:yIl2AUoC8zA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DttWjdy-E1Aw:bGLClJtU0TA:7Q72WNTAKBA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DttWjdy-E1Aw:bGLClJtU0TA:D7DqB2pKExk"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/AayBrw1nU6A" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Fri, 02 Apr 2010 17:00:56 +0000</pubDate>
 <dc:creator>KISS - souÁgil</dc:creator>
 <guid isPermaLink="false">4994 at http://planetcakephp.org</guid>
</item>
<item>
 <title>MeioUpload – refactory</title>
 <link>http://blog.cakephp-brasil.org/2010/03/31/meioupload-refactory/</link>
 <description>&lt;p&gt;Depois de quase um ano, já vieram moscas, mas elas morreram, vieram aranhas, mas morreram também, só ficaram as teias aqui no blog. Depois da limpeza, volto com algumas novidades.&lt;br /&gt;
Pra voltar, gostaria de falar do último projeto que estou trabalhando, o MeioUpload. O MeioUpload foi um behavior iniciado pelo Vinícius Mendes no site Meio Código. O site do projeto era &lt;a href="http://www.meiocodigo.com/projects/meioupload/" title="http://www.meiocodigo.com/projects/meioupload/"&gt;http://www.meiocodigo.com/projects/meioupload/&lt;/a&gt;&lt;br /&gt;
Como ele saiu do desenvolvimento do CakePHP e eu precisei incluir algumas validações, pedi a autorização e criei um projeto para ele no GitHub: &lt;a href="http://github.com/jrbasso/MeioUpload" title="http://github.com/jrbasso/MeioUpload"&gt;http://github.com/jrbasso/MeioUpload&lt;/a&gt;&lt;br /&gt;
Com isso, alguns bugs foram surgindo, pedidos de novas features aqui e ali e sempre fui empurrando com a barriga. O grande &lt;a href="http://josediazgonzalez.com/"&gt;Joze Gonzalez&lt;/a&gt; ajudou na documentação e algumas implementações também.&lt;br /&gt;
Como veio muita coisa nova e o código estava parecendo pinheirinho de natal, cheio de coisa pendurada, resolvi fazer um refactory geral nele. A versão com estas modificações é a 3.0, ainda em &lt;a href="http://github.com/jrbasso/MeioUpload/tree/3.0"&gt;branch&lt;/a&gt;, liberei hoje a versão &lt;a href="http://github.com/jrbasso/MeioUpload/tarball/3.0-rc1"&gt;RC1 para download&lt;/a&gt;. Quem encontrar problemas ou ainda tiver alguma sugestão do que implementar, cria um ticket no github que irei dar uma analisada.&lt;br /&gt;
Ela não está 100% compatível com a versão anterior. Removi algumas configurações que eram possíveis e outras deixei automáticas (preenchidas através de algumas regras). Fiz isso para simplificar o código e evitar que tivessem várias configurações. Também atualizei a documentação e incluí (finalmente) testes automatizados no projeto. Os testes não cobrem 100% dos recursos, mas estamos caminhando para isso.&lt;br /&gt;
Quem tiver testado, por favor dê um feedback para saber para que lado andar com o projeto.&lt;br /&gt;
Abraços e obrigado a todos.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/cYvIkSFpsyo" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Wed, 31 Mar 2010 22:47:21 +0000</pubDate>
 <dc:creator>Juan Basso</dc:creator>
 <guid isPermaLink="false">4981 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Galeria de imagens similar à da Apple Store</title>
 <link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/YZR2QtqSlBM/</link>
 <description>&lt;p&gt;&lt;a href="http://buzzvolume.com/compartilhar?url%3Dhttp://kiss.souagil.com.br/2010/03/galeria-de-imagens-similar-a-da-apple-store/"&gt;&lt;/a&gt;Semana passada o &lt;a href="http://twitter.com/dgmike"&gt;dgmike&lt;/a&gt; fez um &lt;a href="http://dgmike.com.br/2010/03/23/desafio-javascript/trackback/"&gt;desafio&lt;/a&gt; em seu blog. O objetivo era construir uma galeria de imagens igual à vista na &lt;a href="http://store.apple.com/us/product/IPAD_KBDOCK?mco%3DMTcyMTgwOTg"&gt;Apple Store&lt;/a&gt; do zero, e obviamente sem consultar o fonte do original.&lt;br /&gt;
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 &lt;a href="http://www.cinsoft.net/mylib.html"&gt;My Library&lt;/a&gt;; melhor lib JavaScript já concebida, se você me perguntar.&lt;br /&gt;
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 &lt;a href="http://www.souagil.com.br/gabriel/myimagegallery/"&gt;primeira versão do script&lt;/a&gt;. Não testei extensivamente, mas sei que funciona em IE7, IE8, Opera8-10, Chrome e Firefox 2+.&lt;br /&gt;
&lt;a href="http://www.souagil.com.br/gabriel/myimagegallery/"&gt;Dê uma conferida no meu trabalho&lt;/a&gt;, e diga o que achou aí nos comentários. Se encontrar qualquer bug ou tiver alguma sugestão, vou ficar feliz em ouvi-lo.&lt;br /&gt;
Update:&lt;br /&gt;
&lt;a href="http://www.cinsoft.net/mylib.html"&gt;David Mark&lt;/a&gt; was nice enough to link my gallery at &lt;a href="http://www.cinsoft.net/mylib-examples.html#userexamples"&gt;MyLib’s website&lt;/a&gt;!&lt;br /&gt;
Thanks, David!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DYZR2QtqSlBM:7PLE7YQrytA:yIl2AUoC8zA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DYZR2QtqSlBM:7PLE7YQrytA:7Q72WNTAKBA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DYZR2QtqSlBM:7PLE7YQrytA:D7DqB2pKExk"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/141HrBMIeAA" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Wed, 31 Mar 2010 14:42:05 +0000</pubDate>
 <dc:creator>KISS - souÁgil</dc:creator>
 <guid isPermaLink="false">4979 at http://planetcakephp.org</guid>
</item>
<item>
 <title>E-commerce cresce 30% no Brasil</title>
 <link>http://blog.ftgoncalves.com/2010/03/e-commerce-cresce-30-no-brasil/</link>
 <description>&lt;p&gt;O comércio pela internet vem se tornando cada vez mais comum na vida dos brasileiros, segundo a 21ª edição do Relatório WebShoppers da e-bit. Somente em 2009, as vendas pela web cresceram 30 por cento, estabelecendo faturamento de R$10,6 bilhões.&lt;br /&gt;
No ano passado, 17,6 milhões de consumidores fizeram compras pela internet, um crescimento de 33 por cento em relação a 2008.&lt;br /&gt;
O crescimento foi resultado do cumprimento dos prazos estabelecidos para entrega de grande parte dos produtos e por conta do aumento de confiança e satisfação dos consumidores em relação ao sistema e formas de pagamento.&lt;br /&gt;
As expectativas para esse ano são altas. De acordo com o relatório, a Copa do Mundo tem grandes chances de elevar o faturamento brasileiro ainda no primeiro semestre de 2010, por conta da venda de aparelhos de televisão. A previsão é de faturamento de R$13,6 bilhões e crescimento de 35 por cento dos consumidores em relação a 2009.&lt;br /&gt;
Fonte: &lt;a href="http://olhardigital.uol.com.br/digital_news/noticia.php?id_conteudo=11057&amp;amp;/E_COMMERCE+CRESCE+30+NO+BRASIL" title="http://olhardigital.uol.com.br/digital_news/noticia.php?id_conteudo=11057&amp;amp;/E_COMMERCE+CRESCE+30+NO+BRASIL"&gt;http://olhardigital.uol.com.br/digital_news/noticia.php?id_conteudo=1105...&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/c2Y-m8m1hnE" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Tue, 30 Mar 2010 12:56:31 +0000</pubDate>
 <dc:creator>Felipe Theodoro</dc:creator>
 <guid isPermaLink="false">4950 at http://planetcakephp.org</guid>
</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>
 <description>&lt;p&gt;&lt;a href="http://buzzvolume.com/compartilhar?url%3Dhttp://kiss.souagil.com.br/2010/03/redirecionamento-de-erros-descubra-os-404-e-diminua-a-insatisfacao-do-usuario/"&gt;&lt;/a&gt;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.&lt;br /&gt;
O &lt;a href="http://pt.wikipedia.org/wiki/HTTP_404"&gt;404&lt;/a&gt; é 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.&lt;br /&gt;
O CakePHP através do método link do &lt;a href="http://book.cakephp.org/view/205/HTML"&gt;helper Html&lt;/a&gt; já previne alguns problemas porém ainda não é possível administrar os erros de maneira fácil.&lt;br /&gt;
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.&lt;br /&gt;
A primeira coisa a se fazer é criar a tabela onde ficaram armazenados estes erros.&lt;/p&gt;
&lt;p&gt;CREATE TABLE `redirects` (&lt;br /&gt;
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
    `num_errors` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
    `page_from` varchar(255) NOT NULL,&lt;br /&gt;
    `page_to` varchar(255),&lt;br /&gt;
    `num_redirects` int(10) UNSIGNED,&lt;br /&gt;
    PRIMARY KEY (`id`)&lt;br /&gt;
)&lt;/p&gt;
&lt;p&gt;Após a tabela criamos o modelo com métodos para contar e manipular os erros e os redirecionamentos: (/models/redirect.php)&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
class Redirect extends AppModel {&lt;br /&gt;
    var $name = 'Redirect';&lt;br /&gt;
    public function manageError($url){&lt;br /&gt;
        $redirects = $this-&amp;gt;find(&lt;br /&gt;
            'first',&lt;br /&gt;
            array(&lt;br /&gt;
                'conditions' =&amp;gt; array('Redirect.page_from' =&amp;gt; $url)&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
        if(!$redirects){&lt;br /&gt;
            $redirects['Redirect']['num_errors'] = 0;&lt;br /&gt;
            $redirects['Redirect']['page_from'] = $url;&lt;br /&gt;
            $redirects['Redirect']['num_redirects'] = 0;&lt;br /&gt;
            $redirects['Redirect']['page_to'] = null;&lt;br /&gt;
        }&lt;br /&gt;
        $redirects['Redirect']['num_errors']++;&lt;br /&gt;
        $this-&amp;gt;set(&lt;br /&gt;
            $redirects&lt;br /&gt;
        );&lt;br /&gt;
        return $this-&amp;gt;save();&lt;br /&gt;
    }&lt;br /&gt;
    public function manageRedirect($urlfrom, $urlTo){&lt;br /&gt;
        $redirect = $this-&amp;gt;find(&lt;br /&gt;
            'first',&lt;br /&gt;
            array(&lt;br /&gt;
                'conditions' =&amp;gt; array(&lt;br /&gt;
                    'Redirect.page_from' =&amp;gt; $urlfrom&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
        $redirect['Redirect']['num_redirects']++;&lt;br /&gt;
        $this-&amp;gt;set($redirect);&lt;br /&gt;
        return $this-&amp;gt;save();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;Com isso, já podemos criar o armazenamento, redirecionamento e contagem dos erros. Esta será feita escrevendo a classe &lt;a href="http://book.cakephp.org/view/154/Error-Handling"&gt;AppError&lt;/a&gt; que é feita exatamente para manipular estes erros. (/app_error.php)&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
    class AppError extends ErrorHandler{&lt;br /&gt;
        var $Error;&lt;br /&gt;
        public function error404($params){&lt;br /&gt;
            $this-&amp;gt;Redirect = ClassRegistry::init('Redirect');&lt;br /&gt;
            $page = $this-&amp;gt;Redirect-&amp;gt;find(&lt;br /&gt;
                'first',&lt;br /&gt;
                array(&lt;br /&gt;
                    'conditions' =&amp;gt; array(&lt;br /&gt;
                        'page_from' =&amp;gt; $params['url']&lt;br /&gt;
                    )&lt;br /&gt;
                )&lt;br /&gt;
            );&lt;br /&gt;
            if($page &amp;amp;&amp;amp; $page['Redirect']['page_to']){&lt;br /&gt;
                $this-&amp;gt;Redirect-&amp;gt;manageRedirect(&lt;br /&gt;
                    $params['url'],&lt;br /&gt;
                    $page['Redirect']['page_to']&lt;br /&gt;
                );&lt;br /&gt;
                $Dispatcher = new Dispatcher();&lt;br /&gt;
                $Dispatcher-&amp;gt;dispatch($page['Redirect']['page_to']);&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                $this-&amp;gt;Redirect-&amp;gt;manageError($params['url']);&lt;br /&gt;
                $this-&amp;gt;controller-&amp;gt;set('url', $params['url']);&lt;br /&gt;
                $this-&amp;gt;_outputMessage('error404', $params);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;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)&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
class RedirectsController extends AppController {&lt;br /&gt;
	var $name = 'Redirects';&lt;br /&gt;
	var $helpers = array('Html', 'Form');&lt;br /&gt;
    var $paginate = array(&lt;br /&gt;
        'limit' =&amp;gt; 25,&lt;br /&gt;
        'order' =&amp;gt; array(&lt;br /&gt;
            'num_errors' =&amp;gt; 'desc'&lt;br /&gt;
        )&lt;br /&gt;
    );&lt;br /&gt;
	function index() {&lt;br /&gt;
		$this-&amp;gt;Redirect-&amp;gt;recursive = 0;&lt;br /&gt;
		$this-&amp;gt;set('redirects', $this-&amp;gt;paginate());&lt;br /&gt;
	}&lt;br /&gt;
	function create_redirect($id = null) {&lt;br /&gt;
		if (!$id &amp;amp;&amp;amp; empty($this-&amp;gt;data)) {&lt;br /&gt;
			$this-&amp;gt;Session-&amp;gt;setFlash(__('Redirecionamento Inválido', true));&lt;br /&gt;
			$this-&amp;gt;redirect(array('action'=&amp;gt;'index'));&lt;br /&gt;
		}&lt;br /&gt;
		if (!empty($this-&amp;gt;data)) {&lt;br /&gt;
			if ($this-&amp;gt;Redirect-&amp;gt;save($this-&amp;gt;data)) {&lt;br /&gt;
				$this-&amp;gt;Session-&amp;gt;setFlash(__('O Redirecionamento foi salvo.', true));&lt;br /&gt;
				$this-&amp;gt;redirect(array('action'=&amp;gt;'index'));&lt;br /&gt;
			} else {&lt;br /&gt;
				$this-&amp;gt;Session-&amp;gt;setFlash(__('O Redirecionamento não pode ser salvo. Por favor, tente novamente.', true));&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (empty($this-&amp;gt;data)) {&lt;br /&gt;
			$this-&amp;gt;data = $this-&amp;gt;Redirect-&amp;gt;read(null, $id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	function delete($id = null) {&lt;br /&gt;
		if (!$id) {&lt;br /&gt;
			$this-&amp;gt;Session-&amp;gt;setFlash(__('Redirecionamento com id inválido', true));&lt;br /&gt;
			$this-&amp;gt;redirect(array('action'=&amp;gt;'index'));&lt;br /&gt;
		}&lt;br /&gt;
		if ($this-&amp;gt;Redirect-&amp;gt;del($id)) {&lt;br /&gt;
			$this-&amp;gt;Session-&amp;gt;setFlash(__('Redirecionamento excluído', true));&lt;br /&gt;
			$this-&amp;gt;redirect(array('action'=&amp;gt;'index'));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;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:&lt;br /&gt;
create_redirect (/views/redirects/create_redirect.ctp):&lt;/p&gt;
&lt;p&gt;&amp;lt;?php echo $form-&amp;gt;create('Redirect', array('action' =&amp;gt; 'create_redirect'));?&amp;gt;&lt;/p&gt;
&lt;p&gt; 		&amp;lt;?php __('Criar Redirecionamento');?&amp;gt;&lt;br /&gt;
	&amp;lt;?php&lt;br /&gt;
		echo $form-&amp;gt;input('id');&lt;br /&gt;
		echo $form-&amp;gt;input('page_from', array('label'=&amp;gt;'URL do 404', 'disabled' =&amp;gt; true));&lt;br /&gt;
		echo $form-&amp;gt;input('page_to', array('label' =&amp;gt; 'Redirecionar para'));&lt;br /&gt;
	?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;?php echo $form-&amp;gt;end('Criar');?&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
			&amp;lt;?php&lt;br /&gt;
				echo $html-&amp;gt;link(&lt;br /&gt;
					__('Excluir', true),&lt;br /&gt;
					array(&lt;br /&gt;
						'action' =&amp;gt; 'delete',&lt;br /&gt;
						$form-&amp;gt;value('Redirect.id')&lt;br /&gt;
					),&lt;br /&gt;
					null,&lt;br /&gt;
					sprintf(&lt;br /&gt;
						__('Você tem certeza que deseja excluir # %s?', true),&lt;br /&gt;
						$form-&amp;gt;value('Redirect.id')&lt;br /&gt;
					)&lt;br /&gt;
				);&lt;br /&gt;
			?&amp;gt;
		&lt;/li&gt;
&lt;li&gt;
			&amp;lt;?php&lt;br /&gt;
				echo $html-&amp;gt;link(&lt;br /&gt;
					__('Listar 404s', true),&lt;br /&gt;
					array('action' =&amp;gt; 'index')&lt;br /&gt;
				);&lt;br /&gt;
			?&amp;gt;
		&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;e index (/views/redirects/index.ctp):&lt;/p&gt;
&lt;p&gt;&amp;lt;?php __('Redirecionamentos');?&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;?php echo $paginator-&amp;gt;sort('URL do 404', 'page_from');?&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo $paginator-&amp;gt;sort('número de erros', 'num_errors');?&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo $paginator-&amp;gt;sort('URL a redirecionar', 'page_to');?&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo $paginator-&amp;gt;sort('número de redirecionamentos', 'num_redirects');?&amp;gt;&lt;br /&gt;
	&amp;lt;?php __('Ações');?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
foreach ($redirects as $redirect):&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;			&amp;lt;?php echo $redirect['Redirect']['page_from']; ?&amp;gt;&lt;/p&gt;
&lt;p&gt;			&amp;lt;?php echo $redirect['Redirect']['num_errors']; ?&amp;gt;&lt;/p&gt;
&lt;p&gt;			&amp;lt;?php echo $redirect['Redirect']['page_to']; ?&amp;gt;&lt;/p&gt;
&lt;p&gt;			&amp;lt;?php echo $redirect['Redirect']['num_redirects']; ?&amp;gt;&lt;/p&gt;
&lt;p&gt;			&amp;lt;?php&lt;br /&gt;
				echo $html-&amp;gt;link(&lt;br /&gt;
					__('Criar Redirecionamento', true),&lt;br /&gt;
					array(&lt;br /&gt;
						'action' =&amp;gt; 'create_redirect',&lt;br /&gt;
						$redirect['Redirect']['id']&lt;br /&gt;
					)&lt;br /&gt;
				);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
				echo $html-&amp;gt;link(&lt;br /&gt;
					__('Excluir', true),&lt;br /&gt;
					array(&lt;br /&gt;
						'action' =&amp;gt; 'delete',&lt;br /&gt;
						$redirect['Redirect']['id']&lt;br /&gt;
					)&lt;br /&gt;
				);&lt;br /&gt;
			?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;?php endforeach; ?&amp;gt;&lt;/p&gt;
&lt;p&gt;	&amp;lt;?php echo $paginator-&amp;gt;prev('&amp;lt;&amp;lt; '.__('anterior', true), array(), null, array('class'=&amp;gt;'disabled'));?&amp;gt;&lt;br /&gt;
 | 	&amp;lt;?php echo $paginator-&amp;gt;numbers();?&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo $paginator-&amp;gt;next(__('próxima', true).' &amp;gt;&amp;gt;', array(), null, array('class' =&amp;gt; 'disabled'));?&amp;gt;&lt;/p&gt;
&lt;p&gt;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&lt;br /&gt;
Criei um projeto no github pra facilitar a baixar os arquivos. Está tudo neste &lt;a target="_blank" href="http://github.com/lucasgameiro/CakePHP-HTTP-Error-Manager"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3D2qCnOHz_-Kc:zP6B-zvo7i8:yIl2AUoC8zA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3D2qCnOHz_-Kc:zP6B-zvo7i8:7Q72WNTAKBA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3D2qCnOHz_-Kc:zP6B-zvo7i8:D7DqB2pKExk"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/k3mdh3hy8oE" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Mon, 22 Mar 2010 19:55:43 +0000</pubDate>
 <dc:creator>KISS - souÁgil</dc:creator>
 <guid isPermaLink="false">4902 at http://planetcakephp.org</guid>
</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>
 <description>&lt;p&gt;&lt;a href="http://buzzvolume.com/compartilhar?url%3Dhttp://kiss.souagil.com.br/2010/03/a-importancia-do-software-livre-e-padroes-abertos-na-web/"&gt;&lt;/a&gt;&lt;br /&gt;
Ano passado um aluno de jornalismo da UEL me procurou para falar um pouco sobre minha “experiência” 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 &lt;a href="http://vidaoperaria.blogspot.com/2010/03/o-software-livre-na-universidade.html"&gt;nesse post&lt;/a&gt; do blog dele.&lt;/p&gt;
&lt;p&gt;Há algum tempo o &lt;a href="http://kiss.souagil.com.br/author/joaojose/"&gt;João José&lt;/a&gt; postou aqui no blog sobre &lt;a href="http://kiss.souagil.com.br/author/joaojose/"&gt;práticas para se tornar um melhor desenvolvedor CakePHP&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Por que?&lt;br /&gt;
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 &lt;a href="http://www.w3.org"&gt;W3C&lt;/a&gt; e era muito comum implementar duas versões de um mesmo aplicativo Web.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://www.w3.org/TR/html5/"&gt;HTML 5&lt;/a&gt;, &lt;a href="http://www.w3.org/TR/css3-roadmap/"&gt;CSS 3&lt;/a&gt;, &lt;a href="http://www.ecmascript.org/docs.php"&gt;EcmaScript&lt;/a&gt; o que é muito positivo e na minha opinião o caminho certo. Não sou só eu que penso assim, &lt;a href="http://www.w3.org/People/Berners-Lee/"&gt;Tim Berners-Lee&lt;/a&gt;, o criador da nossa tão querida WWW é 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://news.netcraft.com/archives/2010/03/17/march_2010_web_server_survey.html"&gt;Apache&lt;/a&gt; e a linguagem de programação o &lt;a href="http://www.langpop.com/"&gt;PHP&lt;/a&gt;. 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 &lt;a href="http://www.cakephp.org"&gt;framework preferido&lt;/a&gt; também não é diferente.&lt;/p&gt;
&lt;p&gt;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.&lt;br /&gt;
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.&lt;/p&gt;
&lt;p&gt;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.&lt;br /&gt;
E você, o que acha sobre a importância do software livre e dos padrões abertos para o desenvolvimento Web?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DoppUEVOZ6Ig:NW_a7hlwA48:yIl2AUoC8zA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DoppUEVOZ6Ig:NW_a7hlwA48:7Q72WNTAKBA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DoppUEVOZ6Ig:NW_a7hlwA48:D7DqB2pKExk"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/5WqHDKQ532c" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Sat, 20 Mar 2010 14:48:08 +0000</pubDate>
 <dc:creator>KISS - souÁgil</dc:creator>
 <guid isPermaLink="false">4903 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Optionable Behavior</title>
 <link>http://www.eberfdias.com/blog/optionable-behaviour/327/</link>
 <description>&lt;p&gt;The Optionable Behavior is a CakePHP behavior that tries to bring something from schemaless databases to RDBMS databases like MySQL. With it, you can add as much extra fields as you need to a table without touching the DB design / schema.&lt;/p&gt;
&lt;p&gt;So, how do I use it?&lt;br /&gt;
Actually, we will store extra data on another table so, first of all, you need to create this auxiliary table:&lt;/p&gt;
&lt;p&gt;CREATE TABLE IF NOT EXISTS `options` (&lt;br /&gt;
  `id` int(11) NOT NULL auto_increment,&lt;br /&gt;
  `model` varchar(32) NOT NULL,&lt;br /&gt;
  `related_id` int(11) NOT NULL,&lt;br /&gt;
  `opt_key` varchar(32) NOT NULL,&lt;br /&gt;
  `opt_value` text NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`),&lt;br /&gt;
  KEY `opt_key` (`opt_key`)&lt;br /&gt;
);&lt;/p&gt;
&lt;p&gt;If you can’t have a new table named ‘options’, don’t worry. Just name it something else. Now you need to create the model file for this table. Something like this should be enough:&lt;/p&gt;
&lt;p&gt;class Option extends AppModel { }&lt;/p&gt;
&lt;p&gt;If you are using a different table name, don’t forget to change the class name to whatever other name you have for it. Now you can download the behavior file &lt;a href="http://gist.github.com/334181"&gt;here&lt;/a&gt;. Place it under your behaviors folder.&lt;br /&gt;
Now what?&lt;br /&gt;
Let’s pretend that you have a model named &lt;strong&gt;Blog&lt;/strong&gt; which has three columns on it’s table: id, title and content. Generally, if I want to extend this table, I’ll have to deal with it’s schema, but using the Optionable Behavior, things get really easy. Imagine that I want to add my &lt;strong&gt;mood&lt;/strong&gt; and the &lt;strong&gt;current weather&lt;/strong&gt; to some posts on the blog. I just have to do something like this:&lt;/p&gt;
&lt;p&gt;public $actsAs = array(&lt;br /&gt;
	'Optionable' =&amp;gt; array(&lt;br /&gt;
		'model' =&amp;gt; 'Option',&lt;br /&gt;
		'fields' =&amp;gt; array('mood', 'weather'),&lt;br /&gt;
		'emptyFields' =&amp;gt; true&lt;br /&gt;
	)&lt;br /&gt;
);&lt;/p&gt;
&lt;p&gt;Now I can just put those extra keys on a form, save some data and that is it. The data will be retrieved from the database just like if they were from the Blog’s schema itself.&lt;br /&gt;
See that we have three configuration keys to the behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;model&lt;/strong&gt;: defaults to ‘Option’. Just define this if you are using a different table name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fields&lt;/strong&gt;: no default. Here you can define every optional field that you want to use in your model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;emptyFields&lt;/strong&gt;: defaults to true. If true, even if that option is not registered on the auxiliary table, the key will be present on the data array.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This behavior tries it’s best to make every optional field feels like a native one. This means that you can save, validate and retrieve optional data just like you would with common fields. We are working to make it possible to filter data by optional fields as well.&lt;br /&gt;
A great benefit of using this behavior is that you can store different data types on the DB seamlessly. Every data is serialized before getting saved to the table. That means that you can store arrays, objects and other data types not natively supported by RDBMSs without having any trouble converting them as they come and go.&lt;br /&gt;
Well, I guess this is it. If you have any idea on how to make this work any better, please, share with us! Here is the code:&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/t-84DrdjlW8" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Fri, 19 Mar 2010 22:27:53 +0000</pubDate>
 <dc:creator>Éber Freitas Dias</dc:creator>
 <guid isPermaLink="false">4892 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Easy sorting with CakePHP</title>
 <link>http://www.eberfdias.com/blog/easy-sorting-with-cakephp/265/</link>
 <description>&lt;p&gt;Hey guys!&lt;br /&gt;
Here is a simple function that helps me to sort elements in a MySQL database by it’s ID’s:&lt;/p&gt;
&lt;p&gt;If that is usefull to you, let me know!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/Xda7DIVEeIc" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Fri, 19 Mar 2010 19:42:26 +0000</pubDate>
 <dc:creator>Éber Freitas Dias</dc:creator>
 <guid isPermaLink="false">4887 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Lentidão com acesso a SSH</title>
 <link>http://blog.ftgoncalves.com/2010/02/lentidao-com-acesso-a-ssh/</link>
 <description>&lt;p&gt;Decidi fazer esse pequeno guia para quem usa conexão ssh e enfrenta uns 10 segundos para poder digitar a senha de acesso ssh. O problema está relacionado com o DNS, onde o OpenSSH tenta negociar com o servidor. Resolvendo:&lt;br /&gt;
Edite o arquivo:&lt;br /&gt;
/etc/ssh/sshd_config&lt;br /&gt;
Caso o parametro&lt;br /&gt;
#UseDNS no&lt;br /&gt;
esteja comentado, retire o ‘#’. Caso não esteja, adicione no fim do arquivo, salve e reinicie o ssh.&lt;br /&gt;
sudo /etc/init.d/ssh restart&lt;br /&gt;
Pronto, lentidão resolvida.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/FRLIuLbaDdw" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Sun, 28 Feb 2010 15:56:58 +0000</pubDate>
 <dc:creator>Felipe Theodoro</dc:creator>
 <guid isPermaLink="false">4751 at http://planetcakephp.org</guid>
</item>
<item>
 <title>Migrando para o CakePHP 1.3</title>
 <link>http://feedproxy.google.com/~r/kiss-keepitsimple/~3/SVy23ixRFpg/</link>
 <description>&lt;p&gt;&lt;a href="http://buzzvolume.com/compartilhar?url%3Dhttp://kiss.souagil.com.br/2010/02/migrando-para-o-cakephp-1-3/"&gt;&lt;/a&gt;&lt;br /&gt;
A maioria já deve saber que o &lt;a href="http://bakery.cakephp.org/articles/view/cakephp-1-3-0-beta-has-landed"&gt;CakePHP está com a versão 1.3 do framework em estado beta&lt;/a&gt;. 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 &lt;a href="http://github.com/cakephp/cakephp1x/downloads"&gt;download&lt;/a&gt; e fui direto para a página que contém a descrição das &lt;a href="http://cakephp.lighthouseapp.com/projects/42648/13"&gt;principais mudanças da versão 1.2 para a 1.3&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Principais mudanças do CakePHP 1.3&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adicionadas configurações específicas do &lt;strong&gt;config/core.php&lt;/strong&gt; para quem utiliza o &lt;strong&gt;PHP 5.3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;O arquivo &lt;strong&gt;webroot/index.php&lt;/strong&gt; foi alterado, e deve ser substituído em sua aplicação&lt;/li&gt;
&lt;li&gt;Recomenda-se que todos os métodos e classes deprecados não sejam mais utilizados&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Admin routes&lt;/strong&gt; foram removidas por uma configuração mais geral, chamada &lt;strong&gt;routes prefix&lt;/strong&gt;. O route prefix admin pode ser definido com a linha
&lt;p&gt;Configure::write('Routing.prefixes', array('admin'));&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;O método de remoção no modelo agora é único,
&lt;p&gt;Model::delete()&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;O Model teve os métodos métodos &lt;strong&gt;findAll()&lt;/strong&gt;, &lt;strong&gt;findCount()&lt;/strong&gt; e &lt;strong&gt;findNeighbours()&lt;/strong&gt; removidos&lt;/li&gt;
&lt;li&gt;Os diretórios &lt;strong&gt;css&lt;/strong&gt;, &lt;strong&gt;js&lt;/strong&gt; e &lt;strong&gt;img&lt;/strong&gt; foram removidos dos diretórios &lt;strong&gt;app/vendors&lt;/strong&gt; e &lt;strong&gt;plugin/vendors&lt;/strong&gt; e substituídos com os diretórios plugin e theme no webroot&lt;/li&gt;
&lt;li&gt;Somente a variável
&lt;p&gt;$title_for_layout&lt;/p&gt;
&lt;p&gt; poderá ser definida para o título da página, tanto no &lt;strong&gt;Controller&lt;/strong&gt; quanto na &lt;strong&gt;View&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Deve-se selecionar o ponto da aplicação desejado para &lt;strong&gt;dump de sql&lt;/strong&gt; quando o &lt;strong&gt;debug&lt;/strong&gt; está definido para &lt;strong&gt;2&lt;/strong&gt;, utilizando a linha de código
&lt;p&gt;echo $this-&amp;gt;element('sql_dump');&lt;/p&gt;
&lt;p&gt; em qualquer ponto da aplicação&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SessionHelper&lt;/strong&gt; e &lt;strong&gt;SessionComponent&lt;/strong&gt; 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&lt;/li&gt;
&lt;li&gt;A função
&lt;p&gt;SessionComponent::setFlash()&lt;/p&gt;
&lt;p&gt; teve seu segundo parâmetro alterado para usar um &lt;strong&gt;element&lt;/strong&gt; e não um &lt;strong&gt;layout&lt;/strong&gt;. Para alterar sua aplicação primeiro mova seus layouts para a pasta de elements e renomeie a variável&lt;/p&gt;
&lt;p&gt;$content_for_layout&lt;/p&gt;
&lt;p&gt; para&lt;/p&gt;
&lt;p&gt;$message&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Não existe mais o nível 3 de debug&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PaginatorHelper&lt;/strong&gt; agora produz a saída dos métodos
&lt;p&gt;prev(); next(); first(); last();&lt;/p&gt;
&lt;p&gt; englobada por&lt;/p&gt;
&lt;p&gt; e não&lt;/p&gt;
&lt;p&gt; para tornar a estilização mais fácil&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Os métodos
&lt;p&gt;dateTime(); year(); month(); day(); minute(); meridian(); select();&lt;/p&gt;
&lt;p&gt; do &lt;strong&gt;FormHelper&lt;/strong&gt; não possuem mais o parâmetro&lt;/p&gt;
&lt;p&gt;$showEmpty&lt;/p&gt;
&lt;p&gt;, e agora utilizam&lt;/p&gt;
&lt;p&gt;$attributes['empty']&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
FormHelper::submit()&lt;br /&gt;
 agora pode criar outros inputs além de &lt;strong&gt;type=submit&lt;/strong&gt;. Para isso utilize a option &lt;strong&gt;type&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FormHelper::button()&lt;/p&gt;
&lt;p&gt; agora cria elementos &lt;strong&gt;button&lt;/strong&gt; ao invés de &lt;strong&gt;inputs reset&lt;/strong&gt;. Para criar inputs de reset, utilize&lt;/p&gt;
&lt;p&gt;FormHelper::submit()&lt;/p&gt;
&lt;p&gt; com o parâmetro &lt;strong&gt;option&lt;/strong&gt; definindo &lt;strong&gt;‘type’ =&amp;gt; ‘reset’&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;O método
&lt;p&gt;FormHelper::create()&lt;/p&gt;
&lt;p&gt; não cria mais elementos &lt;strong&gt;fieldset&lt;/strong&gt; escondidos, agora &lt;strong&gt;substituídos por divs&lt;/strong&gt; escondidas, o que ajuda na validação de HTML 4&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;No &lt;strong&gt;HtmlHelper&lt;/strong&gt; os métodos
&lt;p&gt;link(); para(); div(); tag()&lt;/p&gt;
&lt;p&gt; não pussuem mais o parâmetro&lt;/p&gt;
&lt;p&gt;$escape&lt;/p&gt;
&lt;p&gt;, que foi substituído por&lt;/p&gt;
&lt;p&gt;$options['escape']&lt;/p&gt;
&lt;p&gt;. Similarmente os métodos&lt;/p&gt;
&lt;p&gt;meta(); css()&lt;/p&gt;
&lt;p&gt; tiveram o parâmetro&lt;/p&gt;
&lt;p&gt;$inline&lt;/p&gt;
&lt;p&gt; substituído por&lt;/p&gt;
&lt;p&gt;$options['inline']&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Agora as chamadas a
&lt;p&gt;$session-&amp;gt;flash()&lt;/p&gt;
&lt;p&gt; não são mais auto-exibidas, sendo necessário adicionar&lt;/p&gt;
&lt;p&gt;echo&lt;/p&gt;
&lt;p&gt; antes da chamada a função, como em qualquer método de helper&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavascriptHelper&lt;/strong&gt; e &lt;strong&gt;AjaxHelper&lt;/strong&gt; estão deprecados, e agora deve-se utilizar o &lt;strong&gt;JsHelper&lt;/strong&gt; em conjunto com o &lt;strong&gt;HtmlHelper&lt;/strong&gt;.
&lt;p&gt;$javascript-&amp;gt;link()&lt;/p&gt;
&lt;p&gt; agora é&lt;br /&gt;
$html-&amp;gt;script()&lt;br /&gt;
, e&lt;br /&gt;
$javascript-&amp;gt;codeBlock()&lt;br /&gt;
 é&lt;/p&gt;
&lt;p&gt;$html-&amp;gt;scriptBlock()&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href="http://cakephp.lighthouseapp.com/projects/42648/13"&gt;migração do 1.2 para o 1.3&lt;/a&gt; está a lista completa. Verifique nessa se alguma mudança afeta as suas aplicações.&lt;/p&gt;
&lt;p&gt;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.&lt;br /&gt;
Bom, é isso, espero ter ajudado. Na próxima vamos dar uma olhada nas novidades do Cake 1.3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Posts relacionados:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://kiss.souagil.com.br/2009/12/gerando-html-4-01-com-o-html-helper-do-cakephp/" rel="bookmark" /&gt;Gerando HTML 4.01 com o HTML Helper do CakePHP"&amp;gt;Gerando HTML 4.01 com o HTML Helper do CakePHP&lt;/a&gt;  Apesar das melhorias introduzidas no HTMLHelper do CakePHP 1.2,...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kiss.souagil.com.br/2010/04/lib-para-lidar-com-arquivos-zip-no-cakephp/" rel="bookmark" /&gt;Lib para lidar com arquivos Zip no CakePHP"&amp;gt;Lib para lidar com arquivos Zip no CakePHP&lt;/a&gt; Em um projeto recente, precisei extrair arquivos zip no server,...&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DSVy23ixRFpg:r9iaZPfQe-0:yIl2AUoC8zA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DSVy23ixRFpg:r9iaZPfQe-0:7Q72WNTAKBA"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kiss-keepitsimple?a%3DSVy23ixRFpg:r9iaZPfQe-0:D7DqB2pKExk"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/Q8G9z1pkM0Q" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Mon, 22 Feb 2010 16:39:06 +0000</pubDate>
 <dc:creator>KISS - souÁgil</dc:creator>
 <guid isPermaLink="false">4685 at http://planetcakephp.org</guid>
</item>
<item>
 <title>CakePHP – Função para verificar registros únicos</title>
 <link>http://blog.flyonthe.net/cakephp/cakephp-funcao-para-verificar-registros-unicos/</link>
 <description>&lt;p&gt;Como todos sabem o isUnique do cake pode ser um pouco chato quando queremos verificar por vários campos ao mesmo tempo. Existe uma função que normalmente é utilizada, está pelas páginas do google, seu nome é checkUnique. Este POST, traz essa função aprimorada, visto que a função original não aceita que seja fornecido pares de [...]&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet-cakephp-aggregator-portuguese/~4/tNBgrK5KZOc" height="1" width="1"/&gt;</description>
 <category domain="http://planetcakephp.org/aggregator/languages/portuguese">Português</category>
 <pubDate>Thu, 14 Jan 2010 01:19:01 +0000</pubDate>
 <dc:creator>Felipe K. De Boni</dc:creator>
 <guid isPermaLink="false">4306 at http://planetcakephp.org</guid>
</item>
</channel>
</rss>
