<?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; Flávio Silveira</title>
	<atom:link href="http://flaviosilveira.com/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://flaviosilveira.com</link>
	<description>Programação &#38; Desenvolvimento</description>
	<lastBuildDate>Thu, 02 Sep 2010 21:29:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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>Flávio Silveira</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 [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/' rel='bookmark' title='Permanent Link: Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript'>Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/' rel='bookmark' title='Permanent Link: ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone'>ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone</a></li>
</ul></div>]]></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.<br />
[Audio clip: view full post to listen]</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>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/' rel='bookmark' title='Permanent Link: Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript'>Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/' rel='bookmark' title='Permanent Link: ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone'>ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hello World em AIR com Adobe Flash Builder</title>
		<link>http://flaviosilveira.com/2010/hello-world-em-air-com-adobe-flash-builder/</link>
		<comments>http://flaviosilveira.com/2010/hello-world-em-air-com-adobe-flash-builder/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 18:48:13 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[Adobe Flash Builder]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[Adobe Flex]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=232</guid>
		<description><![CDATA[Salve galera, Hoje vou mostrar um pequeno &#8220;Hello World!&#8221; no Adobe Air para quem quer começar a descobrir a ferramenta. Uma das grandes vantagens do Adobe Air é o fato de você construir programas para desktop e ele rodar em qualquer sistema operacional utilizando tecnologias conhecidas da Web como Html, Ajax e Flash. Não vou [...]

<div id=RelatedPosts>
Posts Relacionados<p class=nopost>Nenhum Post Relacionado</div>]]></description>
			<content:encoded><![CDATA[<p>Salve galera,<br />
Hoje vou mostrar um pequeno &#8220;Hello World!&#8221; no Adobe Air para quem quer começar a descobrir a ferramenta.</p>
<p>Uma das grandes vantagens do Adobe Air é o fato de você construir programas para desktop e ele rodar em qualquer sistema operacional utilizando tecnologias conhecidas da Web como Html, Ajax e Flash.<br />
Não vou me ater a detalhes pequenos da ferramenta, como linguagem que usa, onde ficam os componentes, quais são, etc. Vou levar para um lado mais prático para construirmos o exemplo de maneira rápida. Caso passe algo em branco para quem está começando por favor, é só entrar em contato.</p>
<p>Vou usar Adobe Flash Builder, que é a nova versão do Adobe Flex lançada em Março desse ano.<br />
Você pode fazer o download da ferramenta no site da Adobe <a title="Download Flash Builder" href="http://www.adobe.com/products/flashbuilder/">neste Link</a>.<br />
O Flex traz a integração com desenvolvimento para o Adobe Air desde o Flex 3.</p>
<p>Crie um novo projeto Flex clicando com o botão direito do mouse dentro da janela Package explorer selecionando <em>New &gt; Flex Project</em> como na imagem abaixo.<br />
<span id="more-232"></span><br />
<img class="size-full wp-image-233" title="new flex project" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem1.png" alt="" width="390" height="188" /><br />
<br style="clear: both;" /></p>
<p>É aberta uma janela onde você dá um nome de sua preferência para o seu projeto e seleciona o tipo da aplicação em Application type. Como nosso objetivo é o Air, selecione <em>Desktop (runs in Adobe Air)</em>. Veja a imagem.</p>
<p><img class="size-full wp-image-235" title="new project window" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem2.png" alt="new project window" width="645" height="417" /><br style="clear: both;" /><br />
Se você já tem um pouco mais de experiência com a ferramenta pode alterar o caminho do projeto e outras opções, caso contrário mantenha o padrão para não ter dor de cabeça.<br />
Após clicar em <em>Finish</em>, é criado seu projeto e aberto o arquivo principal da sua aplicação que tem o mesmo nome que você deu ao projeto.</p>
<p>Você se depara com a Aba Source onde temos o código MXML usado pelo Flex e a Aba Design que vai facilitar na montagem da cara da sua aplicação. É para lá que vamos, onde no Centro, que chamamos de palco,  temos uma preview da sua aplicação (que está em branco), e do lado direito a janela de propriedades e de aparência.</p>
<p><img class="size-full wp-image-236" title="SourceDesign" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem3.png" alt="SourceDesign" width="645" height="448" /><br />
<br style="clear: both;" /></p>
<p>Assim que você troca para o modo design na primeira vez, já vem selecionado o componente <em>Window Application</em>, que seria para o Air como a tag body para o HTML. Na lateral direita, a janela de propiedades mostra as cores do Background e do Preloader.</p>
<p>Primeiro vamos mudar a cor de fundo. Para isso, clique no branco que está na propriedade <em>Background</em>. Ao fazer isso é exibida uma color picker onde você pode escolher a cor de sua preferência. Eu fiquei com um preto.</p>
<p><img class="size-full wp-image-237" title="colorPickerWindow" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem4.png" alt="colorPickerWindow" width="551" height="495" /><br style="clear: both;" /><br />
Ao clicar em Ok você já vê a cor mudar na parte do Design.</p>
<p>Certo. Na lateral esquerda, abaixo da janela Package Explorer, temos as opções dos componentes. Eles são organizados em pastas para facilitar sua localização. Dando uma rodada por eles você encontra dentro da pasta <em>Controls</em> o componente <em>Label</em>. Confira Imagem.</p>
<p><img class="size-full wp-image-238" title="ComponentLabel" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem5.png" alt="ComponentLabel" width="317" height="392" /><br style="clear: both;" /><br />
Clique e arraste esse componente para cima da sua aplicação. Você verá um sinal de mais no Mouse indicando que será adicionado. Ao soltar o componente ali você vê um texto escrito em sua aplicação.</p>
<p>Dependendo a cor que você escolheu para o seu fundo, você não vai ver nada.<br />
A cor padrão da fonte do componente Label é preta. Você pode mudar essa cor na caixa de propriedades na lateral direita, da mesma forma que fez com o fundo. Atenção, o componente deve estar selecionado para que as propiedades dele apareçam.</p>
<p><img class="size-full wp-image-239" title="propertiesLabel" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem6.png" alt="propertiesLabel" width="287" height="515" /><br style="clear: both;" /><br />
Após mudar a cor da fonte, para branco no meu caso, já alterei o tamanho da fonte para 36 para visualizar melhor.</p>
<p>Ficando assim, confira:<br />
<img class="size-full wp-image-240" title="PreApp1" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem7.png" alt="PreApp1" width="645" height="486" /><br />
<br style="clear: both;" /></p>
<p>Agora só falta mudar o texto.<br />
Para isso você tem a opção de dar dois cliques em cima do componente ou usar a caixa <em>Text</em> na janela de propriedades. Escreva o texto de sua preferência. O componente será adaptado para o tamanho do seu texto, mas você pode facilmente alterar seu tamanho puxando seus cantos dentro do palco. Da mesma maneira você pode posicionar o componente dentro da aplicação como preferir arrastando ele com o Mouse. A minha ficou dessa forma.<br />
<img class="size-full wp-image-241" title="preApp2" src="http://flaviosilveira.com/wp-content/uploads/2010/08/Imagem-8.png" alt="preApp2" width="645" height="493" /><br />
<br style="clear: both;" /></p>
<p>Agora é salvar (Ctrl + s) e rodar a sua aplicação para ver como ela vai funcionar.<br />
Para isso Clique no botão Run (é como um Play) que fica acima da janela <em>Package Explorer</em>.</p>
<p><img class="size-full wp-image-242" title="RunApp" src="http://flaviosilveira.com/wp-content/uploads/2010/08/Imagem-9.png" alt="RunApp" width="393" height="211" /><br />
<br style="clear: both;" /><br />
Feito! O seu aplicativo irá abrir com o texto conforme você montou.</p>
<p><img class="size-full wp-image-243" title="AppWorks" src="http://flaviosilveira.com/wp-content/uploads/2010/08/imagem10.png" alt="AppWorks" width="645" height="396" /><br />
<br style="clear: both;" /></p>
<p>Está feito a sua aplicação em Air usando o Adobe Flash Builder.<br />
Procure experimentar outros componentes e suas propriedades para ver como ficam.</p>
<p>Dúvidas? Só entrar em contato.<br />
Abraços!!</p>


<div id=RelatedPosts><p>Posts Relacionados</p><p class=nopost>Nenhum Post Relacionado</p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/hello-world-em-air-com-adobe-flash-builder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formatando CPF no SQL com Expressões Regulares &#8211; RegexReplace</title>
		<link>http://flaviosilveira.com/2010/formatando-cpf-no-sql-com-expressoes-regulares-regexreplace/</link>
		<comments>http://flaviosilveira.com/2010/formatando-cpf-no-sql-com-expressoes-regulares-regexreplace/#comments</comments>
		<pubDate>Fri, 21 May 2010 15:22:32 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Expressões Regulares]]></category>
		<category><![CDATA[Programação SQL]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[Regex Replace]]></category>
		<category><![CDATA[Sql Server]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=209</guid>
		<description><![CDATA[Que as expressões regulares são bacanas e divertidas todo mundo já sabe. Elas estão presentes em várias linguagens e no SQL Server não poderia ser diferente. Se você é programador e ainda não sabe sobre as expressões regulares, não perca tempo. Você precisa se emocionar com o uso delas em seus códigos. Consulte os links [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/tratando-cpf-cnpj-primeiro-nome-e-data-pelo-sql-postgre/' rel='bookmark' title='Permanent Link: Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)'>Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)</a></li>
<li><a href='http://flaviosilveira.com/2009/limitando-o-select-do-sql-em-diferentes-bancos-de-dados/' rel='bookmark' title='Permanent Link: Limitando o SELECT do SQL em diferentes Bancos de Dados'>Limitando o SELECT do SQL em diferentes Bancos de Dados</a></li>
<li><a href='http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/' rel='bookmark' title='Permanent Link: Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server'>Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<p>Que as expressões regulares são bacanas e divertidas todo mundo já sabe.<br />
Elas estão presentes em várias linguagens e no SQL Server não poderia ser diferente.</p>
<p>Se você é programador e ainda não sabe sobre as expressões regulares, não perca tempo.<br />
Você precisa se emocionar com o uso delas em seus códigos.</p>
<p>Consulte os links abaixo para iniciar já esse aprendizado:<br />
Wikipedia &#8211; <a href="http://pt.wikipedia.org/wiki/Express%C3%A3o_regular">http://pt.wikipedia.org/wiki/Express%C3%A3o_regular</a><br />
Um excelente tutorial para começar do Rafael Jaques- <a href="http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit">http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit</a><br />
Aurélio Marinho Jargas &#8211; O guru das expressões regulares &#8211; <a href="http://aurelio.net/er/">http://aurelio.net/er/</a></p>
<p>Certo mas e o SQL Server ? Vamos voltar para ele..</p>
<p>Em um post antigo eu mostro como fazer a formatação de campos como CPF direto pelo SQL.</p>
<p>Mas digamos que alguns campos do CPF estejam com formatação correta com pontuação e dígitos e outras não.<br />
E ainda outras mais ou menos. Ex: <em>161.364.708-53, 16136470853, 161364708-53</em>.<br />
Você tem um problema e nesse caso um SubString não iria funcionar corretamente.</p>
<p>Solução? RegexReplace. Vamos ver como usar isso.<br />
<span id="more-209"></span><br />
Primeiro vamos montar a expressão regular.<br />
Vamos montar ela de maneira clara pensando apenas em como o CPF tem de ser exibido.<br />
Não vamos pensar no cálculo do dígito verificador nem nada desse tipo.</p>
<p>Bom o que queremos ?</p>
<ul>
<li>3 números seguidos de um ponto. Vamos lembrar que esse ponto pode existir ou não. Não sabemos como o dado foi salvo no banco.</li>
<li>Mais 3 números seguidos de outro ponto. Novamente não sabemos se esse ponto estará presente ou não.</li>
<li>Precisamos agora de 3 números seguidos por um hífen, que também não temos certeza se estará lá ou não.</li>
<li>Para fechar, dois números.</li>
</ul>
<p>Legal! Já sabemos o que queremos vamos agora começar a brincadeira.</p>
<p>Não vou explicar aqui cada operador e caracter. Isso é demorado e também não é meu objetivo aqui.<br />
Para começar com Expressões Regulares consulte os links que passei logo no início desse post.</p>
<p>Para trazer numerais na expressão regular usamos o seguinte</p>
<pre class="brush: bash;">
[0-9]
</pre>
<p>Mas isso vai me trazer apenas um numero, mas na verdade queremos 3 então fazemos da seguinte maneira</p>
<pre class="brush: bash;">
[0-9]{3}
</pre>
<p>Se você quisesse 2 números, bastava substituir o 3 pelo 2.</p>
<p>Legal, para pegar os números já temos todas as armas na mão.<br />
E agora os caracteres, o ponto e o hífen opcionais ??<br />
Vamos lá&#8230;</p>
<p>O ponto é um operador em expressão regular e não é o operador que vai trazer o que queremos.<br />
Nós precisamos de um ponto literalmente.<br />
Para isso vamos escapar o ponto, assim como escapamos aspas ou caracteres especiais em programação.<br />
Ficando assim:</p>
<pre class="brush: php;">
\\.
/*Desconsidere umas das barras, acima
coloquei duas por conta do plugin de sintaxe do wordpress.*/
</pre>
<p>Agora para deixar isso opcional, basta colocar uma interrogação depois disso.</p>
<pre class="brush: bash;">
\.?
</pre>
<p>Para o hífen, não é obrigatório escapar pois ele não é um operador em expressões regulares.<br />
Entretanto eu gosto de escapar ele. Para mim facilita a leitura.</p>
<pre class="brush: bash;">
\-?
</pre>
<p>Certo. Temos como pegar os numerais, como pegar hífen e pontos. Agora é juntar tudo.<br />
Vamos usar parênteses para deixar tudo organizado e também para facilitar a nossa formatação mais para frente.</p>
<pre class="brush: bash;">
^([0-9]{3})\.?([0-9]{3})\.?([0-9]{3})\-?([0-9]{2})$
</pre>
<p>Repare que coloquei um circunflexo(<em>^</em>) no início da expressão e um cifrão(<em>$</em>) no final.<br />
Isso indica que a String tem que ter um começo e um fim.<br />
Caso não tivesse isso poderia haver qualquer caractere antes ou depois do CPF.</p>
<p>Vejamos por partes então:</p>
<ul>
<li>^ &#8211; Inicia a string</li>
<li>([0-9]{3}) &#8211; 3 números</li>
<li>\.? &#8211; Um ponto, que pode ter ou não, por isso a interrogação.</li>
<li>([0-9]{3}) &#8211; Novamente 3 números</li>
<li>\.? &#8211; Mais um ponto, que pode ter ou não.</li>
<li>([0-9]{3}) &#8211; Mais 3 números</li>
<li>\-? &#8211; Um hífen, que pode ter ou não. Não é obrigatório o escape nele.</li>
<li>([0-9]{2}) &#8211; Dois números.</li>
<li>$ &#8211; Finaliza a String.</li>
</ul>
<p>Agora vamos para a segunda parte, o RegexReplace do Sql Server.</p>
<p>A função RegexReplace tem 3 parâmetros obrigatórios.<br />
O primeiro é o seu campo, CPF nesse caso. O Segundo a expressão regular, e o terceiro o como queremos exibir.</p>
<p>Os dois primeiros parâmetros já temos.<br />
Para o modo de exibição funciona da seguinte forma.<br />
Quando usamos os parênteses em nossa expressão regular, elas se tornam variáveis que resgatamos com um cifrão e a ordem em que ela aparece na expressão. Então o primeiro parênteses seria o $1, o segundo o $2 e assim por diante.</p>
<p>Agora é só montar a função no Select.<br />
Ficando assim.</p>
<pre class="brush: sql;">
Select dbo.RegexReplace('161364.70853',
'^([0-9]{3})\.?([0-9]{3})\.?([0-9]{3})\-?([0-9]{2})',
'$1.$2.$3-$4')
</pre>
<p>Entre as variáveis você pode colocar os caracteres para exibição como pontos, hífens, underline e qualquer coisa que queira.</p>
<p>Reparem que coloquei o CPF no primeiro parâmetro da função formatado de maneira errada propositalmente.<br />
Experimente modificar essa formatação, deixar só os números, só os pontos, enfim&#8230;<br />
Modifique também a exibição da formatação para ver o funcionamento.</p>
<p>É isso galera.</p>
<p>Agradeço ao meu grande brother Anderson Orso por me mostrar possível aprender expressões regulares facilmente.</p>
<p>Espero que tenham curtido.<br />
Qualquer dúvida só mandar.</p>
<p>Abraços!!</p>
<p><strong>UPDATE &#8211; 22 de maio</strong></p>
<p>Fala pessoal,<br />
não me dei conta ontem que esqueci um detalhe importantíssimo de todo essa papo aqui.</p>
<p>O RegexReplace e outras funções similares não são nativas no SQL Server ao contrário de outros bancos de dados. Para ter isso disponível nos seus Selects, Updates e etc, você deve compilar um assembly .NET e subir para o banco.</p>
<p>O código para compilar você pode <a title="User Defined Functions" href="http://flaviosilveira.com/wp-content/UserDefinedFunctions.cs.rar">baixar aqui</a>.<br />
Mais detalhes de como fazer e usar tudo isso você encontra <a href="http://justgeeks.blogspot.com/2008/08/adding-regular-expressions-regex-to-sql.html">nesse link</a>.</p>
<p>Abraço!</p>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/tratando-cpf-cnpj-primeiro-nome-e-data-pelo-sql-postgre/' rel='bookmark' title='Permanent Link: Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)'>Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)</a></li>
<li><a href='http://flaviosilveira.com/2009/limitando-o-select-do-sql-em-diferentes-bancos-de-dados/' rel='bookmark' title='Permanent Link: Limitando o SELECT do SQL em diferentes Bancos de Dados'>Limitando o SELECT do SQL em diferentes Bancos de Dados</a></li>
<li><a href='http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/' rel='bookmark' title='Permanent Link: Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server'>Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/formatando-cpf-no-sql-com-expressoes-regulares-regexreplace/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>Flávio Silveira</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[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, como voce já está acostumado a fazer, com o nome que você colocaria normalmente. Apenas com o conteúdo que muda de uma página para outra. [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<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;">

&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;">
// 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;">

&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>
<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>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/feed/</wfw:commentRss>
		<slash:comments>9</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>Flávio Silveira</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[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 um exemplo rápido e prático seria mais ou menos o seguinte: Pense que você tem um topo e um rodapé que nunca mudam no seu [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<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="aligncenter size-full wp-image-146" title="Exemplo Template Engine" src="http://flaviosilveira.com/wp-content/uploads/2010/02/Screen-shot-2010-02-18-at-6.54.49-PM.png" alt="Exemplo" width="228" height="259" /><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>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;">
/*
|--------------------------------------------------------------------------
| 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 />
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 como nome do seu hook.</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;">
$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;">
/*
|---------------------------------------------------------------
| 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;">
&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>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone</title>
		<link>http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/</link>
		<comments>http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 22:48:03 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[IPhone - Desenvolvimento]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[Screencast]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=136</guid>
		<description><![CDATA[Salve galera! No meio do ano passado fiz um experiência na tentativa de fazer um Screencast com alguns estudos que fiz sobre o desenvolvimento de sites voltados para o IPhone. De lá pra cá acabei me envolvendo em outras coisas e nem lembrei de publicar isso. Agora está ai! Um bate papo com exemplos de [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/' rel='bookmark' title='Permanent Link: Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript'>Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript</a></li>
<li><a href='http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/' rel='bookmark' title='Permanent Link: Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server'>Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server</a></li>
<li><a href='http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/' rel='bookmark' title='Permanent Link: PodCast &#8211; Desenvolvimento Mobile Web'>PodCast &#8211; Desenvolvimento Mobile Web</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<p>Salve galera!</p>
<p>No meio do ano passado fiz um experiência na tentativa de fazer um Screencast com alguns estudos que fiz sobre o desenvolvimento de sites voltados para o IPhone.</p>
<p>De lá pra cá acabei me envolvendo em outras coisas e nem lembrei de publicar isso.</p>
<p>Agora está ai! Um bate papo com exemplos de quase 20 minutos de duração para quebrar alguns mitos de se criar sites para Iphone. Também mostro algumas ferramentas, frameworks para facilitar a vida e simuladores para você fazer os devidos testes. </p>
<p>Nesse Vídeo:<br />
- <em>Fazendo um site para IPhone no braço, HTML, JavaScript</em><br />
- <em>IWebKit &#8211; Framework para desenvolvimento de sites no IPhone</em><br />
- <em>Simuladores para testar: IPhoney, Iphone Simulator(XCode)</em><br />
- <em>IPhone Project do Aptana</em></p>
<p><strong>Confiram!!</strong><br />
<object width="630" height="390"><param name="movie" value="http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/mp4h264player.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/FirstFrame.jpg&#038;containerwidth=640&#038;containerheight=400&#038;content=http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/Bate%20Papo%20sobre%20desenvolver%20de%20Sites%20para%20IPhone.mp4"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/"></param> <embed src="http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/mp4h264player.swf" quality="high" bgcolor="#FFFFFF" width="640" height="400" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/FirstFrame.jpg&#038;containerwidth=640&#038;containerheight=400&#038;content=http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/Bate%20Papo%20sobre%20desenvolver%20de%20Sites%20para%20IPhone.mp4" allowFullScreen="true" base="http://content.screencast.com/users/FlavioSilveira/folders/Camtasia/media/2b0a1d23-4488-4f21-ade3-258c3da9be33/" scale="showall"></embed></object></p>
<p>Alguns links:<br />
<em>- <a href="http://iwebkit.net/">IWeb Kit</a></em><br />
<em>- <a href="http://tinyurl.com/y8wj4nr">Usando Iphone Simulator (Em inglês)</a></em></p>
<p>Valeu galera! Espero que curtam.<br />
Qualquer dúvida entrem em contato pelo email ou twitter.<br />
Aguardo os feedbacks.</p>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/' rel='bookmark' title='Permanent Link: Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript'>Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript</a></li>
<li><a href='http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/' rel='bookmark' title='Permanent Link: Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server'>Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server</a></li>
<li><a href='http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/' rel='bookmark' title='Permanent Link: PodCast &#8211; Desenvolvimento Mobile Web'>PodCast &#8211; Desenvolvimento Mobile Web</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server</title>
		<link>http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/</link>
		<comments>http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 01:56:42 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Programação SQL]]></category>
		<category><![CDATA[Programação em geral]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=125</guid>
		<description><![CDATA[Salve galera! Precisei durante essa semana de uma função que contasse quantas vezes uma palavra aparecia dentro de uma String no SQL Server. Achei que já tivesse algo pelo menos similar, mais após andar pelo MSDN e pelo Books Online vi que o jeito seria fazer uma função. A lógica é a seguinte: Recebo via [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/tratando-cpf-cnpj-primeiro-nome-e-data-pelo-sql-postgre/' rel='bookmark' title='Permanent Link: Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)'>Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)</a></li>
<li><a href='http://flaviosilveira.com/2009/limitando-o-select-do-sql-em-diferentes-bancos-de-dados/' rel='bookmark' title='Permanent Link: Limitando o SELECT do SQL em diferentes Bancos de Dados'>Limitando o SELECT do SQL em diferentes Bancos de Dados</a></li>
<li><a href='http://flaviosilveira.com/2010/formatando-cpf-no-sql-com-expressoes-regulares-regexreplace/' rel='bookmark' title='Permanent Link: Formatando CPF no SQL com Expressões Regulares &#8211; RegexReplace'>Formatando CPF no SQL com Expressões Regulares &#8211; RegexReplace</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<p>Salve galera!</p>
<p>Precisei durante essa semana de uma função que contasse quantas vezes uma palavra aparecia dentro de uma String no SQL Server. Achei que já tivesse algo pelo menos similar, mais após andar pelo MSDN e pelo Books Online vi que o jeito seria fazer uma função.</p>
<p>A lógica é a seguinte:</p>
<ul>
<li>Recebo via Parâmetro a Palavra que quero buscar e a String toda ou texto.</li>
<li>Faço um loop baseado no tamanho do texto.</li>
<li>Pego o tamanho da palavra que está sendo procurada e a cada caracter do texto, andamos o tamanho da palavra e comparamos se isso é igual a palavra procurada.</li>
<li>Se for, soma um no contador de palavras e continua.</li>
</ul>
<p>Agora como fica o código disso? Repare abaixo:<br />
<span id="more-125"></span></p>
<pre class="brush: sql;">
CREATE FUNCTION CountSearchPat
(
      @Word Varchar(100),
      @String Varchar(Max)
)
RETURNS int
AS
BEGIN

      -- Declaração Variáveis
      Declare @Count int, @CountWord int

      -- Contador de quantas vezes apareceu a palavra
      Set @CountWord = 0

      -- Contador do Loop
      Set @Count = 0

      -- Loop
      While @Count &lt;= Len(@String)
      Begin

            -- Se encontrar a palavra soma mais um para @CountWord
            Set @CountWord =
                  Case When Substring(@String, @Count, Len(@Word)) = @Word
                        Then @CountWord + 1
                        Else @CountWord
                  End

            -- Soma mais um ao contador
            Set @Count = @Count + 1

      End

      -- Retorna Valor
      Return @CountWord

END
</pre>
<p>Repare no loop da linha 30 que tem seu contador baseado no tamanho da String inteira, para percorrer cada caracter.</p>
<p>Na linha 24 temos uma variável que seu valor depende do CASE onde, se a partir daquele caracter for encontrada a palavra, soma mais um, senão continua com o mesmo valor.</p>
<p>Na linha 31 temos a soma do contador do loop. E então o retorno do valor da função.</p>
<p>Agora é só testar.<br />
Por Exemplo: Select dbo.SearchStringPat(&#8216;teste&#8217;, &#8216;aatestehstestehjkteste&#8217;)<br />
O resultado será 3.</p>
<p>Agora reflita comigo no próximo Exemplo sugerido pelo meu Brother Hernando Santana:<br />
Você tem uma String da seguinte maneira &#8216;AAAAA&#8217; e procura pelo padrão &#8216;AA&#8217;. Qual valor irá retornar ?</p>
<p>A função criada aqui irá retornar 4. A resposta é uma questão de conceito. Eu ando caracter por caracter atrás da palavra. Podemos fazer andar a partir da palavra encontrada adicionando mais algumas variáveis sem problema e fazendo retornar o valor 2. Para minha necessidade não fazia diferença a princípio.</p>
<p>Idéia simples que resolveu os problemas do dia.<br />
Até a Próxima! Abraços!</p>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/tratando-cpf-cnpj-primeiro-nome-e-data-pelo-sql-postgre/' rel='bookmark' title='Permanent Link: Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)'>Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)</a></li>
<li><a href='http://flaviosilveira.com/2009/limitando-o-select-do-sql-em-diferentes-bancos-de-dados/' rel='bookmark' title='Permanent Link: Limitando o SELECT do SQL em diferentes Bancos de Dados'>Limitando o SELECT do SQL em diferentes Bancos de Dados</a></li>
<li><a href='http://flaviosilveira.com/2010/formatando-cpf-no-sql-com-expressoes-regulares-regexreplace/' rel='bookmark' title='Permanent Link: Formatando CPF no SQL com Expressões Regulares &#8211; RegexReplace'>Formatando CPF no SQL com Expressões Regulares &#8211; RegexReplace</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/funcao-para-contar-palavras-padrao-de-caracteres-em-uma-string-microsoft-sql-server/feed/</wfw:commentRss>
		<slash:comments>1</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>Flávio Silveira</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 [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/codeigniter-internet-explorer-e-o-tempo-de-expiracao-da-sessao/' rel='bookmark' title='Permanent Link: CodeIgniter, Internet Explorer e o tempo de expiração da sessão'>CodeIgniter, Internet Explorer e o tempo de expiração da sessão</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</a></li>
</ul></div>]]></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;">
&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;">
&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>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/codeigniter-internet-explorer-e-o-tempo-de-expiracao-da-sessao/' rel='bookmark' title='Permanent Link: CodeIgniter, Internet Explorer e o tempo de expiração da sessão'>CodeIgniter, Internet Explorer e o tempo de expiração da sessão</a></li>
<li><a href='http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/' rel='bookmark' title='Permanent Link: CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.'>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/comparando-arrays-e-trazendo-os-valores-diferentes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.</title>
		<link>http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/</link>
		<comments>http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 03:03:23 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação em geral]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=113</guid>
		<description><![CDATA[Cenário: Você compra o domínio principal, www.site.com.br. E você vai ter duas versões desse site, uma para cada cliente, que vai usar todas as regras de negócio iguais. A única diferença será o layout. Os clientes pediram os subdomínios branco.site.com.br e preto.site.com.br. Você pode fazer duas cópias do site em pastas diferentes, mas levando em [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/codeigniter-internet-explorer-e-o-tempo-de-expiracao-da-sessao/' rel='bookmark' title='Permanent Link: CodeIgniter, Internet Explorer e o tempo de expiração da sessão'>CodeIgniter, Internet Explorer e o tempo de expiração da sessão</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<p>Cenário: </p>
<p>Você compra o domínio principal, <em>www.site.com.br</em>. E você vai ter duas versões desse site, uma para cada cliente, que vai usar todas as regras de negócio iguais. A única diferença será o layout. Os clientes pediram os subdomínios <em>branco.site.com.br</em> e <em>preto.site.com.br</em>.</p>
<p>Você pode fazer duas cópias do site em pastas diferentes, mas levando em consideração que eles tem o mesmo CORE, isso não é muito inteligente. Pense se você tiver que fazer uma atualização, você vai ter de mexer em ambos os projetos.</p>
<p>Porque não fazer os subdomínios como links simbólicos para uma mesma pasta? De lá você pode fazer uma verificação. Se for um site, pega o layout branco, se for o outro pega o layout preto.</p>
<p>Problema:</p>
<p>No Codeigniter você define a URL principal do seu projeto nos arquivos de configuração, na variável <em>$config['base_url']</em>. Você não vai ter como colocar os subdomínios lá. O que fazer?</p>
<p>Solução:<br />
Usar a Global <em>$_SERVER</em>.</p>
<p>Essa Global traz informações como o host que você está acessando, o email do administrador da máquina, o software usado, a configuração do TimeOut entre outras.</p>
<p>Para que você mesmo visualize tudo isso faça o seguinte. Abra o seu config.php do CodeIgniter e logo acima de onde está setado a variável <em>$config['base_url']</em> de um print_r, como abaixo:</p>
<pre class="brush: php;">

|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|       http://example.com/
|
*
print_r($_SERVER);
die;
$config['base_url']     = &quot;http://www.site.com.br/&quot;;
</pre>
<p><span id="more-113"></span><br />
Veja em seu browser todas as opções que você tem nessa global.</p>
<p>Dê uma atenção na primeira opção que vêm no array, o <em>HTTP_HOST</em>. Ele traz o endereço primário que você está acessando. É o que você precisa para setar seu config de acordo com a url que seu visitante acessar.</p>
<p>Dando um print apenas nesse cara,</p>
<pre class="brush: php;">

|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|       http://example.com/
|
*
print_r($_SERVER['HTTP_HOST']);
die;
$config['base_url']     = &quot;http://www.site.com.br/&quot;;
</pre>
<p>ele retorna o seu subdomínio.</p>
<p>Agora é só fazer uma adaptação.</p>
<pre class="brush: php;">

|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|       http://example.com/
|
*

$config['base_url']     = &quot;http://&quot; . $_SERVER['HTTP_HOST'];
</pre>
<p>Seja lá qual subdomínio você acessar, ele vai setar como <em>base_url</em> para você.</p>
<p>Caso você não use subdomínios, esse artifício pode ser usado para você deixar o base_url automatizado para seus projetos. </p>
<p>Espero que tenham curtido a idéia.<br />
Qualquer dúvida só mandar.<br />
Abraços!!</p>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/codeigniter-internet-explorer-e-o-tempo-de-expiracao-da-sessao/' rel='bookmark' title='Permanent Link: CodeIgniter, Internet Explorer e o tempo de expiração da sessão'>CodeIgniter, Internet Explorer e o tempo de expiração da sessão</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 1</a></li>
<li><a href='http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-2/' rel='bookmark' title='Permanent Link: Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2'>Habilitando Layouts no CodeIgniter (Template Engine) &#8211; Parte 2</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/codeigniter-use-a-global-_server-no-config-para-ganhar-dinamismo-com-subdominios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Redirecionando usuários do IPhone para a versão mobile do seu site &#8211; JavaScript</title>
		<link>http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/</link>
		<comments>http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 00:40:53 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[IPhone - Desenvolvimento]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod touch]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=102</guid>
		<description><![CDATA[As pessoas que me acompanham sabem que há pouco mais de um mês adquiri um IPhone. A minha operadora me ligou oferecendo alguns pontos que valiam desconto na aquisição do aparelho. Não perdi tempo e corri lá buscar. Desde então as minhas leituras diárias começaram a se voltar mais para IPhone. Desenvolvimento de aplicativos, desenvolvimento [...]

<div id="RelatedPosts">
Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/firefox-ajudando-no-seu-dia-de-trabalho/' rel='bookmark' title='Permanent Link: Firefox ajudando no seu dia de trabalho&#8230;'>Firefox ajudando no seu dia de trabalho&#8230;</a></li>
<li><a href='http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/' rel='bookmark' title='Permanent Link: ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone'>ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone</a></li>
<li><a href='http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/' rel='bookmark' title='Permanent Link: PodCast &#8211; Desenvolvimento Mobile Web'>PodCast &#8211; Desenvolvimento Mobile Web</a></li>
</ul></div>]]></description>
			<content:encoded><![CDATA[<p>As pessoas que me acompanham sabem que há pouco mais de um mês adquiri um IPhone.<br />
A minha operadora me ligou oferecendo alguns pontos que valiam desconto na aquisição do aparelho. Não perdi tempo e corri lá buscar.</p>
<p>Desde então as minhas leituras diárias começaram a se voltar mais para IPhone.<br />
Desenvolvimento de aplicativos, desenvolvimento de sites, &#8216;manhas&#8217; para usar o aparelho, dicas para economizar bateria, e por ai vai.</p>
<p>O que trago hoje aqui faz parte dos meus estudos para criação de sites para o público que usa IPhone, que é, identificar que seu visitante está usando o aparelho e redirecioná-lo para a versão mobile do seu site.</p>
<p>A ideia é bem simples, e, para colocar ela em prática usamos JavaScript.</p>
<p>Primeiro crie um arquivo HTML e o prepare para receber um javaScript dentro das tags do cabeçalho.</p>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;::: Teste IPhone :::&lt;/title&gt;
&lt;script type='text/javascript'&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><span id="more-102"></span><br />
Deixei apenas o necessário para o HTML funcionar acima.<br />
Coloquei um título para constar, e abri as tags de script onde vai entrar o nosso JavaScript.</p>
<p>Em JavaScript temos um objeto que traz propiedades e métodos do nosso navegador, que é o <strong>navigator</strong>.<br />
Você pode vê-lo em ação adicionando o seguinte código dentro das tags script:</p>
<pre class="brush: jscript;">
alert(navigator);
</pre>
<p>Esse objeto tem propiedades que nos trazem dados como o nome do browser, sua versão, dizer se os cookies estão habilitados e outros.</p>
<p>A propiedade que vamos usar é a <em>userAgent</em>, que traz um conjunto de informações do browser e do dispositivo que está acessando, que é o que precisamos.</p>
<pre class="brush: jscript;">
alert(navigator.userAgent);
</pre>
<p>Veja o resultado do código acima ao acessarmos a página. Repare nas informações retornadas:<br />
<strong>No Firefox do Linux:</strong><br />
<img class="alignnone size-full wp-image-103" title="linux-firefox" src="http://flaviosilveira.com/wp-content/uploads/2009/07/screenshot.png" alt="linux-firefox" width="628" height="313" /><br  style='clear:both;'/><br />
<strong>No Safari do Mac:</strong><br />
<img class="alignnone size-full wp-image-104" title="safari-mac" src="http://flaviosilveira.com/wp-content/uploads/2009/07/picture-2.png" alt="safari-mac" width="514" height="222" /><br  style='clear:both;'/><br />
<strong>No Simulador do IPhone:</strong><br />
<img class="alignnone size-full wp-image-105" title="simulador" src="http://flaviosilveira.com/wp-content/uploads/2009/07/picture-3.png" alt="simulador" width="299" height="586" /><br  style='clear:both;'/><br />
<strong>No própio IPhone:<br />
<img class="alignnone size-full wp-image-106" title="iphone" src="http://flaviosilveira.com/wp-content/uploads/2009/07/img_0095.png" alt="iphone" width="298" height="447" /></strong><br  style='clear:both;'/></p>
<p>Reparou que quando estamos lidando com o Iphone, essa informação aparece para a gente na propiedade do objeto ?<br />
Caso estivessemos no IPod Touch, apareceria <em>IPod</em> ao invés de <em>IPhone</em> nas informações.</p>
<p>Agora basta fazer uma verificação para ver se a palavra Iphone ou Ipod está presente nas informações, e, se estiver, redirecionar para sua versão mobile.<br />
Veja o código:</p>
<pre class="brush: jscript;">
if ((navigator.userAgent.indexOf('iPhone') != -1) || (navigator.userAgent.indexOf('iPod') != -1))
{
alert('IPhone!!!');
//Essa linha redireciona você para o endereço que você colocar
document.location = &quot;http://www.flaviosilveira.com&quot;;
}
</pre>
<p>Qualquer dúvida estamos aí&#8230;Abraços!!!</p>


<div id="RelatedPosts"><p>Posts Relacionados<ul><li><a href='http://flaviosilveira.com/2009/firefox-ajudando-no-seu-dia-de-trabalho/' rel='bookmark' title='Permanent Link: Firefox ajudando no seu dia de trabalho&#8230;'>Firefox ajudando no seu dia de trabalho&#8230;</a></li>
<li><a href='http://flaviosilveira.com/2010/screencast-bate-papo-sobre-desenvolvimento-de-sites-para-iphone/' rel='bookmark' title='Permanent Link: ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone'>ScreenCast &#8211; Bate papo sobre desenvolvimento de sites para IPhone</a></li>
<li><a href='http://flaviosilveira.com/2010/podcast-desenvolvimento-mobile-web/' rel='bookmark' title='Permanent Link: PodCast &#8211; Desenvolvimento Mobile Web'>PodCast &#8211; Desenvolvimento Mobile Web</a></li>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
