<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Léo Hackin 0.2c &#187; dica</title>
	<atom:link href="http://www.leohackin.com.br/tag/dica/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.leohackin.com.br</link>
	<description>Eternamente beta, geralmente funcional</description>
	<lastBuildDate>Wed, 21 Jul 2010 00:34:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Problema com IDs alfanuméricos no form-&gt;input (select) do CakePHP</title>
		<link>http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/</link>
		<comments>http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 05:42:58 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=211</guid>
		<description><![CDATA[Para quem já está mexendo com CakePHP a algum tempo, algumas limitações de funcionalidades podem tirar um pouco o sono de quem está muito mal acostumado com a produtividade da framework. Em geral, toda framework tem seus pontos fracos. A algum tempo, tive um problema curioso: a chave primária de uma tabela teria valores alfanuméricos. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em;"><script type="text/javascript" src="http://button.topsy.com/widget/retweet-small?url=http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/&amp;title=Problema+com+IDs+alfanum%C3%A9ricos+no+form-%3Einput+%28select%29+do+CakePHP&amp;theme=jade&amp;order=count,retweet,badge&amp;txt_tweet=tuit&amp;txt_retweet=retuit"></script></div><p>Para quem já está mexendo com CakePHP a algum tempo, algumas limitações de funcionalidades podem tirar um pouco o sono de quem está muito mal acostumado com a produtividade da framework. Em geral, toda framework tem seus pontos fracos.</p>
<p>A algum tempo, tive um problema curioso: a chave primária de uma tabela teria valores alfanuméricos. Ou seja: valores como &#8220;205-A&#8221;, &#8220;JB02&#8243; e outros bizarros seriam possíveis. Regra de negócio definida, modificação do modelo para o nome de chave fora da convenção e tudo corria bem até que populei um select.<br />
 <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Qual não foi minha surpresa em ver que o CakePHP, além de não marcar o valor correto, em certos casos ainda selecionava mais de um valor no select. #fail total.</p>
<p><span id="more-211"></span></p>
<p>Pesquisa na internet, perguntas na lista de discussão oficial do CakePHP e as respostas eram:</p>
<ul>
<li>Coisas que não tinha nada haver com o problema</li>
<li>Sugestões pra mudar a estratégia para resolver o problema</li>
<li>Gente falando que o CakePHP só trampa com valores numérico (o que de fato acontece <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</li>
</ul>
<h2>O problema</h2>
<p>Então, mexendo no código pra cima e pra baixo (sem conotações sexuais por favor) consegui achar o problema.</p>
<p>No arquivo &nbsp;cake/libs/views/helpers/form.php (cakephp 1.2.5), na linha 1710:</p>
<pre class="brush: php;">if ((!$selectedIsEmpty &amp;&amp; $selected == $name) || ($selectedIsArray &amp;&amp; in_array($name, $selected))) {</pre>
<p>Depois de fuçar e testar um pouco, vi que o problema principal na verdade é um problema com o próprio operador == do PHP: ele trata as operações entre strings e numéricos (<a href="http://php.net/manual/en/language.operators.comparison.php" target="_blank">http://php.net/manual/en/language.operators.comparison.php</a>)&nbsp;de uma forma que gera os seguintes resultados:</p>
<ul>
<li>um valor como 206-1 por exemplo, o helper casava tanto o valor 206-1 (o correto) quanto 206 (string == integer).</li>
<li>um valor como JB01 por exemplo, o helper casava tanto o valor JB01 (o correto) quanto 0 (string == integer).</li>
</ul>
<p>Devido à característica do PHP de resolver qual o tipo da variável em tempo real, ele tenta fazer o casting da variável sempre e acaba gerando resultados não esperados pra gente.</p>
<h2>Solução</h2>
<p>A solução então foi forçar (type casting) as variáveis para serem tratadas como strings. Assim, evitamos que o PHP transforme nossas variáveis em tipos distintos (no nosso caso string e integer) e consequentemente faça a comparação de valores do jeito que precisamos.</p>
<p>A linha 1710 (no <em>cakephp 1.2.5</em> ou 1748 no <em>cakephp 1.3-dev</em>) ficou assim:</p>
<pre class="brush: php;">if ((!$selectedIsEmpty &amp;&amp; (string)$selected == (string)$name) || ($selectedIsArray &amp;&amp; in_array($name, $selected))) {</pre>
<p>Note o type casting sendo feito nas variáveis $selected e $name. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Se alguem conseguir uma solução mais bacana ou encontrou outro bug bizarro do CakePHP, compartilhe! <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Simbora!</strong></p>
<p><strong>Update: <span style="font-weight: normal;">Eu tinha reportado esse erro a algum tempo no track de bugs do CakePHP &nbsp;e hoje vi que já corrigiram isso.&nbsp;</span><span style="font-weight: normal;">Então, quando sair a versão stable do cake 1.3, não precisa mais se preocupar com isso. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </span></strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica de chave do model no CakePHP</title>
		<link>http://www.leohackin.com.br/2009/06/dicas-de-chave-do-model-no-cakephp/</link>
		<comments>http://www.leohackin.com.br/2009/06/dicas-de-chave-do-model-no-cakephp/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 00:14:21 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=108</guid>
		<description><![CDATA[Estava rascunhando algumas coisas e fazendo umas melhorias num sistema na Giran, quando lembrei de duas perguntas que haviam sido feitas no 1º Workshop PHP-ES sobre CakePHP. Aproveitando que lembrei delas mas não tinha a resposta na ponta da língua, ai vai uma dica sobre chaves primárias para ser feita no model de sua app. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em;"><script type="text/javascript" src="http://button.topsy.com/widget/retweet-small?url=http://www.leohackin.com.br/2009/06/dicas-de-chave-do-model-no-cakephp/&amp;title=Dica+de+chave+do+model+no+CakePHP&amp;theme=jade&amp;order=count,retweet,badge&amp;txt_tweet=tuit&amp;txt_retweet=retuit"></script></div><p>Estava rascunhando algumas coisas e fazendo umas melhorias num sistema na <a href="http://www.giran.com.br" target="_blank">Giran</a>, quando lembrei de duas perguntas que haviam sido feitas no 1º Workshop PHP-ES sobre <a href="http://cakephp.org" target="_blank">CakePHP</a>.</p>
<p>Aproveitando que lembrei delas mas não tinha a resposta na ponta da língua, ai vai uma dica sobre chaves primárias para ser feita no model de sua app. Isso está explicito no Cookbook, mas não muito à mão para quem está começando ou nos bilhares de screencasts existentes. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Modificando a chave primária ID</strong></p>
<p>Se você está portando uma base de dados que já exista e que não segue a nomenclatura padrão do CakePHP, onde a chave primária da tabela é sempre chamada por <strong>id</strong>, utilize o atributo <strong>primaryKey</strong> do seu model para usar outro campo.</p>
<pre lang="php">class Cliente extends AppModel {

var primaryKey = "CdCliente";

}</pre>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/06/dicas-de-chave-do-model-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
