<?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>Flávio Silveira &#187; Php</title>
	<atom:link href="http://flaviosilveira.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://flaviosilveira.com</link>
	<description>Análise e Desenvolvimento web</description>
	<lastBuildDate>Mon, 06 Feb 2012 09:00:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Primeiro Encontro PHP Curitiba 2012</title>
		<link>http://flaviosilveira.com/2012/primeiro-encontro-php-curitiba-2012/</link>
		<comments>http://flaviosilveira.com/2012/primeiro-encontro-php-curitiba-2012/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 15:34:16 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[comunidade php]]></category>
		<category><![CDATA[eventos php]]></category>
		<category><![CDATA[php curitiba]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=460</guid>
		<description><![CDATA[Fala Pessoal! Com bastante orgulho estou organizando o primeiro encontro da comunidade de PHP Curitiba nesse ano de 2012. A ideia não é apenas um encontro. O objetivo é inspirado nos encontros que tem acontecido do grupo PHPSP em São Paulo, que levam o nome de PHPub. Após acompanhar o feedback e interesse do pessoal [...]]]></description>
			<content:encoded><![CDATA[<p>Fala Pessoal!</p>
<p>Com bastante orgulho estou organizando o primeiro encontro da comunidade de PHP Curitiba nesse ano de 2012.</p>
<p>A ideia não é apenas um encontro. O objetivo é inspirado nos encontros que tem acontecido do grupo PHPSP em São Paulo, que levam o nome de PHPub. Após acompanhar o feedback e interesse do pessoal via twitter, pensei em trazer isso para cá e com isso reforçar o nosso grupo em Curitiba.</p>
<p>Nesses encontros, além do networking, o objetivo é que todo mundo cresça como profissional, aprendendo, discutindo e resolvendo assuntos pertinentes do dia a dia de trabalho. Para isso o formato escolhido é uma pequena palestra, ou apresentação para iniciar a reunião e após isso abrir para discussões e apontamentos do restante do grupo.</p>
<p>O local será o Tienda Café, que fica em uma região central da Cidade e por isso deve facilitar o acesso. Aqui o link da página do facebook deles para quem quiser conhecer <a title="Facebook Tienda café" href="http://www.facebook.com/pages/Tienda-Caf%C3%A9/200759713268850">http://www.facebook.com/pages/Tienda-Caf%C3%A9/200759713268850</a>.</p>
<p>Para esse primeiro encontro o principal objetivo é conhecer os interessados e que o pessoal traga suas ideias para adicionar a esse evento. Vamos decidir a frequência e também como incentivar o pessoal a comparecer e participar mais da comunidade.</p>
<p>A coisa promete! Algumas empresas já entraram em contato comigo tanto para patrocínios como para fazer do evento uma formação de bons profissionais e com isso melhorar o mercado de PHP aqui na região. Vamos conversar sobre isso também!</p>
<p>Para isso tudo ser um sucesso a comunidade PHP Curitiba conta com você!</p>
<p>O encontro vai acontecer no dia 11 de Janeiro, quarta feira. A chegada será entre 19:30 e 20:00 horas.<br />
O Tienda café fica na Rua Fernando Simas número 27, na Praça da Espanha, confira pelo google maps <a title="Tienda Café Endereço" href="http://goo.gl/2YMyZ">http://goo.gl/2YMyZ</a>.</p>
<p>Deixo aqui meu telefone para quem quiser entrar em contato direto comigo para qualquer dúvida ou eventualidade (41) 9117-9862.</p>
<p><strong>UPDATE</strong></p>
<p>Inicialmente o encontro estava programado para o ser no Tizz café, mas eles vão estar de férias até o dia 12 de Janeiro. Por isso mudamos o local. O Tienda café é praticamente do lado do Tizz, então o destino não mudou em nada.</p>
<p>Grande Abraço! Espero vocês lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2012/primeiro-encontro-php-curitiba-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Screencast &#8211; Começando Bem com Zend Framework</title>
		<link>http://flaviosilveira.com/2011/screencast-comecando-bem-com-zend-framework/</link>
		<comments>http://flaviosilveira.com/2011/screencast-comecando-bem-com-zend-framework/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 21:05:16 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[Palestras]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[Screencast]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend tool]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=449</guid>
		<description><![CDATA[Salve pessoal! Gravei esse screencast baseado no mini-curso/palestra que estive apresentando durante esse ano com o título de Começando bem com Zend Framework. O vídeo não tem edição, foi gravado direto, sem roteiro. Por isso peço desculpas se acabei atropelando alguma explicação ou se algo não ficar muito claro para alguém, principalmente para iniciantes. Da forma [...]]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://player.vimeo.com/video/34341638" width="600" height="500" frameborder="0"></iframe></p>
<p>Salve pessoal!</p>
<p>Gravei esse screencast baseado no mini-curso/palestra que estive apresentando durante esse ano com o título de <em>Começando bem com Zend Framework</em>.</p>
<p>O vídeo não tem edição, foi gravado direto, sem roteiro.<br />
Por isso peço desculpas se acabei atropelando alguma explicação ou se algo não ficar muito claro para alguém, principalmente para iniciantes. Da forma como foi finalizado acabou ficando mais voltado para quem já tem um conhecimento com outros frameworks ou um conhecimento legal de PHP.</p>
<p>Dúvidas? Perguntas? Sugestões? Estamos aí.<br />
Aguardo o feedback de todos.<br />
Grande Abraço!</p>
<p><strong>Alguns Links que aparecem no screencast</strong></p>
<ul>
<li><a title="Download Zend Framework" href="http://framework.zend.com/download/current/">Download Zend &#8211; http://framework.zend.com/download/current/</a><strong><br />
</strong></li>
<li><a title="SlideShare Flávio Silveira" href="http://www.slideshare.net/flavioaugustosilveira/minicurso-zend">Slideshare.net - http://www.slideshare.net/flavioaugustosilveira/minicurso-zend</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2011/screencast-comecando-bem-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Codeigniter 2 &#8211; Templates e Layouts</title>
		<link>http://flaviosilveira.com/2011/codeigniter-2-templates-e-layouts/</link>
		<comments>http://flaviosilveira.com/2011/codeigniter-2-templates-e-layouts/#comments</comments>
		<pubDate>Thu, 26 May 2011 18:51:28 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Layouts]]></category>
		<category><![CDATA[Template engine]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=350</guid>
		<description><![CDATA[Fala pessoal! O que mais gera acessos aqui no Blog são os artigos sobre Codeigniter, e principalmente a parte de layouts. É o artigo Habilitando Layouts no CodeIgniter (Template Engine) que está dividido em parte 1 e parte 2. Como esse artigo tem mais de um ano, resolvi dar um upgrade nele com algumas observações. Desde [...]]]></description>
			<content:encoded><![CDATA[<p>Fala pessoal!</p>
<p>O que mais gera acessos aqui no Blog são os artigos sobre Codeigniter, e principalmente a parte de layouts. É o artigo <em>Habilitando Layouts no CodeIgniter (Template Engine)</em> que está dividido em <a href="http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/">parte 1</a> e <a href="http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/">parte 2</a>.</p>
<p>Como esse artigo tem mais de um ano, resolvi dar um upgrade nele com algumas observações.</p>
<p>Desde que ele foi escrito temos algumas novidades. A principal dela é  o lançamento de uma versão crítica do Codeigniter. Mas não se preocupe, a mecânica do artigo continua funcionando.<br />
Apenas atente para alguns detalhes.</p>
<p>Preste atenção para a parte do seu controller:</p>
<ul>
<li>Agora ele extende da classe CI_Controller e não mais da classe Controller.</li>
<li>Agora você não tem de ter mais um método construtor com o mesmo nome da classe. Pode arrancar fora aquilo sem medo.</li>
</ul>
<p>Outros:</p>
<ul>
<li>No tutorial anterior há uma correção porque eu tratava minha pasta system diferente do convencional. Com a ajuda e os comentários de vocês, foi feita uma correção que está no final do post. Agora na versão 2 está tudo ok. A pasta system vem separada da pasta application.</li>
<li>Na versão 2 temos agora arquivos .htaccess, arquivos de configuração, dentro das pastas application e da pasta system. Dentro deles há uma regra para recusar qualquer coisa que tentar acessar a pasta. Certifique-se que, em caso de colocar seus arquivos de estilo, ou seus arquivos javascript dentro de application por exemplo, alterar essa regra no .htaccess.</li>
</ul>
<p>Então você pode seguir normalmente o tutorial, apenas adapte os detalhes citados acima.<br />
Está com dificuldades ou preguiça? <a href="http://flaviosilveira.com/wp-content/uploads/2011/05/ci2exemplo1.zip">Clique aqui para baixar um exemplo com Layouts em cima do Codeigniter 2</a>.</p>
<p>É isso galera. Abraço!!</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2011/codeigniter-2-templates-e-layouts/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mini Curso sobre Zend Framework em Curitiba</title>
		<link>http://flaviosilveira.com/2011/mini-curso-sobre-zend-framework-em-curitiba/</link>
		<comments>http://flaviosilveira.com/2011/mini-curso-sobre-zend-framework-em-curitiba/#comments</comments>
		<pubDate>Tue, 17 May 2011 21:02:57 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[noticias]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=340</guid>
		<description><![CDATA[Salve pessoal. Para quem ainda não está sabendo, no dia 31 de Maio e 1 de Junho irá acontecer aqui em Curitiba o PHP Day. Ele acontecerá das 08:00h as 18:00h no SERPRO, que fica na Rua Carlos Pioli, 133. A grade de programação é composta de 8 palestras de 50 minutos cada, ministradas por [...]]]></description>
			<content:encoded><![CDATA[<p>Salve pessoal.</p>
<p>Para quem ainda não está sabendo, no dia 31 de Maio e 1 de Junho irá acontecer aqui em Curitiba o PHP Day. Ele acontecerá das 08:00h as 18:00h no SERPRO, que fica na Rua Carlos Pioli, 133.</p>
<p>A grade de programação é composta de 8 palestras de 50 minutos cada, ministradas por membros da comunidade PHP e do quadro de desenvolvedores do SERPRO. Além das palestras serão ministrados alguns mini cursos, e, dentre esses, um que estarei ministrando.</p>
<p>É um mini curso voltado para quem quer conhecer ou migrar para o Zend Framework e não tem nenhum conhecimento em cima dele. O objetivo é diminuir a curva de aprendizado do mesmo e mostrar uma maneira interessante e rápida de organizar e produzir seus projetos.</p>
<p>Você sairá com uma boa base sobre a ferramenta. Vamos construir um exemplo de um sistema modular, buscar e alterar informações no banco de dados e utilizar algumas de suas poderosas classes.</p>
<p>Abaixo segue os tópicos abordados:</p>
<ul>
<li>Frameworks: O que são e para que usar?</li>
<li>Frameworks: Como eles estão ajudando a ensinar Orientação a objetos e Padrões de projetos.</li>
<li>Quando usar Zend Framework? Quando não usar ?</li>
<li>Configurações e instalação</li>
<li>O Bé a Bá do Zend</li>
<li>MVC</li>
<li>A Zend Tool</li>
<li>Controller / View / Layouts</li>
<li>Model e o Banco de dados</li>
<li>Módulos</li>
<li>Forms</li>
<li>Outras Classes e alguns exemplos</li>
<li>O que vem agora?</li>
</ul>
<p>Não vai poder estar presente? Não se preocupe, a organização do evento irá transmitir as palestras por VideoStreming.</p>
<p>Para mais informações acesse <a href="http://serpro.phpday.com.br/">http://serpro.phpday.com.br/</a> e <a href="http://www.phpday.com.br/projects/php-day-serpro/wiki">http://www.phpday.com.br/projects/php-day-serpro/wiki</a></p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2011/mini-curso-sobre-zend-framework-em-curitiba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>o FOR além do FOR &#8211; PHP</title>
		<link>http://flaviosilveira.com/2010/o-for-alem-do-for-php/</link>
		<comments>http://flaviosilveira.com/2010/o-for-alem-do-for-php/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 11:55:30 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[For]]></category>
		<category><![CDATA[laços de repetição]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=283</guid>
		<description><![CDATA[Salve pessoal! O Post que trago hoje trata de algo bem simples mas que pode não ser muito comum para algumas pessoas. São usos não muito populares de um de nossos laços de repetição, o FOR. Quando estamos aprendendo uma linguagem, bem no início, os manuais parecem mais nos confundir do que ajudar. O que [...]]]></description>
			<content:encoded><![CDATA[<p>Salve pessoal!</p>
<p>O Post que trago hoje trata de algo bem simples mas que pode não ser muito comum para algumas pessoas.<br />
São usos não muito populares de um de nossos laços de repetição, o FOR.</p>
<p>Quando estamos aprendendo uma linguagem, bem no início, os manuais parecem mais nos confundir do que ajudar.<br />
O que fazemos ??  Saímos em busca de uma comunicação mais direta em Blogs ou Sites.</p>
<p>Essas fontes resolvem nosso problema mais podem acabar deixando alguns vácuos quando se trata de estruturas básicas, como é o caso do FOR.</p>
<p>E sobre o FOR eu te pergunto o seguinte:<br />
Você sabia que os parâmetros passados para ele são opcionais ??<br />
Você sabia que pode passar quantas variáveis quiser para os parâmetros ??</p>
<p>Se já sabe maravilha, caso não, vamos ver como isso funciona.</p>
<p><span id="more-283"></span></p>
<p>Nesse primeiro exemplo temos nosso FOR comum, como todos aprendemos:</p>
<pre class="brush: php; title: ;">
&lt;?php

        for($i = 0; $i &lt; 5; $i++)
        {
                echo $i;
                echo '&lt;br /&gt;';
        }
</pre>
<p>Nesse segundo exemplo, retiramos o primeiro parâmetro do FOR, e deixamos a variável $i definida fora do laço:<br />
Repare que o resultado que vai sair na tela, vai ser o mesmo do exemplo anterior.</p>
<pre class="brush: php; title: ;">
&lt;?php

        $i = 0;

        for(; $i &lt; 5; $i++)
        {
                echo $i;
                echo '&lt;br /&gt;';
        }
</pre>
<p>Agora, vmaos tirar o terceiro parâmetro, e incrementar a variável dentro do laço.</p>
<pre class="brush: php; title: ;">
&lt;?php

        $i = 0;

        for(; $i &lt; 5;)
        {
                echo $i;
                echo '&lt;br /&gt;';
                $i++;
        }
</pre>
<p>Por último, vamos retirar o segundo parâmetro.</p>
<pre class="brush: php; title: ;">
&lt;?php

        $i = 0;

        for(; ; )
        {
                echo $i;
                echo '&lt;br /&gt;';

                if($i == 5)
                {
                        break;
                }

                $i++;
        }
</pre>
<p>Repare que em todos esses exemplos acima, fugimos do Loop infinito com alguma condição ou mecanismo que colocamos dentro do laço. Tome cuidado. Esse último exemplo se não for feito nada dentro do laço, gera facilmente um Loop infinito.</p>
<p>Outra opção que temos é usar mais de uma variável para cada parâmetro.<br />
Confira:</p>
<pre class="brush: php; title: ;">
&lt;?php

        $w = 2;

        for($i = 1, $j = 9; $j &gt; 0; $j - $i, $w*=2)
        {
                echo $w;
                echo '&lt;br /&gt;';
        }
</pre>
<p>Vamos analisar o exemplo acima.<br />
Definimos para o loop a variável <em>$i</em> e a variável <em>$j</em>.<br />
O segundo parâmetro, que define até quando nosso loop vai rodar, nos mostra que será enquanto <em>$j</em> for maior que zero.<br />
E no último parâmetro, definimos que a cada volta <em>$j</em> vai diminuir o valor de <em>$i</em>, e que <em>$w</em>, que é uma variável que está definida fora do loop, será multiplicada por 2.<br />
Dentro do loop, pedimos para exibir <em>$w</em>.<br />
Faça o teste. Confira a saída.</p>
<p>Com esses exemplos acredito que já conseguimos absorver mais usos do que aquele que estamos acostumados do FOR. Todos eles são tratados na <a href="http://br.php.net/manual/pt_BR/control-structures.for.php">documentação</a> e também tem uns exemplos bem bacanas nos comentários dela que valem a pena olhar.</p>
<p>E aí você me pergunta… &#8220;E um uso prático disso?? Uma situação real ??&#8221;</p>
<p>De cara assim não consigo dar uma resposta, um exemplo.<br />
Mas com isso eu lembro de uma entrevista que um dos melhores guitarristas do mundo, Yngwie Malmsteen, deu há alguns anos para a Guitar Player americana. Ele disse:<br />
<em>&#8220;As pessoas falam que eu sou muito técnico e etc. Mas eu preciso conhecer a técnica para fazer virar música. Assim como um escritor deve conhecer várias palavras para escrever um livro&#8230;&#8221;</em></p>
<p>Pense nisso!<br />
Devemos conhecer as possibilidades que a linguagem nos dá, e assim ficamos preparados para montar as lógicas que cruzarem nosso caminho.</p>
<p>Grande Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/o-for-alem-do-for-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JQuery / JQuery Validation / Síncrono e Assíncrono / CPF único no banco de dados / Ajax Síncrono com JQuery</title>
		<link>http://flaviosilveira.com/2010/jquery-jquery-validation-sincrono-e-assincrono-cpf-unico-no-banco-de-dados-ajax-sincrono-com-jquery/</link>
		<comments>http://flaviosilveira.com/2010/jquery-jquery-validation-sincrono-e-assincrono-cpf-unico-no-banco-de-dados-ajax-sincrono-com-jquery/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 07:21:37 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[assíncrono]]></category>
		<category><![CDATA[cpf]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery validation]]></category>
		<category><![CDATA[síncrono]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=268</guid>
		<description><![CDATA[Salve pessoal. Hoje trago um artigo pesado e extenso, mas acredito que vá ajudar o pessoal que precisar em várias frentes. Vou Tratar aqui de JQuery, JQuery Validation, a diferença entre síncrono e assíncrono, como fazer ajax síncrono usando JQuery e também soluções para problemas em um dia de trabalho no mundo do desenvolvimento. Bom, [...]]]></description>
			<content:encoded><![CDATA[<p>Salve pessoal.</p>
<p>Hoje trago um artigo pesado e extenso, mas acredito que vá ajudar o pessoal que precisar em várias frentes. Vou Tratar aqui de JQuery, JQuery Validation, a diferença entre síncrono e assíncrono, como fazer ajax síncrono usando JQuery e também soluções para problemas em um dia de trabalho no mundo do desenvolvimento.</p>
<p>Bom, que o JQuery é um dos frameworks mais usados para javascript e que facilita muito a sua vida você já deve saber. E que o plugin para JQuery, JQuery Validation, é uma excelente maneira de validar seus formulários do lado cliente, você também deveria saber.</p>
<p>Veja um exemplo:</p>
<pre class="brush: xml; title: ;">

&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.validate.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;

function init()
{
	$(&quot;#form&quot;).validate({
		rules:
		{
			nome:{required: true},
			senha:{required: true, minlength: 5}
                }
	});
}

$(document).ready(init);

&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;

&lt;form id=&quot;form&quot;&gt;

	&lt;p&gt;
		&lt;label for=&quot;nome&quot;&gt;Nome&lt;/label&gt;
		&lt;input type=&quot;text&quot; name=&quot;nome&quot; id=&quot;nome&quot; /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;label for=&quot;senha&quot;&gt;Senha&lt;/label&gt;
		&lt;input type=&quot;password&quot; name=&quot;senha&quot; id=&quot;senha&quot; /&gt;
	&lt;/p&gt;

&lt;/form&gt;

&lt;/body&gt;
</pre>
<p><span id="more-268"></span><br />
Com essas poucas linhas você já tem um formulário com campo obrigatório para nome e campo obrigatório para senha exigindo um mínimo 5 caractéres.Ao não seguir qualquer uma das regras, o plugin insere uma Label com uma mensagem de erro.</p>
<p>Você tem opções para personalizar essa mensagem, além de outras várias opções oferecidas pelo plugin.<br />
Você pode dar uma conferida nessas opções pela <a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/">documentação e exemplos no site oficial do plugin aqui</a>.</p>
<p><strong>Primeiro Problema</strong></p>
<p>O plugin JQuery Validation é gringo; Internacional se você preferir assim dizer.<br />
Na sua condição de estrangeiro, ele não conhece o que é CPF.<br />
Ele não tem um método para entrada e validação de CPF, o que é muito comum nos formulários de cadastro aqui no Brasil.</p>
<p>Por sorte, o JQuery validation tem uma maneira muito fácil de você inserir novos métodos a ele.<br />
Com uma rápida busca na internet chegamos em vários blogs que nos trazem a solução, como é o caso do <a href="http://www.tidbits.com.br/">TidBits</a>  escrito pelo <a href="http://twitter.com/maktuiu">Danilo Augusto</a>, que falou sobre isso em seu post <a href="http://www.tidbits.com.br/colecao-de-metodos-para-o-plugin-validate-do-jquery">Coleção de métodos para o plugin validate do Jquery</a>.</p>
<p>Primeiro vamos adicionar um campo para o CPF.<br />
Vamos também separar o arquivo .js para ficar mais organizado a coisa toda, separando o que é Html do que é javascript.</p>
<p>Nosso Html vai ficar assim:</p>
<pre class="brush: xml; title: ;">

&lt;script src=&quot;jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;jquery.validate.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;!-- default.js será o arquivo separado do javaScript --&gt;
&lt;script src=&quot;default.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;

&lt;form id=&quot;form&quot;&gt;

	&lt;p&gt;
		&lt;label for=&quot;nome&quot;&gt;Nome&lt;/label&gt;
		&lt;input type=&quot;text&quot; name=&quot;nome&quot; id=&quot;nome&quot; /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;label for=&quot;senha&quot;&gt;Senha&lt;/label&gt;
		&lt;input type=&quot;password&quot; name=&quot;senha&quot; id=&quot;senha&quot; /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;label for=&quot;cpf&quot;&gt;CPF&lt;/label&gt;
		&lt;input type=&quot;text&quot; name=&quot;cpf&quot; id=&quot;cpf&quot; /&gt;
	&lt;/p&gt;

&lt;/form&gt;
</pre>
<p>Ok, adicionamos o Input para o CPF em nosso HTML.<br />
Agora vamos adicionar o método para o Jquery Validation no nosso arquivo default.js, seguindo o exemplo que pegamos no <a href="http://www.tidbits.com.br/colecao-de-metodos-para-o-plugin-validate-do-jquery">Blog do Danilo</a>.</p>
<pre class="brush: jscript; title: ;">

function init()
{
	$(&quot;#form&quot;).validate({
		rules:
		{
			nome:{required: true},
			senha:{required: true, minlength: 5}
	       }
	});
}

jQuery.validator.addMethod(&quot;verificaCPF&quot;, function(value, element) {
value = value.replace('.','');
value = value.replace('.','');
cpf = value.replace('-','');
while(cpf.length &lt; 11) cpf = &quot;0&quot;+ cpf;
var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
var a = [];
var b = new Number;
var c = 11;
for (i=0; i&lt;11; i++){
	a[i] = cpf.charAt(i);
	if (i &lt; 9) b += (a[i] * --c);
}
if ((x = b % 11) &lt; 2) { a[9] = 0 } else { a[9] = 11-x }
b = 0;
c = 11;
for (y=0; y&lt;10; y++) b += (a[y] * c--);
if ((x = b % 11) &lt; 2) { a[10] = 0; } else { a[10] = 11-x; }
if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) return false;
return true;
}, &quot;Informe um CPF válido.&quot;);

$(document).ready(init);
</pre>
<p>Agora falta chamar o método para o seu campo.<br />
Para isso adicione a seguinte validação no seu código javascript:</p>
<pre class="brush: jscript; title: ;">
$(&quot;#form&quot;).validate({
	rules:
	{
		nome:{required: true},
		senha:{required: true, minlength: 5},
		cpf:{required: true, verificaCPF: true}
       }
});
</pre>
<p>Repare:<br />
Chamamos o método verificaCPF, e passamos o valor que queremos, no caso, true para que seja um CPF válido.<br />
Faça seus testes.</p>
<p><strong>Segundo Problema</strong></p>
<p>Legal! Temos o formulário validando, inclusive com um campo de CPF, sem muito trabalho pois estamos contando com o JQuery Validation. Mas então nos surgi outro problema. No seu banco de dados você tem um campo onde CPF tem de ser único.</p>
<p>E para ajudar seu usuário, além de mostrar se o CPF é válido ou não, você quer mostrar se é um CPF cadastrado ou não.<br />
E então, como fazemos ?</p>
<p>Para pesquisas no banco de dados sem refresh na página a resposta é fácil não? Ajax!<br />
Mas como juntar isso no Jquery validation?</p>
<p>Você conhecendo a <a href="http://api.jquery.com/category/ajax/">facilidade do Ajax no Jquery</a>, pode sair logo de cara transformando o seu método de validação de CPF para o seguinte:</p>
<pre class="brush: jscript; title: ;">
jQuery.validator.addMethod(&quot;verificaCPF&quot;, function(value, element) {

value = value.replace('.','');
value = value.replace('.','');
cpf = value.replace('-','');

while(cpf.length &lt; 11) cpf = &quot;0&quot;+ cpf;
var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
var a = [];
var b = new Number;
var c = 11;

for (i=0; i&lt;11; i++)
{
	a[i] = cpf.charAt(i);
	if (i &lt; 9) b += (a[i] * --c);
}

if ((x = b % 11) &lt; 2) { a[9] = 0 } else { a[9] = 11-x }

b = 0;
c = 11;

for (y=0; y&lt;10; y++) b += (a[y] * c--);

if ((x = b % 11) &lt; 2) { a[10] = 0; } else { a[10] = 11-x; }

if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) return false;

var verifica = false;
$.get('verificaCpf.php', {cpf : cpf}, function(data){
	if(data == 0) verifica = true;
});

if(!verifica) return false;

return true;
}, &quot;CPF inválido ou já cadastrado!&quot;);
</pre>
<p>Vamos ver o que foi feito aqui. Acompanhe da linha 30 em diante.<br />
Adicionamos uma variável dentro do nosso método chamada <em>&#8220;verifica&#8221;</em>, e definimos o valor de false para ela.</p>
<p>Em seguida fazemos uma chamada para um arquivo PHP através de Ajax.<br />
Esse arquivo PHP deve fazer uma consulta no seu banco de dados pelo CPF digitado.<br />
Por ser algo simples de fazer e para não estender ainda mais esse post ,não vou tratar desse código PHP aqui.</p>
<p>Para entendimento, basta saber que nosso código PHP retorna o número de linhas onde encontrou aquele CPF.<br />
Esse valor vai vir para o javascript pela variável data.<br />
Repare que é feito uma comparação na resposta do Ajax, que, caso o número de linhas encontradas no banco seja 0, mudamos a variável para true. E fim do Ajax.</p>
<p>Em seguida, verificamos a variável <em>&#8220;verifica&#8221;</em>.<br />
Se ela for diferente de verdadeira, o método verificaCPF retorna false e será acusado erro em seu formulário.</p>
<p>Ufa! Certo. Vamos testar?<br />
Problemas acontecem não? Está sempre retornando erro.<br />
O que está acontecendo?</p>
<p><strong>Terceiro Problema</strong></p>
<p>Vamos entender:<br />
Seu código PHP é chamado. Ele vai lá no banco de dados, faz a consulta e está retonando o resultado.<br />
Mas enquanto isso, o código javascript já continuou sua execução, e quando a resposta do ajax chegar, a execução do método terá acabado. Com isso ele vai retornar o valor que tinha na variável, false.</p>
<p>Isso acontece, pois o ajax padrão do JQuery, como foi usado acima, é assíncrono.<br />
Você está se perguntando o que é isso? Vou tentar ser claro.<br />
É o fato de não importar quando a resposta do ajax vai vir. Não precisar de sincronismo, compreende?</p>
<p>Porém veja que esse é exatamente o nosso problema aqui. Precisamos desse sincronismo.<br />
Precisamos da resposta do nosso Ajax antes de continuar a execução do código.</p>
<p>Como fazer?<br />
Vamos fazer o Ajax Síncrono.<br />
A execução do javascript só pode continuar depois da resposta do ajax.</p>
<p>Procurando pela internet, achei alguns desenvolvedores falando que não é possível fazer ajax síncrono com JQuery. Isso não é verdade. É uma das primeiras coisas que <a href="http://api.jquery.com/jQuery.ajax/">encontramos na documentação</a>. </p>
<p>Veja como fazer:</p>
<pre class="brush: jscript; title: ;">
jQuery.ajax({
	    url: 'verifica_cpf.php?cpf='+cpf,
	    async: false,
	    success: function(data) {
	       if(data == 0) verifica = true;
	   }});
</pre>
<p>Passando o valor false para a propiedade async do ajax, temos nosso ajax síncrono.<br />
Repare que o código segue o padrão JQuery e é fácil de entender.<br />
Ao invés de passar as variáveis em uma propiedade, as adicionei no padrão GET diretamente na url.<br />
Uma opção a isso seria usar a propiedade data.</p>
<p>Substituindo esse trecho de código no lugar do nosso ajax assíncrono anterior, temos nosso problema corrigido.</p>
<p>Uma observação importante, é você reparar que a execução dá página dá uma travada enquanto espera a resposta do javascript. Fique atento para não deixar de dar uma resposta em situações de erro ou sucesso. Caso contrário sua página vai ficar travada nesse ponto.</p>
<p><strong>Quarto problema</strong></p>
<p>Não não…brincadeira… hahaha</p>
<p>Legal! Acredito que chegamos finalmente ao final.<br />
Dúvidas? Dicas para melhorar todo esse processo? Não deixem de comentar pessoal…<br />
Grande Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/jquery-jquery-validation-sincrono-e-assincrono-cpf-unico-no-banco-de-dados-ajax-sincrono-com-jquery/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>PodCast &#8211; Desenvolvimento Mobile Web</title>
		<link>http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/</link>
		<comments>http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 21:04:24 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[Desenvolvimento Mobile]]></category>
		<category><![CDATA[Jquery Mobile]]></category>
		<category><![CDATA[PHP Sc Conf]]></category>
		<category><![CDATA[PodCast]]></category>
		<category><![CDATA[Site Mobile]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=254</guid>
		<description><![CDATA[Salve Galera! Hoje deixo aqui o meu podcast relatando minha ida ao PHP SC Conf (http://www.phpsc.com.br/) neste ano de 2010, falando principalmente dos assuntos colocados pelo Bruno Fernandes (@porkaria) em sua palestra Desenvolvimento Mobile Web. No Podcast: PHP SC Conf Identificação do dispositivo mobile Disparo de SMS Novo Marketing QR Code Ferramentas Web para Mobile [...]]]></description>
			<content:encoded><![CDATA[<p>Salve Galera!<br />
Hoje deixo aqui o meu podcast relatando minha ida ao <a href="http://www.phpsc.com.br/">PHP SC Conf</a> (<a href="http://www.phpsc.com.br/">http://www.phpsc.com.br/</a>) neste ano de 2010, falando principalmente dos assuntos colocados pelo <a href="http://www.porkaria.com.br/">Bruno Fernandes</a> (@porkaria) em sua palestra <em>Desenvolvimento Mobile Web</em>.</p>
<p>No Podcast:</p>
<ul>
<li>PHP SC Conf</li>
<li>Identificação do dispositivo mobile</li>
<li>Disparo de SMS</li>
<li>Novo Marketing</li>
<li>QR Code</li>
<li>Ferramentas Web para Mobile</li>
<li>Conteúdo de um site Mobile</li>
<li>Outros</li>
</ul>
<p>A trilha sonora é da Banda <a href="http://www.myspace.com/auraaor">Auras</a> aqui de Curitiba.<br />
Mais abaixo você tem os links para acompanhar melhor o Cast.</p>
<p>Links:<br />
Tera-WURFL &#8211; <a href="http://www.tera-wurfl.com/wiki/index.php/Main_Page">http://www.tera-wurfl.com/wiki/index.php/Main_Page</a><br />
W3C Mobile &#8211; <a href="http://www.w3.org/Mobile">http://www.w3.org/Mobile</a><br />
Bruno @Porkaria &#8211; <a href="http://www.porkaria.com.br/">http://www.porkaria.com.br/</a><br />
Gerando QRCode com PHP -<a href="http://www.porkaria.com.br/2010/04/24/gerando-qr-code-com-php/">http://www.porkaria.com.br/2010/04/24/gerando-qr-code-com-php/</a><br />
PHP Mobile &#8211; <a href="http://www.phpmobile.com.br">http://www.phpmobile.com.br/</a><br />
JQuery Mobile &#8211; <a href="http://jquerymobile.com/">http://jquerymobile.com/</a><br />
WordPress Mobile &#8211; <a href="http://wordpress.org/extend/plugins/wordpress-mobile-edition/">http://wordpress.org/extend/plugins/wordpress-mobile-edition/</a></p>
<p><a href="http://wordpress.org/extend/plugins/wordpress-mobile-edition/"></a><br />
Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</title>
		<link>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/</link>
		<comments>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 08:15:37 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[facilidade]]></category>
		<category><![CDATA[framework php]]></category>
		<category><![CDATA[Layouts]]></category>
		<category><![CDATA[mozart petter]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[Template engine]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=153</guid>
		<description><![CDATA[Atenção!! Este artigo foi escrito em cima da versão 1 do Codeigniter. Para detalhes de como usar com a versão 2 do framework clique aqui. Continuando a parte 1 deste post. Se você perdeu a primeira parte clique aqui para ler a primeira parte. 5 &#8211; Construindo sua View Sua View deve ser feita normalmente, [...]]]></description>
			<content:encoded><![CDATA[<div id="atencao">
<p>Atenção!! Este artigo foi escrito em cima da versão 1 do Codeigniter. Para detalhes de como usar com a versão 2 do framework <a href="http://flaviosilveira.com/2011/codeigniter-2-templates-e-layouts">clique aqui</a>.</p>
</div>
<p>Continuando a parte 1 deste post.<br />
Se você perdeu a primeira parte <a href="http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1">clique aqui para ler a primeira parte</a>.</p>
<p><strong>5 &#8211; Construindo sua View</strong></p>
<p>Sua View deve ser feita normalmente, como voce já está acostumado a fazer, com o nome que você colocaria normalmente.<br />
Apenas com o conteúdo que muda de uma página para outra.</p>
<p>O HTML que você colocar aqui na View irá substituir a variável <em>{content_for_layout}</em> que definimos no layout acima.<br />
Vou colocar nessa nossa view de exemplo apenas um título e um parágrafo para demonstrar.<br />
Ficando assim:</p>
<pre class="brush: xml; title: ;">

&lt;h1&gt;Titulo VIEW&lt;/h1&gt;

&lt;p&gt;Paragrafo teste teste teste teste.&lt;/p&gt;
</pre>
<p>Chamei essa view de <em>home.php</em>.</p>
<p><strong>6 &#8211; Desenvolvendo a Classe</strong></p>
<p>Quando definimos nosso Hook no passo 2, setamos que a pasta onde ficaria nossa classe seria a pasta hooks que vem por padrão no projeto do CodeIgniter.</p>
<p>Vamos criar nossa classe dentro dessa pasta, e, com o nome que também especificamos na definição do Hook que foi Layout.php<br />
Se você não seguiu o exemplo, faça suas devidas adaptações.</p>
<p>A classe é um pouco extensa, leia com atenção.<br />
Para ajudar ela está com os comentários do próprio <a href="http://www.mozartpetter.com/pt/">Mozart Petter</a>.<br />
<span id="more-153"></span></p>
<pre class="brush: php; title: ;">
// Padrao do CI para não acessar a Classe direto pelo Browser
&lt;?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Layout Class
 *
 * @package hooks
 * @description Implementa as views do tipo layout no framework.
 */

class Layout
{

public $base_url;

/**
* Metodo que executa as implementacoes.
* Este metodo e chamado atraves do arquivo hooks.php
* na pasta config.
*
* @return
*/
public function init()
{
// Instancia do CI.
$CI =&amp; get_instance();

// Definindo o base_url.
$this-&gt;base_url = $CI-&gt;config-&gt;slash_item('base_url');

// Pegando a saida que o CI gera normalmente.
$output = $CI-&gt;output-&gt;get_output();

// Pegando o valor de title, se definido no controller.
$title = (isset($CI-&gt;title)) ? $CI-&gt;title : '';

// Links CSS definidos no controlador.
$css = (isset($CI-&gt;css)) ? $this-&gt;createCSSLinks($CI-&gt;css) : '';

// Links JS definidos no controlador.
$js = (isset($CI-&gt;js)) ? $this-&gt;createJSLinks($CI-&gt;js) : '';

// Se layout estiver definido e a regexp nao bater.
if (isset($CI-&gt;layout) &amp;&amp; !preg_match('/(.+).php$/', $CI-&gt;layout))
{
$CI-&gt;layout .= '.php';
}
else
{
$CI-&gt;layout = 'default.php';
}

// Definindo caminho completo do layout.
$layout = LAYOUTPATH . $CI-&gt;layout;

// Se o layout for diferente do default, e o arquivo nao existir.
if ($CI-&gt;layout !== 'default.php' &amp;&amp; !file_exists($layout))
{
// Exibe a mensagem, se o layout for diferente de '.php'.
if ($CI-&gt;layout != '.php') show_error(&quot;You have specified a invalid layout: &quot; . $CI-&gt;layout);
}

// Se o arquivo layout existir.
if (file_exists($layout))
{
// Carrega o conteudo do  arquivo.
$layout = $CI-&gt;load-&gt;file($layout, true);

// Substitui o texto {content_for_layout} pelo valor de output em layout.
$view = str_replace('{content_for_layout}', $output, $layout);

// Substitui o texto {title_for_layout} pelo valor de title em view.
$view = str_replace('{title_for_layout}', $title, $view);

// Links CSS.
$view = str_replace('{css_for_layout}', $css, $view);

// Links JS.
$view = str_replace('{js_for_layout}', $js, $view);
}
else
{
$view = $output;
}

echo $view;
}

/**
* Gera os links CSS utilizados no layout.
*
* @return void
*/
private function createCSSLinks($links)
{
$html = &quot;&quot;;

for ($i = 0; $i &lt; count($links); $i++)
{
$html .= &quot;&lt;link rel='stylesheet' type='text/css' href='&quot; . $this-&gt;base_url . CSSPATH . $links[$i] . &quot;.css' media='screen' /&gt;n&quot;;
}

return $html;

}

/**
* Gera os links JS utilizados no layout.
*
* @return void
*/
private function createJSLinks($links)
{
$html = &quot;&quot;;

for ($i = 0; $i &lt; count($links); $i++)
{
$html .= &quot;&lt;script type='text/javascript' src='&quot; . $this-&gt;base_url . JSPATH . $links[$i] . &quot;.js'&gt;&lt;/script&gt; n&quot;;
}

return $html;
}

}
</pre>
<p><strong>7 &#8211; Fazendo as chamadas no Controller</strong></p>
<p>Chegou o momento final!<br />
É hora de juntar tudo isso que fizemos até agora.</p>
<p>A construção do seu controller é normal, como você está acostumado, mas temos que inserir algumas variáveis globais nele.</p>
<ul>
<li>Uma para o Layout default do controller, para que você não precise fazer a mesma definição várias vezes.</li>
<li>Uma para o título, onde você pode definir um default para todos as páginas que vão surgir desse controller mas, o interessante é estar um título por página.</li>
<li>Outra para guardar um Array dos CSS&#8217;s que você vai usar na página.</li>
<li>E por último, outro Array para guardar os JavaScripts que você vai usar na página.</li>
</ul>
<p>Vejamos como fica.<br />
Acompanhe pelos comentários.</p>
<pre class="brush: php; title: ;">

&lt;?php

/**
 *
 */
class Principal extends Controller
{

/**
* Layout default utilizado pelo controlador.
*/
public $layout = 'default';

/**
* Titulo default.
*/
public $title = '::: Titulo default :::';

/**
* Definindo os css default.
*/
public $css = array('default');

/**
* Carregando os js default.
*/
public $js = array('home');

/**
* Construtora.
* @return
*/
function Principal()
{

parent::Controller();

}

// Metodoo index
function index()
{
// Carregando a view.
$this-&gt;load-&gt;view('home');
}

// Metodo teste
function teste()
{
//Title
$this-&gt;title = '::: TESTE Título :::';

//CSS
$this-&gt;css = array('test');

//JS
$this-&gt;js = array('jquery');

// Carregando a View
$this-&gt;load-&gt;view('teste');
}

}

?&gt;
</pre>
<p>Vamos reparar no seguinte.<br />
Há dois métodos nesse controller que vão chamar páginas diferentes, o index e o teste.</p>
<p>Para o index não definimos nada de Layout, Titulo, CSS ou JS.<br />
Ou seja, vai vir tudo do valor default que usamos quando definimos as variáveis globais.</p>
<p>Já no método teste, por algum motivo precisamos de um CSS, um JS e um Título diferente.<br />
Então redefinimos esses valores no nosso método com o que precisamos.</p>
<p>A gente poderia ter definido um outro Layout caso tivesse a necessidade, da mesma forma com que fiz com esses valores.<br />
Aí, claro, teria que criar um outro Layout na pasta layouts.</p>
<hr />
<p><span id="explicacao"> </span><br />
<strong>UPDATE 20 DE NOVEMBRO DE 2010</strong><br />
Detalhe importante observado pelo <a href="http://diegofelix.com.br/">Diego Felix</a> (<a href="http://twitter.com/diegofelix">@diegofelix</a>), que comentou esse detalhe abaixo nos comentários, no dia 16 de setembro desse mesmo ano.</p>
<p>&nbsp;</p>
<p>Eu tenho como costume em meus projetos com CI, retirar a pasta system no qual ele vem por padrão.<br />
Faço então a alteração da variável <em>$system_folder</em> no arquivo de configuração e tudo segue sem problemas.</p>
<p>Exceto esse tutorial, que não leva em consideração essa pasta system.<br />
Você tem duas opções para consertar isso:</p>
<p><strong>Primeiro:</strong><br />
No local onde são definidas as variáveis contantes, adicionar sua pasta system antes de <em>$application_folder</em>.<br />
Exemplo: <em>define(&#8216;LAYOUTPATH&#8217;,  &#8216;system/&#8217; . $application_folder.&#8217;/layouts/&#8217;);</em></p>
<p>Particularmente acho essa solução acima atrasada, por deixar o projeto estático.<br />
Se ocorrer de você alterar a pasta system, terá que alterar nesse local também. Chato.</p>
<p><strong>Segundo:</strong><br />
Seguindo essa linha de raciocínio, de não deixar o projeto estático, prefiro fazer o seguinte:<br />
No local onde são definidas as variáveis constantes, adicionar a variável <em>$system_folder</em>.<br />
Exemplo: <em>define(&#8216;LAYOUTPATH&#8217;, $system_folder . &#8216;/&#8217; . $application_folder.&#8217;/layouts/&#8217;);</em></p>
<p>Mas há um detalhe.<br />
No arquivo <em>index.php</em>, em torno da linha 53, é adicionado a variável <em>$system_folder</em> o seu caminho completo do servidor. Isso, claro, vai gerar problemas para o projeto.<br />
O que eu faço então é pegar as variáveis constantes que usam a pasta system, e jogar antes desse bloco.<br />
Se você seguir pelo projeto exemplo, verá que as coloquei logo depois do comentário <em>&#8220;END OF USER CONFIGURABLE SETTINGS&#8221;</em>.</p>
<p>Feito isso, caso você altera sua pasta system, basta alterar no local de sempre para o projeto continuar funcionando.</p>
<hr />
<p>Pessoal é isso!<br />
Fazia tempo que queria escrever sobre isso, espero que ajude a galera por aí.<br />
Dúvidas podem mandar sem problemas, vou responder no que estiver a meu alcance.</p>
<p>Se você teve dificuldades, <a title="Baixar projeto Exemplo" href="http://flaviosilveira.com/wp-content/uploads/2010/02/projetoExemplo.zip">baixe o projeto pronto aqui</a> e dê uma olhada mais de perto.</p>
<p>Agradeço novamente ao <a title="Mozart Petter Developer" href="http://www.mozartpetter.com/pt/">Mozart Petter</a>, grande Brother, que implementou essa solução que uso até hoje em meus projetos. E, como sempre, também ao pessoal que garante minhas 30 visitas diárias, Valeu!</p>
<p>É isso pessoal.<br />
Até a próxima!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1</title>
		<link>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/</link>
		<comments>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 08:00:45 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[facilidade]]></category>
		<category><![CDATA[framework php]]></category>
		<category><![CDATA[Layouts]]></category>
		<category><![CDATA[mozart petter]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[Template engine]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=145</guid>
		<description><![CDATA[Atenção!! Este artigo foi escrito em cima da versão 1 do Codeigniter. Para detalhes de como usar com a versão 2 do framework clique aqui. Vejo muitos desenvolvedores criticarem o CodeIgniter por ele não utilizar o conceito de Layout ou ter um Template Engine dentro dele. Template engine ou o conceito Layouts , falando em [...]]]></description>
			<content:encoded><![CDATA[<div id="atencao">
<p>Atenção!! Este artigo foi escrito em cima da versão 1 do Codeigniter. Para detalhes de como usar com a versão 2 do framework <a href="http://flaviosilveira.com/2011/codeigniter-2-templates-e-layouts">clique aqui</a>.</p>
</div>
<p>Vejo muitos desenvolvedores criticarem o CodeIgniter por ele não utilizar o conceito de Layout ou ter um Template Engine dentro dele.</p>
<p>Template engine ou o conceito Layouts , falando em um exemplo rápido e prático seria mais ou menos o seguinte:<br />
Pense que você tem um topo e um rodapé que nunca mudam no seu portal.<br />
Ou seja, muda apenas o meio das páginas. Veja a figura abaixo.</p>
<p><img class="alignnone size-full wp-image-345" title="Screen shot 2011-05-20 at 2.22.38 PM" src="http://flaviosilveira.com/wp-content/uploads/2010/02/Screen-shot-2011-05-20-at-2.22.38-PM.png" alt="" width="239" height="217" /><br />
<br style="clear: both;" /><br />
E aí? Você vai ter que colocar esse topo e esse rodapé em todas as páginas que você chamar?<br />
Ou você é malandro e vai fazer um include dentro das telas?<br />
<span id="more-145"></span><br />
O Include seria uma solução interessante mais uma Template Engine faria isso sozinho para você.</p>
<p>Pra quem não conhece nenhuma solução para isso, o <a href="http://www.smarty.net/">Smarty</a> é uma template Engine das mais conhecidas no mundo do PHP.<br />
Você tem uma lista com outras sugestões de Templates Engine nesse link da <a href="http://www.webresourcesdepot.com/19-promising-php-template-engines/">web Resources</a><br />
Outros frameworks como o CakePHP tem uma solução dentro dele que faz esse trabalho.</p>
<p>Nesses tempos que desenvolvo em CodeIgniter já vi bizarrices do tipo colocar o Smarty dentro do CodeIgniter ou trazer bibliotecas de outras frameworks para o Core do CodeIgniter.</p>
<p>Mas podemos estender o Core do Framework e fazer ele trabalhar junto com a gente sem precisar de muitas manobras e malabarismos. Na documentação do CodeIgniter achamos essa prática com o nome de Hooks ou se preferir o português ganchos.</p>
<p>Há alguns anos um cara que considero um dos Gurus do desenvolvimento, <a href="http://www.mozartpetter.com/pt/">Mozart Petter</a>, o qual tive a honra de trabalhar junto, pesquisou uma solução nesse sentido para que não precisássemos abandonar o CodeIgniter.</p>
<p>Você encontra vários links pesquisando no google por Layouts in CodeIgniter, onde destaco o seguinte Blog <a href="http://hasin.wordpress.com/2007/03/05/adding-yield-codeigniter/">http://hasin.wordpress.com/2007/03/05/adding-yield-codeigniter/</a></p>
<p>Abaixo vou colocar uma solução em 7 passos para você implementar isso em seu projeto de CI.<br />
É importante que você procure entender em cada passo como o CodeIgniter vai visualizar isso tudo.<br />
<em>*Não se deixe confundir. É fácil. Se ficar difícil há algo errado, volte e reveja os passos.</em></p>
<p>Como os códigos são muito extensos, vou dividir em dois posts.<br />
Parte 1 &#8211; Esse (passo 1 ao 4) e Parte 2 (passo 5 ao 7) que você <a href="http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2">acessa aqui</a>.</p>
<p>Para quem não estiver com muita paciência, estou disponibilizando também um exemplo pronto de tudo funcionando que você pode <a href="http://flaviosilveira.com/wp-content/uploads/2010/02/projetoExemplo.zip">baixar aqui</a>.<br />
Apenas confira se o .htaccess serve para o seu servidor ou máquina.</p>
<p><strong>DETALHE IMPORTANTE:</strong><br />
Esse projeto de exemplo foi atualizado no dia 20 de novembro de 2010. Sugestão do <a href="http://diegofelix.com.br/">Diego Felix</a> (<a href="http://twitter.com/diegofelix">@diegofelix</a>).<br />
Confira a explicação da alteração no final da segunda parte ou <a href="http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/#explicacao">clicando aqui</a>.</p>
<p><strong>1 &#8211; Habilitando o Codeigniter para estender o Core</strong></p>
<p>A primeira coisa a fazer é habilitar o codeIgniter para estender o Core, permitir os hooks.<br />
Isso é feito no arquivo config.php dentro da pasta config.<br />
Procure a variável $config['enable_hooks'] e troque seu valor para TRUE, ficando como abaixo.</p>
<pre class="brush: php; title: ;">
/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the &quot;hooks&quot; feature you must enable it by
| setting this variable to TRUE (boolean).  See the user guide for details.
|
*/
$config['enable_hooks'] = TRUE;
</pre>
<p>Pronto! Próximo passo.</p>
<p><strong>2 &#8211; Definindo um Hook</strong></p>
<p>Dentro da pasta config temos um arquivo onde deve ser feitas as definições dos hooks que você quer utilizar.<br />
É o arquivo hooks.php. Para cada hook é preciso definir um array com alguns parâmetros para que o CodeIgniter saiba o que fazer.</p>
<p><em>Importante:</em> O índice do array vai funcionar apenas como nome do seu hook. Você não vai usá-lo em nenhum lugar a princípio.</p>
<p>Para o nosso Hook vamos definir.</p>
<ul>
<li> O nome da Classe que você precisa.</li>
<li> O nome do método da classe que você deseja chamar.</li>
<li> O nome do arquivo onde está desenvolvida a classe.</li>
<li> O directório onde ela se encontra.</li>
</ul>
<p>Fica da seguinte forma:</p>
<pre class="brush: php; title: ;">
$hook['display_override'][] = array('class' =&gt; 'Layout',
'function' =&gt; 'init',
'filename' =&gt; 'Layout.php',
'filepath' =&gt; 'hooks');
</pre>
<p>Esses itens podem variar de acordo com o que você quiser ou precisar fazer.<br />
O manual é uma grande referência para te ajudar com isto e traz alguns detalhes que não abordo aqui.</p>
<p>Certo! Você habilitou e definiu um Hook, ou gancho. Vamos para o próximo passo.</p>
<p><strong>3 &#8211; Adicionando algumas constantes necessárias</strong></p>
<p>No arquivo index da aplicação são definidas algumas constantes que ajudam no desenvolvimento da nossa aplicação, como por exemplo,<br />
a extensão dos arquivos que serão usados, constante EXT, e o BASEPATH que traz o caminho da pasta do sistema.</p>
<p>Vamos adicionar aqui mais 3 constantes que vai nos facilitar lá na frente quando formos fazer nossa classe.</p>
<ul>
<li> LAYOUTPATH &#8211; Caminho onde ficará os layouts que construirmos.</li>
<li> JSPATH &#8211; Caminho onde ficará os arquivos com javascript.</li>
<li> CSSPATH &#8211; Caminho onde ficará os arquivos de estilo. CSS.</li>
</ul>
<p>Ficando da seguinte forma:</p>
<pre class="brush: php; title: ;">
/*
|---------------------------------------------------------------
| DEFINE APPLICATION CONSTANTS
|---------------------------------------------------------------
|
| EXT		- The file extension.  Typically &quot;.php&quot;
| SELF		- The name of THIS file (typically &quot;index.php&quot;)
| FCPATH	- The full server path to THIS file
| BASEPATH	- The full server path to the &quot;system&quot; folder
| APPPATH	- The full server path to the &quot;application&quot; folder
|
*/
define('EXT', '.php');
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
define('FCPATH', str_replace(SELF, '', __FILE__));
define('BASEPATH', $system_folder.'/');
define('LAYOUTPATH', $application_folder.'/layouts/');
define('JSPATH', $application_folder . '/js/');
define('CSSPATH', $application_folder . '/css/');
</pre>
<p>Reparem que usei a variável <em>$application_folder</em>, que é definida no mesmo arquivo, para completar o caminho das minhas constantes.<br />
Você pode e deve mudar isso de acordo com seu projeto.</p>
<p>Essas constantes vão facilitar também para caso você precise mudar o caminho dos arquivos CSS por exemplo. Basta alterar aqui.</p>
<p><strong>4 &#8211; Construindo seu Layout</strong></p>
<p>Vamos agora construir o seu Layout.<br />
Seria aquele topo e aquele rodapé que você não quer mexer. Ou um menu lateral.<br />
Você pode construir o que quiser.</p>
<p>O local onde vamos criar nossos layouts foi definido na constante LAYOUTPATH.</p>
<p>Você pode ter quantos layouts quiser e nomeá-los como quiser.<br />
Mas quando formos construir a classe você verá que definimos um Layout default para quando nenhum for chamado.<br />
É esse que vamos criar agora. default.php</p>
<p>No exemplo abaixo eu criei um topo que tem um menu e um rodapé simples.</p>
<pre class="brush: xml; title: ;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot;
&quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;

&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot;&gt;
&lt;title&gt;{title_for_layout}&lt;/title&gt;

{css_for_layout}
        	{js_for_layout}

&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;geral&quot;&gt;

&lt;div id=&quot;topo&quot;&gt;
&lt;ul id=&quot;menu&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;div id=&quot;meio&quot;&gt;

{content_for_layout}

&lt;/div&gt;

&lt;br style=&quot;clear: both;&quot; /&gt;

&lt;div id=&quot;rodape&quot;&gt;
&lt;p class=&quot;rodape&quot;&gt;
Todos os direitos reservados - Bla Bla Bla
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>É necessário prestar atenção em 4 variáveis que deixamos soltas no meio desse HTML do Layout.</p>
<ul>
<li> Primeira &#8211; {title_for_layout}</li>
<li> Segunda &#8211; {css_for_layout}</li>
<li> Terceira &#8211; {js_for_layout}</li>
<li> Quarta &#8211; {content_for_layout}</li>
</ul>
<p>Explicando rapidamente:<br />
Essas Strings vão ser substituídas de acordo com o que definirmos no Controller em um próximo passo.</p>
<p>No lugar de {title_for_layout} irá o título da página. É legal podermos definir um título pelo controlador para deixá-lo dinâmico e assim ajudar no SEO.</p>
<p>No lugar de {css_for_layout} e {js_for_layout} entrarão os arquivos de CSS e JavaScript que definirmos para nossa página.<br />
Você não precisa chamar todos os CSS ou JavaScripts se não for usá-los. Essa é uma grande sacada dessa solução.<br />
Lembro de pegar projetos em Smarty onde estavão definidos inúmeros JavaScripts e CSS em um top.php onde em várias páginas eles nem era usados.</p>
<p>Por último, no lugar de {content_for_layout} irá o conteúdo da nossa View.<br />
É o meio, o que muda.<br />
É o que vamos fazer no próximo passo que está no <a href="http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2">próximo post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Comparando Arrays e Trazendo os valores diferentes</title>
		<link>http://flaviosilveira.com/2009/comparando-arrays-e-trazendo-os-valores-diferentes/</link>
		<comments>http://flaviosilveira.com/2009/comparando-arrays-e-trazendo-os-valores-diferentes/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 16:03:23 +0000</pubDate>
		<dc:creator>flaviosilveira</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[arrays]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=120</guid>
		<description><![CDATA[Salve pessoal. Ontem precisei comparar os resultados de dois arrays e deles trazer os valores que estavam em apenas um dos arrays. A princípio procurei uma função que fizesse isso pra mim, achei que o array_diff fizesse isso para a gente. Mas me enganei! Não achei uma função com esse resultado. A função array_diff na [...]]]></description>
			<content:encoded><![CDATA[<p>Salve pessoal.</p>
<p>Ontem precisei comparar os resultados de dois arrays e deles trazer os valores que estavam em apenas um dos arrays.</p>
<p>A princípio procurei uma função que fizesse isso pra mim, achei que o <em>array_diff</em> fizesse isso para a gente. Mas me enganei! Não achei uma função com esse resultado.</p>
<p>A função <em>array_diff</em> na verdade traz apenas os valores que constam no primeiro array, mas não constam no segundo.<br />
Exemplo:</p>
<pre class="brush: php; title: ;">
&lt;?php

$array1 = array(&quot;bola&quot;, &quot;quadrado&quot;, &quot;triangulo&quot;);
$array2 = array(&quot;esfera&quot;, &quot;quadrado&quot;, &quot;triangulo&quot;);

$result = array_diff($array1, $array2);
print_r($result);

?&gt;
</pre>
<p>O resultado do código acima nos retorna um array com o valor &#8220;bola&#8221;.<br />
Pois é o único valor que consta no primeiro array e não no segundo.<br />
<span id="more-120"></span></p>
<p>O que eu precisava é que ele me retornasse também os valores que tinham no segundo array e que não constavam no primeiro.</p>
<p>Resolvi da seguinte forma:</p>
<pre class="brush: php; title: ;">
&lt;?php

$array1 = array(&quot;bola&quot;, &quot;quadrado&quot;, &quot;triangulo&quot;);
$array2 = array(&quot;esfera&quot;, &quot;quadrado&quot;, &quot;triangulo&quot;);

$result1 = array_diff($array1, $array2);
$result2 = array_diff($array2, $array1);

$full = array_merge($result1, $result2);

print_r($full);

?&gt;
</pre>
<p>Primeiro fazemos retornar os valores que estão no primeiro array e não no segundo ($result1).<br />
Em seguida os que estão no segundo array e não no primeiro ($result2).<br />
Após isso unimos os dois arrays através da função <em>array_merge</em>.</p>
<p>E o resultado retornado é [0] => bola  [1] => esfera, como esperado.<br />
Bola que está apenas no primeiro array, e esfera que está apenas no segundo.<br />
Os demais valores aparecem em ambos os arrays, logo, ficam de fora.</p>
<p>Adicionem outros elementos aos arrays para testar e confiram os resultados.</p>
<p>Grande Abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/comparando-arrays-e-trazendo-os-valores-diferentes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

