<?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; Programação em geral</title>
	<atom:link href="http://flaviosilveira.com/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://flaviosilveira.com</link>
	<description>Programação &#38; Desenvolvimento</description>
	<lastBuildDate>Sun, 23 May 2010 01:33:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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 abaixo para iniciar já [...]

<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/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/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>
</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/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/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>
</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.
O HTML que você colocar [...]

<div id="RelatedPosts">
Posts Relacionados<ul><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/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/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</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/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/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/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</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 portal.
Ou seja, [...]

<div id="RelatedPosts">
Posts Relacionados<ul><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>
<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/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</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/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>
<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/2008/alterando-configuracao-do-codeigniter/' rel='bookmark' title='Permanent Link: Múltiplos sites com CodeIgniter'>Múltiplos sites com CodeIgniter</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>5</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 quase 20 minutos [...]

<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>
</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>
</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 Parâmetro a Palavra [...]

<div id="RelatedPosts">
Posts Relacionados<ul><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>
<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>
</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/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>
<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>
</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 verdade traz apenas [...]

<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 consideração [...]

<div id="RelatedPosts">
Posts Relacionados<ul><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>
<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/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>
</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/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>
<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/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>
</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 de sites, &#8216;manhas&#8217; [...]

<div id="RelatedPosts">
Posts Relacionados<ul><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/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/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>
</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/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/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/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>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/redirecionando-para-versao-mobil/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>CodeIgniter &#8216;metido&#8217; a Ruby on Rails. (ciforms.sh)</title>
		<link>http://flaviosilveira.com/2009/codeigniter-metido-a-ruby/</link>
		<comments>http://flaviosilveira.com/2009/codeigniter-metido-a-ruby/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 03:14:35 +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[Shell Script]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[geração de cadastros]]></category>
		<category><![CDATA[Geração de formulários]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://flaviosilveira.com/?p=81</guid>
		<description><![CDATA[Salve Galera&#8230;
Vocês sabem, muitos projetos em sistemas são similares, sempre aquela mesma coisa&#8230;Listar, Inserir, Editar e Remover.
Isso me levou a querer criar algo para facilitar tudo isso.
Vendo meu Amigo Fábio Tomio mandando ver no Ruby On Rails, ele me mostrou que criava um cadastro (Listar, Inserir, Editar e Remover) muito facilmente, com apenas um comando [...]

<div id="RelatedPosts">
Posts Relacionados<ul><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>
<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>Salve Galera&#8230;</p>
<p>Vocês sabem, muitos projetos em sistemas são similares, sempre aquela mesma coisa&#8230;Listar, Inserir, Editar e Remover.<br />
Isso me levou a querer criar algo para facilitar tudo isso.</p>
<p>Vendo meu Amigo <a title="Fábio's Blogs" href="http://www.fabiotomio.com">Fábio Tomio</a> mandando ver no <a href="http://www.rubyonrails.pro.br/">Ruby On Rails</a>, ele me mostrou que criava um cadastro (Listar, Inserir, Editar e Remover) muito facilmente, com apenas um comando no terminal, usando a funcão Scaffold se não me engano.</p>
<p>Inspirado nisso, resolvi fazer um Shell Script que geraria todas as views, controller e model prontas com essas opções.</p>
<p><strong>Introdução</strong></p>
<ul>
<li>Chamei de CiForms.</li>
<li>Essa é uma versão de teste. É a versão Zero.</li>
<li>Fiz esse script como estudo. Não tenho pretensões de lucros, suporte, nem nada com ele.</li>
</ul>
<p><strong>Porque não usar o Scaffolding do CodeIgniter</strong></p>
<ul>
<li>O Scaffolding do CodeIgniter não é aproveitável para o desenvolvimento de um projeto, ele não segue o padrão MVC do Framework. Como consta no manual, ele é apenas uma maneira de popular rapidamente uma tabela.</li>
</ul>
<p><span id="more-81"></span><br />
<strong>Limitações dessa versão</strong></p>
<ul>
<li>É um shell Script. Vai rodar apenas em base Unix. Fiz testes no Linux distribuição Ubuntu 8.10  e no Leopard MAC OSX 10.5.6. Não vai rodar no Windows.</li>
<li>Por enquanto está rodando apenas em DataBase MySQL, Tive problemas com a função listFields com outros bancos.</li>
<li>Você deve estar com o módulo Rewrite do apache instalado, e usando o .htaccess como indicado no manual do CodeIgniter para fazer suas URL amigáveis, senão a navegação vai ficar super esquisita.</li>
<li>Você deverá chamar o script de dentro da sua pasta Application e as pastas Controllers, Models e Views não podem ter sido renomeadas.</li>
</ul>
<p><strong>Como Usar</strong></p>
<ul>
<li>É bem simples. Basta chamar o script, passando o nome da tabela e em seguida o de sua PK.</li>
<li>O script tem uma opção para ajuda (-h ou &#8211;help) e para verificar a versão (-V ou &#8211;version)</li>
</ul>
<p><strong>Exemplo prático</strong></p>
<p>Baixe o Sheel Script <a title="Baixe o arquivo" href="http://flaviosilveira.com/wp-content/uploads/ciforms.sh">clicando aqui</a>.</p>
<p>É necessário colocar o sheel dentro da pasta applications.<br />
<img class="alignnone size-full wp-image-83" title="picture-1" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-1.png" alt="picture-1" width="541" height="316" /><br style='clear: both;' /></p>
<p>Em seguida Vamos executá-lo no terminal.<br />
Para chamar o script, apontamos o caminho atual (./) e depois seu nome (ciforms.sh).<br />
Repare que se não passar os parâmetros corretos ele não irá executar e irá lhe oferecer o help.<br />
<img class="alignnone size-full wp-image-91" title="picture-8" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-8.png" alt="picture-8" width="596" height="83" /><br style='clear: both;' /></p>
<p>Colocando corretamente os parâmetros (Nome da tabela e em seguida a Primary Key da tabela)<br />
<img class="alignnone size-full wp-image-85" title="picture-3" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-3.png" alt="picture-3" width="598" height="76" /><br style='clear: both;' /></p>
<p>O Script é executado e você já pode conferir nas pastas que foram criados os arquivos .php.<br />
Um controller, um model, e três views.<br />
<img class="alignnone size-full wp-image-86" title="picture-4" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-4.png" alt="picture-4" width="618" height="420" /><br style='clear: both;' /></p>
<p>Basta agora chamar no browser o seu site, em seguida o nome da tabela.<br />
Aqui está a listagem, onde você tem o Id do registro e os opções para Editar ou Remover.<br />
<img class="alignnone size-full wp-image-87" title="picture-5" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-5.png" alt="picture-5" width="546" height="234" /><br style='clear: both;' /></p>
<p>Após Editar você volta para a listagem.<br />
<img class="alignnone size-full wp-image-88" title="picture-6" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-6.png" alt="picture-6" width="450" height="294" /><br style='clear: both;' /></p>
<p>Após clicar em remover, você repara na listagem com um registro a menos.<br />
<img class="alignnone size-full wp-image-89" title="picture-7" src="http://flaviosilveira.com/wp-content/uploads/2009/04/picture-7.png" alt="picture-7" width="511" height="195" /><br style='clear: both;' /></p>
<p>Fique a vontade para abrir o código e conferir como são feitas as chamadas e tudo mais. O Shell vai gerar tudo em uma linha só. Se você usa o Eclipse ou o Aptana como editor basta dar um Ctrl+Shift+F para identar tudo automaticamente.</p>
<p>Os Arquivos php não contam com praticamente nenhum comentário, pois tive problemas do Shell em relação a eles.</p>
<p>Devo mexer em breve nele para funcionar com Postgres. Até lá, um abraço a todos.</p>


<div id="RelatedPosts"><p>Posts Relacionados<ul><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>
<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/2009/codeigniter-metido-a-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firefox ajudando no seu dia de trabalho&#8230;</title>
		<link>http://flaviosilveira.com/2009/firefox-ajudando-no-seu-dia-de-trabalho/</link>
		<comments>http://flaviosilveira.com/2009/firefox-ajudando-no-seu-dia-de-trabalho/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 03:05:14 +0000</pubDate>
		<dc:creator>Flávio Silveira</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Programação em geral]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[complementos]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[mozilla firefox]]></category>

		<guid isPermaLink="false">http://www.flaviosilveira.com/?p=22</guid>
		<description><![CDATA[Fui à casa do meu amigo Jean há alguns dias, ajudar com algumas soluções de programação para o seu site. E no vai e vem da programação comecei a apresentar e adicionar umas ferramentas no firefox dele. Ele ficou completamente maravilhado com a coisa toda, e isso me deixou pensando. Porra! A galera que está [...]

<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>
</ul></div>]]></description>
			<content:encoded><![CDATA[<p>Fui à casa do meu amigo Jean há alguns dias, ajudar com algumas soluções de programação para o seu site. E no vai e vem da programação comecei a apresentar e adicionar umas ferramentas no firefox dele. Ele ficou completamente maravilhado com a coisa toda, e isso me deixou pensando. Porra! A galera que está começando ou quem já programa e não conheçe, precisa saber dessas ferramentas.  <strong></strong></p>
<p><strong>Muitas vezes algumas coisas por serem tão naturais para nós, faz parecer que todo mundo conhece aquilo.</strong></p>
<p>A maioria de programadores e desenvolvedores gostam de Firefox, fato!<br />
Talvez em primeiro lugar para ir de encontro com a Microsoft. Segundo porque o Firefox geralmente obedece o que está no seu código, e terceiro, porque ele ajuda muito quando você tem umas ferramentas bacanas adicionadas a ele.</p>
<p>Para adionar complementos no seu firefox duas opções:<br />
- Você pode ir no Menu: <em>Ferramentas &gt;&gt; Complementos e procurar por ele na aba Adicionar. </em><br />
- Ou ir direto no <a href="https://addons.mozilla.org/pt-BR/firefox/">site de plugins da Mozilla</a>, e baixá-los para sua máquina. Para posteriormente instalar as extensões que você baixou, vá no Menu: <em>Arquivo&gt;&gt;Abrir Arquivo</em>.</p>
<p>Eis alguns complemetos que uso: <span id="more-22"></span><br />
<strong>WEB DEVELOPER</strong></p>
<p>A web developer é uma barra de ferramentas com várias coisas que vão te auxiliar. Logo que você reinicia o firefox após instalar a extensão, ela vem aparecendo abaixo da barra de navegação. <a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post0.jpg"><img class="alignnone size-full wp-image-23" title="post0" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post0.jpg" alt="" width="627" height="79" /></a> Existem muitas coisa legais na web developer onde só mexendo você vai descobrindo. Vou mostrar as que mais uso.  <em><strong></strong></em></p>
<p><em><strong>Cache</strong> </em>- Quem nunca ficou de cara com o cache de browser e aquele alert ou print que não aparecia ? Pois é. Resolva esse problema indo em <em>Disable &gt;&gt; Disable Cache</em>.<br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post.jpg"><img class="alignnone size-full wp-image-24" title="post" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post.jpg" alt="" width="149" height="244" /></a><br style='clear: both;'/></p>
<p><em><strong>CSS</strong></em> &#8211; Quer ver como a página que está visitando fica sem o css ? Vá na Aba <em>CSS &gt;&gt; Disable Styles &gt;&gt; All Styles</em><br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post1.jpg"><img class="alignnone size-full wp-image-25" title="post1" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post1.jpg" alt="" width="500" height="163" /></a><br style='clear: both;'/></p>
<p><em><strong>IMAGES</strong> </em>- Quer limpar as imagens do site ? <em>Images&gt;&gt; Disable Images &gt;&gt; All Images</em> <em><strong><br />
INFORMATION</strong></em> &#8211; Quer ver como está a divisão do site ? <em>Information &gt;&gt; Display Block Size </em></p>
<p>São inúmeras coisas que você pode fazer, basta vasculhar a barra. Desabilitar javaScripts e MetaTags, Limpar os cookies ou todos os dados gravados, Manipular a dimensão do browser, Mostrar campos hidden de formulários, Validar css, Validar Html&#8230;</p>
<p>Enjoy Yourself&#8230;Have a fun&#8230;.</p>
<p>Você pode desabilitar a barra caso queira indo no menu do firefox: <em>Exibir &gt;&gt; Barra de ferramentas &gt;&gt; Web Developer &gt;&gt; ToolBar</em></p>
<p><strong>FIREBUG </strong></p>
<p>O firebug é uma ferramenta para facilitar o debug de scripts e códigos web em geral.<br />
Após instalar essa extensão e reiniciar o seu Firefox, Você vê uma pequena barata no canto inferior direito, ao clicar nela um painel se abre.<br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post2.jpg"><img class="alignnone size-full wp-image-26" title="post2" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post2.jpg" alt="" width="604" height="201" /></a><br style='clear: both;'/></p>
<p>Logo ao lado do ícone da barata no painel, você tem a ferramenta Inspecionar. Com ela você pode achar Objetos Html facilmente pelos sites.<br />
Basta clicar em inspecionar e depois partir para cima do site. Experimente!</p>
<p>Abaixo, no console, geralmente aparecem os erros de javaScript, e você também pode ver algumas informações quando está trabalhando com ajax.<br />
Veja abaixo um exemplo de retorno via ajax de uma consulta no banco aparecendo no console&#8230;<br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post4.jpg"><img class="alignnone size-full wp-image-27" title="post4" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post4.jpg" alt="" width="632" height="121" /></a><br style='clear: both;'/></p>
<p>Na aba HTML, você pode editar  o html e o css, fazendo assim uma prévia do que você precisa alterar nos seus arquivos para deixar as coisas como você quer.<br />
No exemplo abaixo adicionei a cor vermelha no body do google pelo firebug.<br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post5.jpg"><img class="alignnone size-full wp-image-28" title="post5" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post5.jpg" alt="" width="636" height="233" /></a><br style='clear: both;'/></p>
<p>O resultado<br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post6.jpg"><img class="alignnone size-medium wp-image-29" title="post6" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post6-300x173.jpg" alt="" width="300" height="173" /></a><br style='clear: both;'/></p>
<p>Descubra as maravilhas do Firebug, onde por exemplo, você pode ver um mapa completo dos elementos HTML para pegá-los via JavaScript na Aba DOM</p>
<p>Para finalizar duas extensões simples e fáceis de usar.</p>
<p><strong>MEASURE IT </strong></p>
<p>A measure It é uma régua, que ajuda quando você quer medir espaçamentos ou coisas do gênero.<br />
Logo após instalar, ela aparece no canto inferior esquerdo. Basta Clicar e usar.</p>
<p><a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post7.jpg"><img class="alignnone size-full wp-image-30" title="post7" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post7.jpg" alt="" width="197" height="214" /></a> <strong></strong><br style='clear: both;'/></p>
<p><strong>COLORZILLA</strong></p>
<p>A colorzilla funciona meio que da mesma maneira. Ela serve para caçar o RGB ou o Hexadecimal daquelas cores que você gostou internet a fora.<br />
Ela também aparece no canto inferior esquerdo após ser instalada.</p>
<p>Clique na ferramenta. Clica na cor que você quer. Depois selecione uma das opções no painel da ferramenta, clicando com o botão de opções do mouse (vulgo botão direito) no ícone dela.<br />
<a href="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post8.jpg"><img class="alignnone size-full wp-image-31" title="post8" src="http://www.flaviosilveira.com/wp-content/uploads/2009/01/post8.jpg" alt="" width="207" height="141" /></a><br style='clear: both;'/></p>
<p><strong>DICA</strong></p>
<p>Essas duas últimas extensões, a measure It e a ColorZilla, eu usei muito quando transformava PSD&#8217;s em HTML e CSS.<br />
Eu exportava um arquivo JPG do Photoshop. Abria com o Firefox. E então media os containers e pegava as cores certinhas do Layout.</p>
<p><strong>CONCLUSÃO</strong><br />
Esses são os Complementos do Firefox que mais uso para programar, debugar e desenvolver.<br />
Claro, não listei aqui tudo que se pode fazer com elas, cabe a você ir experimentando e estudando.</p>
<p>Alguns outros Browsers também disponibilizam complementos, alguns que até são similares aos vistos aqui, dê uma pesquisada.</p>
<p>Hoje é isso.<br />
Valeu !<br />
Até mais !<br />
Qualquer coisa estamos na área !</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>
</ul></p></div>]]></content:encoded>
			<wfw:commentRss>http://flaviosilveira.com/2009/firefox-ajudando-no-seu-dia-de-trabalho/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
