<?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>ASNeto</title>
	<atom:link href="http://blog.asneto.eti.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.asneto.eti.br</link>
	<description>Minhas experiências, notícias sobre tecnologias recentes, tutoriais de desenvolvimento WEB, Android, Java, JSF, PHP e outras coisitas más...</description>
	<lastBuildDate>Fri, 14 Oct 2011 21:08:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>GeDA &#8211; Generic DTO Assembler</title>
		<link>http://blog.asneto.eti.br/2010/12/03/geda-generic-dto-assembler/</link>
		<comments>http://blog.asneto.eti.br/2010/12/03/geda-generic-dto-assembler/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 20:04:30 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[assemlby]]></category>
		<category><![CDATA[dto]]></category>
		<category><![CDATA[entity]]></category>
		<category><![CDATA[geda]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=178</guid>
		<description><![CDATA[Tirando um pouco a poeira e as teias de aranha do blog, apresento-lhes o GeDA. Essa é uma biblioteca utilitária para copiar valores entre Java Beans. Sua aplicação prática é popular DTO&#8217;s a partir de Entidades JPA e vice-versa. Antes de conhecer essa biblioteca eu copiava manualmente os dados ou utilizava o BeanUtils com os [...]]]></description>
			<content:encoded><![CDATA[<p>Tirando um pouco a poeira e as teias de aranha do blog, apresento-lhes o GeDA. Essa é uma biblioteca utilitária para copiar valores entre Java Beans. Sua aplicação prática é popular DTO&#8217;s a partir de Entidades JPA e vice-versa. Antes de conhecer essa biblioteca eu copiava manualmente os dados ou utilizava o BeanUtils com os métodos copyProperties.</p>
<p>A vantagem do GeDA é a facilidade na configuração. Basta adicionar o JAR no seu projeto e montar os DTO&#8217;s a partir das entidades. Depois disso, basta adicionar as anotações no DTO e depois criar uma classe para realizar o Assembly entre a Entidade e o DTO. Calma, vou explicar mais detalhadamente logo abaixo.</p>
<h2>Configuração</h2>
<p>O primeiro passo é fazer o download da biblioteca no <a href="http://www.inspire-software.com/confluence/display/GeDA/GeDA+-+Generic+DTO+Assembler" target="_blank">site oficial</a> ou diretamente do <a href="http://sourceforge.net/projects/geda-genericdto/" target="_blank">source forge</a>. Por fim, basta adicionar o jar ao build path do projeto.</p>
<h2>Criando um DTO</h2>
<p>Apenas para exemplificar, vou criar uma Entidade Usuario:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;usuario&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Usuario <span style="color: #009900;">&#123;</span>
&nbsp;
 @Id
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Long</span> id<span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> login<span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> senha<span style="color: #339933;">;</span>
 <span style="color: #666666; font-style: italic;">// Get's e Set's</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E agora vou mapear esta entidade em um DTO usando as anotações do GeDA:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Dto
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UsuarioTO <span style="color: #009900;">&#123;</span>
&nbsp;
    @DtoField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;id&quot;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Long</span> idUsuario<span style="color: #339933;">;</span>
&nbsp;
    @DtoField
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
&nbsp;
    @DtoField
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> login<span style="color: #339933;">;</span>
&nbsp;
    @DtoField
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> senha<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// Get's e Set's</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Importante destacar aqui, o uso da anotação @DtoField. No Id, eu precisei definir o nome original do campo, pois modifiquei-o no meu DTO. Como os outros campos possuem o mesmo nome, não há necessidade de informar o nome do campo na entidade.</p>
<h2>Copiando as informações</h2>
<p>Agora vamos criar a classe que realizará o assembly:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UsuarioService <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> UsuarioDTO getUsuario<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Long</span> idUsuario<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">final</span> Usuario usuario <span style="color: #339933;">=</span> getFromDb<span style="color: #009900;">&#40;</span>idUsuario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">final</span> UsuarioDTO dto <span style="color: #339933;">=</span> novoTO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">final</span> DTOAssembler assembler <span style="color: #339933;">=</span> DTOAssembler.<span style="color: #006633;">newAssembler</span><span style="color: #009900;">&#40;</span>UsuarioDTO.<span style="color: #000000; font-weight: bold;">class</span>, Usuario.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        assembler.<span style="color: #006633;">assembleDto</span><span style="color: #009900;">&#40;</span>dto, usuario, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> dto<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> UsuarioDTO novoTO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> UsuarioDTO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Usuario getFromDb<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Long</span> idUsuario<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// aqui teria um código para buscar um usuário do banco</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>É um exemplo simples e rápido, mas o suficiente para mostrar como é simples realizar o assembly entre uma entidade e um DTO. É possível fazer as duas conversões, no método do Service, bastaria mudar a chamada do método <code>assembleDto</code> para <code>assembleEntity</code>.</p>
<h2>Concluindo</h2>
<p>Existem outras coisas possíveis, como copiar objetos, listas, etc. Para isso, sugiro uma visita ao<a href="http://www.inspire-software.com/confluence/display/GeDA/FAQ" target="_blank"> faq no site oficial</a>, onde é possível visualizar alguns exemplos de conversões. Apesar da documentação ser bastante fraca, é possível se basear nos exemplos para suprir praticamente todas as necessidades.</p>
<p>Uma última dica, para quem deseja utilizar o GeDA em aplicações reais, sugiro a criação de um Assembler genérico, o que facilitará bastante o processo de copia dos valores.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/12/03/geda-generic-dto-assembler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FISL 11</title>
		<link>http://blog.asneto.eti.br/2010/07/27/fisl-11/</link>
		<comments>http://blog.asneto.eti.br/2010/07/27/fisl-11/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 13:08:29 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Diversos]]></category>
		<category><![CDATA[FISL]]></category>
		<category><![CDATA[Porto Alegre]]></category>
		<category><![CDATA[Viagem]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=152</guid>
		<description><![CDATA[Sábado passado (24/07) fui à Porto Alegre no FISL &#8211; Fórum Internacional do Software Livre. Este ano foi a 11ª edição do evento que tem como objetivo maior divulgar as vantagens do software livre. Para saber mais: http://softwarelivre.org/fisl11 Desde que fiz o curso de Técnico em Sistemas de Informação no antigo CEFET-RS, tinha vontade de [...]]]></description>
			<content:encoded><![CDATA[<p>Sábado passado (24/07) fui à Porto Alegre no FISL &#8211; Fórum Internacional do Software Livre. Este ano foi a 11ª edição do evento que tem como objetivo maior divulgar as vantagens do software livre. Para saber mais: <a href="http://softwarelivre.org/fisl11" target="_blank">http://softwarelivre.org/fisl11</a></p>
<p>Desde que fiz o<a title="Jon 'Maddog' Hall - é uma figura!" rel="lightbox[fisl]" href="http://blog.asneto.eti.br/wp-content/uploads/2010/07/DSC04491.jpg"><img class="alignleft size-thumbnail wp-image-162" title="DSC04491" src="http://blog.asneto.eti.br/wp-content/uploads/2010/07/DSC04491-150x150.jpg" alt="" width="150" height="150" /></a> curso de Técnico em Sistemas de Informação no antigo CEFET-RS, tinha vontade de ir ao FISL e nunca conseguia. Geralmente o maior problema era o trabalho, pois o fórum começa na quarta-feira e vai até sábado. Este ano, meu amigo Davi Schneid organizou uma excursão para os &#8220;trabalhadores&#8221;, com o intuito de ir apenas no sábado. Como o valor das inscrições para &#8220;última hora&#8221; são meio abusivos (R$ 200,00) quando comparados aos preços iniciais (R$ 40,00), decidimos ir apenas para passear.</p>
<p>De uma forma geral, foi meio decepcionante para mim, pois esperava algo ainda m<a title="Gurizada show de bola!" rel="lightbox[fisl]" href="http://blog.asneto.eti.br/wp-content/uploads/2010/07/DSC04495.jpg"><img class="alignright size-thumbnail wp-image-161" title="DSC04495" src="http://blog.asneto.eti.br/wp-content/uploads/2010/07/DSC04495-150x150.jpg" alt="" width="177" height="177" /></a>aior do que já é. Como não iríamos assistir nenhuma palestra, chegamos lá e fomos olhando os stands montados. Até que tinha bastante coisa, mas não tem muito o que fazer após uma ou duas voltas pelos stands. No máximo ficar na volta do stand do IG, hehehehe.</p>
<p>No fim das contas, valeu pela companhia da gurizada da Gestum. Gosto de continuar tendo contato com eles, independente de não trabalhar mais lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/07/27/fisl-11/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ganhei! Livro ReWork</title>
		<link>http://blog.asneto.eti.br/2010/07/27/ganhei-livro-rework/</link>
		<comments>http://blog.asneto.eti.br/2010/07/27/ganhei-livro-rework/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 11:53:49 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Diversos]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[rework]]></category>
		<category><![CDATA[sorteio]]></category>
		<category><![CDATA[Vedovelli]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=154</guid>
		<description><![CDATA[No mês passado o Fábio Vedovelli fez um sorteio do livro ReWork. Para participar, bastava escrever um post sobre aplicações Web. Enviei meu post sobre Integração do CodeIgniter com o Doctrine e acabei sendo sorteado (vídeo abaixo) com um exemplar. Gostaria de parabenizar ao Fábio pela iniciativa e pela agilidade em enviar o prêmio, pois [...]]]></description>
			<content:encoded><![CDATA[<p>No mês passado o <a href="http://www.vedovelli.com.br" target="_blank">Fábio Vedovelli</a> fez um <a href="http://www.vedovelli.com.br/?p=1505" target="_blank">sorteio</a> do livro <a href="http://37signals.com/rework/" target="_blank">ReWork</a>. Para participar, bastava escrever um post sobre aplicações Web. Enviei meu post sobre <a href="http://blog.asneto.eti.br/2010/06/07/integrando-o-codeigniter-com-o-doctrine/" target="_blank">Integração do CodeIgniter com o Doctrine</a> e acabei sendo sorteado (vídeo abaixo) com um exemplar.</p>
<p>Gostaria de parabenizar ao Fábio pela iniciativa e pela agilidade em enviar o prêmio, pois 3 dias depois o livro estava na minha casa.</p>
<p><a title="Livro ReWork" rel="lightbox" href="http://blog.asneto.eti.br/wp-content/uploads/2010/07/DSC04501.jpg"><img class="aligncenter size-medium wp-image-167" title="Livro ReWork" src="http://blog.asneto.eti.br/wp-content/uploads/2010/07/DSC04501-300x200.jpg" alt="Livro ReWork" width="300" height="200" /></a></p>
<p>Pra falar a verdade, não sabia exatamente do que se tratava o livro, então nada melhor que uma resenha para mostrar isso. Uma única &#8220;googlada&#8221; e encontrei um <a href="http://miguelcavalcanti.piapara.com/2010/04/09/resenha-do-livro-rework-da-37signals/" target="_blank">post</a> no blog do <a href="http://miguelcavalcanti.piapara.com/" target="_blank">Miguel Cavalcanti</a> com a tal resenha. Vale a pena dar uma lida e, caso goste, comprar o livro.</p>
<p>Vídeo do Sorteio:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="225" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=13376019&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="225" src="http://vimeo.com/moogaloop.swf?clip_id=13376019&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/13376019">Sorteio dos livros Rework, da 37Signals</a> from <a href="http://vimeo.com/vedovelli">Fabio Vedovelli</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Detalhe que eu ganhei 2 vezes! hehehehe</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/07/27/ganhei-livro-rework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Componentes Facelets</title>
		<link>http://blog.asneto.eti.br/2010/07/23/componentes-facelets/</link>
		<comments>http://blog.asneto.eti.br/2010/07/23/componentes-facelets/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 20:52:06 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Componente]]></category>
		<category><![CDATA[Facelets]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSTL]]></category>
		<category><![CDATA[meio.mask]]></category>
		<category><![CDATA[RichFaces]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=123</guid>
		<description><![CDATA[Um dos recursos mais interessantes do JSF é a capacidade de criar componentes para o mesmo. Esta criação, as vezes, é um pouco complexa e pode não valer a pena quando o resultado é algo simples. Dessa forma, utilizando-se do Facelets, é possível criá-los utilizando-se dos componentes que já existem, como os inputText&#8217;s ou até [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos recursos mais interessantes do <strong>JSF</strong> é a capacidade de criar componentes para o mesmo. Esta criação, as vezes, é um pouco complexa e pode não valer a pena quando o resultado é algo simples. Dessa forma, utilizando-se do <strong>Facelets</strong>, é possível criá-los utilizando-se dos componentes que já existem, como os inputText&#8217;s ou até mesmo um dataTable.</p>
<p>Acredito que o maior benefício é evitar a reescrita de código ou a famosa duplicação de código, que geralmente nos remete à código do backend, mas dessa vez na view.</p>
<p>Por exemplo, tenho que desenvolver um sistema que possui 5 cadastros do tipo <em>CRUD</em> para alimentar a base com informações. Pois bem, quais os componentes necessários para um <em>CRUD</em>? Um dataTable, para apresentar a lista dos registros do banco e um formulário para cadastrar e editar os dados. Partindo desse princípio, o que normalmente nós faríamos é criar um primeiro <em>CRUD</em> completo para servir de &#8220;base&#8221; para os outros e fazer o famoso copy/paste, trocar os valores dos formulários e ta pronto. Uma maravilha! Ou não&#8230;</p>
<p>Duas semanas depois, nós estámos já desenvolvendo alguns recursos necessários para a aplicação e uma mudança de layout foi realizada: agora as mensagens de validação de campos devem ser apresentadas abaixo de cada campo. Ferrou! Retrabalho editando todos os formulários que nós tínhamos.</p>
<p>É aqui que entra o nosso amigo Facelets. Com ele nós podemos criar componentes para diversos propósitos, como, por exemplo, formulários. Sei que já existe o h:inputText e a minha ideia não é escrever um novo inputText, mas sim, incrementá-lo. A maioria dos formulários possui a mesma estrutura: &#8220;Label:&#8221; [Campo]. Então, normalmente nós faríamos o seguinte:</p>
<pre class="brush:xml">﻿﻿&lt;h:outputLabel for="nome" id="nomeLabel" value="Nome: " /&gt;
&lt;h:inputText id="nome" value="#{mBean.user.name}" required="true" /&gt;
&lt;h:message for="nome" /&gt;</pre>
<p>Isso iria se repetir para cada campo do tipo texto do todos os formulários do sistema. No exemplo, eu já adicionei o h:message para o input, mas na nossa história isso não existia no <em>CRUD</em> &#8220;base&#8221; e tivemos que alterar tudo depois. Agora vamos criar um componente que apresente esse nosso formato usando apenas uma tag:</p>
<pre class="brush:xml">﻿&lt;asn:formInput id="nome" label="Nome: " value="#{userMBean.nome}" required="true" /&gt;</pre>
<p>O resultado deverá ser o mesmo apresentado antes, porém temos o componente centralizado, nos possibilitando de alterar apenas um arquivo para que todo o sistema se encaixe no requisito.</p>
<p>Mas como a gente faz isso tio? Bueno, mãos à obra:</p>
<h3>Criando o componente</h3>
<p>A primeira coisa a fazer, é escrever o componente. Monte tudo que você precisar. O meu ficou assim:</p>
<pre class="brush:xml">﻿&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"&gt;

 &lt;ui:component&gt;
     &lt;h:outputLabel for="#{id}" id="#{id}Label" value="#{label}" /&gt;
     &lt;h:inputText id="#{id}" value="#{value}" required="#{required}" /&gt;
     &lt;h:message for="#{id}" /&gt;
 &lt;/ui:component&gt;
&lt;/html&gt;
</pre>
<p>Os valores id, value e required, serão os parâmetros do nosso componente.</p>
<h3>Criando a TagLib</h3>
<p>Feito isso, precisamos criar a nossa taglib:</p>
<pre class="brush:vb">&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
    "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd"&gt;

&lt;facelet-taglib&gt;
    &lt;namespace&gt;http://asneto.eti.br/java/jsf&lt;/namespace&gt;
    &lt;tag&gt;
         &lt;tag-name&gt;formInput&lt;/tag-name&gt;
         &lt;source&gt;formInput.xhtml&lt;/source&gt;
    &lt;/tag&gt;
&lt;/facelet-taglib&gt;</pre>
<p>Observe que o &#8220;source&#8221; é o caminho para o arquivo que contém o nosso componente. Como eu deixei na mesma pasta da taglib, apenas coloquei o nome do arquivo. Agora vamos registrar a taglib na nossa aplicação. Abra o seu web.xml e coloque:</p>
<pre class="brush:xml">&lt;context-param&gt;
    &lt;param-name&gt;facelets.LIBRARIES&lt;/param-name&gt;
    &lt;param-value&gt;/WEB-INF/components/asneto.taglib.xml&lt;/param-value&gt;
&lt;/context-param&gt;</pre>
<p>Observe o caminho para o xml da taglib. Foi nesse caminho que salvei os arquivos. Você pode colocar em qualquer lugar, mas preferencialmente coloque fora das pastas públicas do projeto.</p>
<h3>Testando</h3>
<p>Bacana, vamos testar agora. Crie um formulário de exemplo utilizando o componente recém criado:</p>
<pre class="brush:xml">&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:asn="http://asneto.eti.br/java/jsf"&gt;
&lt;head&gt;
    &lt;title&gt;Teste&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    Teste de componentes
    &lt;h:form&gt;
        &lt;asn:formInput id="nome" label="Nome: " value="#{userMBean.nome}" required="true" /&gt;
    &lt;/h:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>E o resultado no browser:</p>
<p style="text-align: center;"><strong><a href="http://blog.asneto.eti.br/wp-content/uploads/2010/07/tela.png"><img class="size-full wp-image-141 aligncenter" title="Resultado do componente" src="http://blog.asneto.eti.br/wp-content/uploads/2010/07/tela.png" alt="" width="256" height="49" /></a><br />
</strong></p>
<p>Legal, mas esse exemplo é bobinho né? Claro, é apenas pra exemplificar. Tive um caso real, onde os <em>CRUD</em>&#8216;s tinham modais de confirmação, tipo o &#8220;alert()&#8221; do JavaScript, mas mais moderno. Para não ficar repetindo código em todos os <em>CRUD</em>&#8216;s, criamos um componente que tinha um rich:modalPanel com botões &#8220;Sim&#8221; e &#8220;Não&#8221; e recebia uma mensagem como parâmetro (além de muitos outros como a action do botão sim e tal). Isso facilitou bastante, pois apenas mexendo no componente, todo o sistema estava alterado.</p>
<h2>Incrementando o exemplo</h2>
<h3>Criando um TLD para o componente.</h3>
<p>Os &#8220;TLD&#8221; (taglib descriptor) são a documentação do nosso componente. É desse arquivo que as IDE&#8217;s lêem para exibir as informações no autocomplete:</p>
<pre class="brush:xml">&lt;!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"&gt;

&lt;taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"&gt;
    &lt;tlib-version&gt;1.0&lt;/tlib-version&gt;
    &lt;jsp-version&gt;2.0&lt;/jsp-version&gt;
    &lt;short-name&gt;Components&lt;/short-name&gt;
    &lt;uri&gt;http://asneto.eti.br/java/jsf&lt;/uri&gt;
    &lt;display-name&gt;ASNeto TagLibrary&lt;/display-name&gt;
    &lt;tag&gt;
         &lt;name&gt;formInput&lt;/name&gt;
         &lt;tag-class /&gt;
         &lt;body-content&gt;empty&lt;/body-content&gt;
         &lt;description&gt;
             Componente para campos de formulários. Exibe uma label, o campo do tipo input e a mensagem de validação.
         &lt;/description&gt;
         &lt;attribute&gt;
             &lt;name&gt;id&lt;/name&gt;
             &lt;required&gt;true&lt;/required&gt;
             &lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
             &lt;type&gt;java.lang.String&lt;/type&gt;
             &lt;description&gt;
                 Id do componente.
             &lt;/description&gt;
         &lt;/attribute&gt;
         &lt;attribute&gt;
             &lt;name&gt;label&lt;/name&gt;
             &lt;required&gt;false&lt;/required&gt;
             &lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
             &lt;type&gt;java.lang.String&lt;/type&gt;
             &lt;description&gt;
                 Label do campo.
             &lt;/description&gt;
         &lt;/attribute&gt;
         &lt;attribute&gt;
             &lt;name&gt;value&lt;/name&gt;
             &lt;required&gt;true&lt;/required&gt;
             &lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
             &lt;type&gt;java.lang.String&lt;/type&gt;
             &lt;description&gt;
                 Valor ao qual o input está associado.
             &lt;/description&gt;
         &lt;/attribute&gt;
         &lt;attribute&gt;
             &lt;name&gt;required&lt;/name&gt;
             &lt;required&gt;false&lt;/required&gt;
             &lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
             &lt;type&gt;java.lang.Boolean&lt;/type&gt;
             &lt;description&gt;
                 Informa se o campo é obrigatório ou não.
             &lt;/description&gt;
         &lt;/attribute&gt;
    &lt;/tag&gt;
&lt;/taglib&gt;</pre>
<h3>Criando parâmetros não obrigatórios</h3>
<p>Nossos componentes devem poder receber parâmetros não obrigatórios. Digamos que no nosso sistema, todas as labels são com cor vermelha e os inputs tem borda verde. Vamos setar um styleClass direto no componente? Pode ser, vai funcionar, mas estaremos engessando nosso componente. O ideal é possibilitarmos que a classe CSS para a label e para o input sejam passados por parâmetro.</p>
<p>Com as devidas alterações, nosso componente agora ficou assim:</p>
<pre class="brush:xml">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	    xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:c="http://java.sun.com/jsp/jstl/core"&gt;

    &lt;ui:component&gt;
        &lt;c:if test="#{styleClass}"&gt;
            &lt;c:set value="false" var="styleClass" /&gt;
        &lt;/c:if&gt;

        &lt;c:if test="#{labelStyleClass}"&gt;
            &lt;c:set value="false" var="labelStyleClass" /&gt;
        &lt;/c:if&gt;

        &lt;h:outputLabel for="#{id}" id="#{id}Label" value="#{label}" styleClass="#{labelStyleClass}" /&gt;
        &lt;h:inputText id="#{id}" value="#{value}" required="#{required}" styleClass="#{styleClass}" /&gt;
        &lt;h:message for="#{id}" /&gt;
    &lt;/ui:component&gt;
&lt;/html&gt;
</pre>
<p>Observem que eu agora é possível passar a classe CSS para a label e/ou para o nosso input. Eu usei JSTL pois ela é executada antes do parse do Facelets. Portanto, caso o parâmetro não tenha sido setado, o JSTL vai criar uma variável local (através do c:set) possibilitando o uso da mesma.</p>
<h3>Usando máscara com jQuery</h3>
<p>Um caso que sempre vejo na lista JavaSF, é referente ao uso de máscaras com jQuery (meio.mask, input.mask). O problema é que o reRender realizado acaba não chamando o JavaScript para aplicar a máscara denovo, fazendo com que os inputs percam a máscara setada. Uma boa maneira de resolver este problema, é usar um componente que, além de ter a máscara, tenha a chamada JavaScript para a aplicação da mesma. Dessa forma, ao dar um reRender no componente, a máscara é aplicada junto. Neste exemplo vou usar o plugin meio.mask que pode ser baixado do <a href="http://www.meiocodigo.com/projects/meiomask/" target="_blank">site oficial</a>.</p>
<p>Alterando nosso componente para receber máscara:</p>
<pre class="brush:xml">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	    xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:rich="http://richfaces.org/rich"
            xmlns:c="http://java.sun.com/jsp/jstl/core"&gt;

    &lt;ui:component&gt;

        &lt;c:if test="#{!styleClass}"&gt;
            &lt;c:set value="false" var="styleClass" /&gt;
        &lt;/c:if&gt;

        &lt;c:if test="#{!labelStyleClass}"&gt;
            &lt;c:set value="false" var="labelStyleClass" /&gt;
        &lt;/c:if&gt;

        &lt;c:if test="#{!mask}"&gt;
            &lt;c:set value="" var="mask" /&gt;
            &lt;c:set value="false" var="useMask" /&gt;
        &lt;/c:if&gt;

        &lt;c:if test="#{mask}"&gt;
            &lt;c:set value="true" var="useMask" /&gt;
        &lt;/c:if&gt;

        &lt;h:outputLabel for="#{id}" id="#{id}Label" value="#{label}" styleClass="#{labelStyleClass}" /&gt;
        &lt;h:inputText id="#{id}" value="#{value}" required="#{required}" styleClass="#{styleClass}" /&gt;
        &lt;h:message for="#{id}" /&gt;

        &lt;rich:jQuery selector="##{id}" query="setMask('#{mask}')" timing="immediate" /&gt;

    &lt;/ui:component&gt;
&lt;/html&gt;</pre>
<p>Agora temos o novo parâmetro &#8220;mask&#8221; que não é obrigatório. Para usarmos esse input, temos que carregar o script do meio.mask. Eu fiz isso na tela onde eu uso o input, assim caso não seja usado nenhuma máscara, não há necessidade de carregar o script.</p>
<p>Usando nosso componente alterado:</p>
<pre class="brush:xml">&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:asn="http://asneto.eti.br/java/jsf"
      xmlns:a4j="http://richfaces.org/a4j"&gt;
    &lt;head&gt;
        &lt;script type="text/javascript" src="js/jquery.meio.mask.js" /&gt;
        &lt;title&gt;Teste&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        Teste de componentes
        &lt;h:form id="form" prependId="false"&gt;
            &lt;h:panelGroup id="bloco"&gt;
                &lt;asn:formInput id="nome" label="Nome: " value="#{userMBean.nome}" required="true" mask="99:99" /&gt;

                &lt;br /&gt;

                &lt;a4j:commandLink value="reRenderizar Bloco"&gt;
                    &lt;a4j:support event="onclick" reRender="bloco" /&gt;
                &lt;/a4j:commandLink&gt;
            &lt;/h:panelGroup&gt;
        &lt;/h:form&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Adicionei um link para reRenderizar o bloco, mostrando como a máscar permanece, mesmo após o recarregamento.</p>
<h2>Finalizando</h2>
<p>O Facelets facilita a nossa vida, basta saber utilizá-lo. Lembrando, este recurso serve para evitar a reescrita de código na View, caso você precise criar um componente novo, o melhor é utilizar componentes nativos para JSF, usando código Java. Fiz esse post meio rápido, então qualquer erro encontrado, por favor me notifiquem para que eu corriga o post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/07/23/componentes-facelets/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java 4-ever &#8211; o filme</title>
		<link>http://blog.asneto.eti.br/2010/06/26/java-4-ever-o-filme/</link>
		<comments>http://blog.asneto.eti.br/2010/06/26/java-4-ever-o-filme/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 19:38:59 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=96</guid>
		<description><![CDATA[Um vídeo feito para divulgar o evento JavaZone de 2010 na Noruega, apresenta, de uma forma divertida, a &#8220;guerra&#8221; entre as plataformas Java e .NET. Destaque para a criatividade nos nomes dos personagens. Divirta-se!]]></description>
			<content:encoded><![CDATA[<p>Um vídeo feito para divulgar o evento JavaZone de 2010 na Noruega, apresenta, de uma forma divertida, a &#8220;guerra&#8221; entre as plataformas Java e .NET.</p>
<p>Destaque para a criatividade nos nomes dos personagens. Divirta-se!</p>
<p><object width="580" height="360"><param name="movie" value="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=pt_BR&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=pt_BR&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="360"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/06/26/java-4-ever-o-filme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atualize sua IDE</title>
		<link>http://blog.asneto.eti.br/2010/06/23/atualize-sua-ide/</link>
		<comments>http://blog.asneto.eti.br/2010/06/23/atualize-sua-ide/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 01:06:23 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=90</guid>
		<description><![CDATA[Neste mês, duas importantes IDE&#8217;s de desenvolvimento receberam atualizações. O Netbeans e o Eclipse. O Netbeans chega na sua versão 6.9. Confira o vídeo abaixo para conhecer os novos recursos: O Netbeans possui versões para Windows, Linux, MAC e Solaris. Acesse o site da IDE e faça o download. Já o Eclipse teve a sua [...]]]></description>
			<content:encoded><![CDATA[<p>Neste mês, duas importantes IDE&#8217;s de desenvolvimento receberam atualizações. O <a href="http://netbeans.org/" target="_blank"><strong>Netbeans</strong></a> e o <a href="http://eclipse.org" target="_blank"><strong>Eclipse</strong></a>.</p>
<p style="text-align: center;"><a href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/Netbeans.png"><img class="size-medium wp-image-91 aligncenter" title="Netbeans 6.9" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/Netbeans-300x190.png" alt="" width="300" height="190" /></a></p>
<p>O <strong>Netbeans</strong> chega na sua versão 6.9. Confira o vídeo abaixo para conhecer os novos recursos:<br />
<object id="flashObj" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="486" height="322" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="videoId=95732633001&amp;playerID=1640183659&amp;domain=embed&amp;dynamicStreaming=true" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://c.brightcove.com/services/viewer/federated_f9/1640183659?isVid=1" /><param name="name" value="flashObj" /><param name="flashvars" value="videoId=95732633001&amp;playerID=1640183659&amp;domain=embed&amp;dynamicStreaming=true" /><param name="allowfullscreen" value="true" /><embed id="flashObj" type="application/x-shockwave-flash" width="486" height="322" src="http://c.brightcove.com/services/viewer/federated_f9/1640183659?isVid=1" name="flashObj" allowscriptaccess="always" swliveconnect="true" allowfullscreen="true" seamlesstabbing="false" base="http://admin.brightcove.com" flashvars="videoId=95732633001&amp;playerID=1640183659&amp;domain=embed&amp;dynamicStreaming=true" bgcolor="#FFFFFF"></embed></object></p>
<p>O Netbeans possui versões para Windows, Linux, MAC e Solaris. <a href="http://netbeans.org/downloads/index.html" target="_blank">Acesse o site</a> da IDE e faça o download.</p>
<p style="text-align: center;"><a href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/helios.png"><img class="size-medium wp-image-92 aligncenter" title="Eclipse Helios" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/helios-300x194.png" alt="" width="300" height="194" /></a></p>
<p>Já o <strong>Eclipse</strong> teve a sua versão 3.6 apresentada sob o codinome Helios. As 10 principais novidades do Helios são:</p>
<ol>
<li><a href="http://eclipsesource.com/blogs/2010/06/10/resource-improvements-helios-feature-10/" target="_blank">Resource  Improvements</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/11/feature-based-configurations-top-eclipse-helios-feature-9/" target="_blank">Feature  based configurations</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/14/api_tools_top_eclipse_helios_feature_8/" target="_blank">Improvements  to API Tools</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/15/java-ide-improvements-top-eclipse-helios-feature-7/" target="_blank">Java  IDE Improvements</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/16/target-platform-improvements-top-eclipse-helios-feature-6/" target="_blank">Target  Platform Improvements</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/17/p2-api-and-the-b3-aggregator-top-eclipse-helios-feature-5/" target="_blank">p2  API and the b3 Aggregator</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/18/mpc_eclipse_helios_feature_4/" target="_blank">MarketPlace  Client</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/21/emf-riena-and-rap-integration-top-eclipse-helios-feature-3/" target="_blank">EMF,  Riena and RAP integration</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/22/git-support-eclipse-helios-feature-2/" target="_blank">Git  Support at Eclipse</a></li>
<li><a href="http://eclipsesource.com/blogs/2010/06/23/top-10-eclipse-helios-features/" target="_blank">Xtext, Version 1.0.</a></li>
</ol>
<p>Com diversas opções de download o Eclipse suporta os sistemas operacionais Windows, Linux e MAC. <a href="http://eclipse.org/helios/" target="_blank">Acesse a página de downloads</a> do Helios para baixar a versão que melhor servir para o seu desenvolvimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/06/23/atualize-sua-ide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrando o CodeIgniter com o Doctrine</title>
		<link>http://blog.asneto.eti.br/2010/06/07/integrando-o-codeigniter-com-o-doctrine/</link>
		<comments>http://blog.asneto.eti.br/2010/06/07/integrando-o-codeigniter-com-o-doctrine/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 02:52:42 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=57</guid>
		<description><![CDATA[Bom, como esperado, só hoje eu tive tempo de atualizar o blog, mas espero, em breve, diminuir este tempo entre um post e outro. Inspirado por um artigo que encontrei na web, vou postar aqui uma forma de integrar o CodeIgniter com o Doctrine. Mas como diria meu amigo Jack, vamos por partes. O que [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, como esperado, só hoje eu tive tempo de atualizar o blog, mas espero, em breve, diminuir este tempo entre um post e outro. Inspirado por um <a href="http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup" target="_blank">artigo</a> que encontrei na web, vou postar aqui uma forma de integrar o CodeIgniter com o Doctrine. Mas como diria meu amigo Jack, vamos por partes.</p>
<h2>O que é CodeIgniter?</h2>
<p>O <a href="http://www.codeigniter.com" target="_blank">CodeIgniter</a> é um <a href="http://pt.wikipedia.org/wiki/Framework" target="_blank">framework</a> de desenvolvimento de aplicações em PHP. Seu objetivo é possibilitar que o desenvolvedor crie projetos mais rapidamente do que se estivesse codificando do zero. Isso é possível por meio de um abrangente conjunto de bibliotecas voltadas às tarefas mais comuns, de uma interface e uma estrutura lógica simples para acesso àquelas bibliotecas. O CI, permite ainda que se mantenha o foco no projeto, minimizando a quantidade de código que seria necessário desenvolver, sem o uso de um framework.</p>
<p>Meu objetivo não é esplanar tudo sobre o CodeIgniter, portanto para saber mais vou deixar alguns links:</p>
<ul>
<li><a href="http://www.codeigniter.com" target="_blank">Site oficial do CodeIgniter</a></li>
<li><a href="http://codeigniter.com/user_guide/" target="_blank">Manual do CodeIgniter (Inglês)</a></li>
<li><a href="http://www.codeigniter.com.br/manual/index.html" target="_blank">Manual do CodeIgniter (Português)</a></li>
</ul>
<h2>O que é Doctrine?</h2>
<p>O <a href="http://en.wikipedia.org/wiki/Doctrine_%28PHP%29" target="_blank">Doctrine</a> é um <a href="http://pt.wikipedia.org/wiki/Framework" target="_blank">framework</a> de <a href="http://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional" target="_blank">Mapeamento Objeto-Relacional</a> (ou ORM) para PHP. O ORM é uma técnica de desenvolvimento utilizada para reduzir a impedância  da programação orientada aos objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes. É um recurso amplamento utilizando em outras linguagens como Java com o Hibernate ou .NET com NHibernate.</p>
<h2>Porque fazer essa integração?</h2>
<p>Boa pergunta. Porque diabos eu tenho que fazer isso? Eu comecei a programar com PHP e depois comecei a mexer com Java. Após todo o conhecimento adquirido com o Java, depois de saber as facilidades que o ORM proporciona, fica complicado de voltar a trabalhar no modo &#8220;manual&#8221;. Claro que o ORM não é a melhor coisa que existe, mas ele ajuda bastante, principalmente na hora de criar coisas básicas como CRUD&#8217;s e listagens simples. Com essa integração vai ficar fácil criar, editar, atualizar e excluir registros de uma tabela do banco de dados, tratando tudo como Objetos. Existem outros benefícios que podem ser lidos nessa <a href="http://www.doctrine-project.org/documentation/manual/1_1/en/introduction" target="_blank">introdução ao Doctrine</a>.</p>
<p>Para visualizar melhor o que vai mudar, este é o modelo MVC com o fluxo do CodeIgniter:</p>
<p style="text-align: center;"><a title="Padrão MVC do CodeIgniter" rel="lightbox" href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/mvc_ci_hoje.jpg"><img class="size-medium wp-image-61 aligncenter" title="Padrão MVC do CodeIgniter" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/mvc_ci_hoje-300x228.jpg" alt="" width="300" height="228" /></a></p>
<p>E agora, onde vai entrar o Doctrine:</p>
<p style="text-align: center;"><a title="Padrão MVC - CodeIgniter + Doctrine" rel="lightbox" href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/mvc_ci_doctrine.jpg"><img class="size-medium wp-image-62 aligncenter" title="Padrão MVC - CodeIgniter + Doctrine" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/mvc_ci_doctrine-300x228.jpg" alt="" width="300" height="228" /></a></p>
<p>Mas o que significa cada uma dessas novas camadas?</p>
<p><strong>Doctrine ORM: </strong>é uma API de mapeamento Objeto-Relacional. Faz a ponte entre o model e as entidades.</p>
<p><strong>Doctrine DBAL: </strong>API de abstração de banco de dados.</p>
<p><strong>PDO:</strong> API cross-database. O CI já possui uma API semelhante, que permite o uso de diversos bancos, mas o doctrine vai utilizar uma API própria. No fim das contas, nada se perde, pois essa API tem a mesma função da API já existente no CI.</p>
<h2>Instalando o CodeIgniter</h2>
<p>Chega de blá blá blá. Vamos para a parte boa. A primeira coisa a se fazer é uma instalação clean do CI. Para isto basta baixar a última versão no site. No momento deste post, a última versão do CI é a 1.7.2.</p>
<p><a href="http://codeigniter.com/downloads/" target="_blank">Download CodeIgniter</a></p>
<p>Após realizar o download, extraia o conteúdo da pasta para o local de sua preferência. A estrutura deverá ser algo assim:</p>
<p style="text-align: center;"><a title="Estrutura de pastas do CodeIgniter" rel="lightbox" href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/estrutura_ci.png"><img class="size-medium wp-image-66 aligncenter" title="Estrutura de pastas do CodeIgniter" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/estrutura_ci-151x300.png" alt="" width="151" height="300" /></a></p>
<p>A pasta &#8220;user_guide&#8221; é o guia do usuário em inglês. Você não vai precisar dela. Agora mova a pasta raiz do CI para o seu servidor web e ao acessá-lo pelo browser você deve ver uma tela de boas vindas como essa:</p>
<p style="text-align: center;"><a title="Tela de boas vindas do CodeIgniter" rel="lightbox" href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/tela_boas_vindas.png"><img class="size-medium wp-image-67 aligncenter" title="Tela de boas vindas do CodeIgniter" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/tela_boas_vindas-300x139.png" alt="" width="300" height="139" /></a></p>
<h2 style="text-align: left;">Como funciona o CodeIgniter</h2>
<p>Os <em>controllers</em> são chamados a cada requisição. Eles estão localizados na pasta:</p>
<pre>/system/application/controllers/</pre>
<p>A estrutura das URL&#8217;s estão diretamente ligadas aos controlers, dessa forma:</p>
<pre>http://localhost/codeigniter/index.php/NOME_CONTROLLER/NOME_FUNCTION</pre>
<p>Faça um teste, crie um novo <em>controller</em> ou modifique o que já existe (<em>welcome.php</em>) para entender melhor o funcionamento. Recomento que seja feita uma leitura no manual (links no topo). Lá existe uma seção explicando o funcionamento de cada camada do CodeIgniter.</p>
<h2>Instalando o Doctrine</h2>
<p>Baixe a última versão estável do doctrine pelo site oficial:</p>
<p><a href="http://www.doctrine-project.org/projects/orm/download" target="_blank">Download Doctrine</a></p>
<p>Crie a pasta:</p>
<pre>/system/plugins/doctrine</pre>
<p>Extraia o conteúdo da pasta &#8220;lib&#8221; do pacote do Doctrine e copie para a pasta recém criada. A estrutura deverá ser esta:</p>
<p style="text-align: center;"><a title="Estrutura de arquivos CodeIgniter + Doctrine" rel="lightbox" href="http://blog.asneto.eti.br/wp-content/uploads/2010/06/estrutura_ci_doctrine1.png"><img class="size-medium wp-image-84 aligncenter" title="Estrutura de arquivos CodeIgniter + Doctrine" src="http://blog.asneto.eti.br/wp-content/uploads/2010/06/estrutura_ci_doctrine1-130x300.png" alt="" width="130" height="300" /></a></p>
<p style="text-align: left;">Agora precisamos criar o arquivo do plugin que vai interligar o Doctrine ao CI. Crie o arquivo:</p>
<pre>/system/plugins/doctrine_pi.php</pre>
<p>E copie o conteúdo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Carrega a biblioteca do Doctrine</span>
<span style="color: #b1b100;">require_once</span> BASEPATH<span style="color: #339933;">.</span><span style="color: #0000ff;">'/plugins/doctrine/lib/Doctrine.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Carrega as configurações de banco de dados do CodeIgniter</span>
<span style="color: #b1b100;">require_once</span> APPPATH<span style="color: #339933;">.</span><span style="color: #0000ff;">'/config/database.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Permite ao Doctrine carregar automaticamente as classes Model</span>
<span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Doctrine'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'autoload'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Precisamos carregar nossas conexões no Doctrine_Manager</span>
<span style="color: #666666; font-style: italic;">// Este loop permite a utilização de múltiplas conexões</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$db</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$connection_name</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$db_values</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Primeiro convertemos para o formato DSN</span>
<span style="color: #000088;">$dsn</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$connection_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'dbdriver'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span>
<span style="color: #0000ff;">'://'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$connection_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span>
<span style="color: #0000ff;">':'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$connection_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">'@'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$connection_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hostname'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span>
<span style="color: #0000ff;">'/'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$connection_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'database'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
Doctrine_Manager<span style="color: #339933;">::</span><span style="color: #004000;">connection</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dsn</span><span style="color: #339933;">,</span><span style="color: #000088;">$connection_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// A class Model do CodeIgniter precisa ser carregada</span>
<span style="color: #b1b100;">require_once</span> BASEPATH<span style="color: #339933;">.</span><span style="color: #0000ff;">'/libraries/Model.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Localização dos models para o Doctrine</span>
Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">loadModels</span><span style="color: #009900;">&#40;</span>APPPATH<span style="color: #339933;">.</span><span style="color: #0000ff;">'/models'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Configurações Opcionais</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Permite o uso de &quot;mutators&quot;</span>
Doctrine_Manager<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>
	Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_AUTO_ACCESSOR_OVERRIDE</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Seta todas as colunas para notnull e unsigned (para ints) por padrão</span>
Doctrine_Manager<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>
	Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_DEFAULT_COLUMN_OPTIONS</span><span style="color: #339933;">,</span>
	<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Seta para todas as tabelas uma chave primária chamada &quot;id&quot; de 4 bytes</span>
Doctrine_Manager<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>
	Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_DEFAULT_IDENTIFIER_OPTIONS</span><span style="color: #339933;">,</span>
	<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Configurando o banco de dados</h2>
<p>Crie uma tabela no banco de dados de sua preferência. Aqui eu uso MySQL e vou criar um banco de dados chamado &#8220;ci_doctrine&#8221;, sem nenhuma coluna. Depois configure a conexão com o banco de dados no arquivo:</p>
<pre>/system/application/config/database.php</pre>
<p>Encontre as linhas abaixo e troque pelas configurações do seu servidor:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hostname'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;root&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'database'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;ci_doctrine&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'dbdriver'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;mysql&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Últimas configurações</h2>
<p>Agora precisamos fazer as configurações finais. Primeiro abra o arquivo</p>
<pre>/system/application/config/config.php</pre>
<p>E altere a seguinte linha:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Aqui deve ser definido o caminho da sua aplicação. No meu caso é:</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'base_url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://localhost/codeigniter/&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Agora abra o arquivo:</p>
<pre>/system/application/config/autoload.php</pre>
<p>E altere a seguinte linha:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'plugin'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'doctrine'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Pronto!</h2>
<p>Agora vamos testar nossa integração.</p>
<h2>Testando a integração</h2>
<p>Lembram da base &#8220;ci_doctrine&#8221; que criamos lá encima? Agora vamos adicionar uma tabela à ela. Execute o SQL abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">USER</span> <span style="color: #66cc66;">&#40;</span>
	id <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
	username <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	password <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	first_name <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	last_name <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	<span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #66cc66;">&#40;</span>username<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Agora crie o Model da tabela &#8220;user&#8221; e salve na pasta:</p>
<pre>/system/application/models/</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> User <span style="color: #000000; font-weight: bold;">extends</span> Doctrine_Record <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setTableDefinition<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'first_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'last_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Explicando:</p>
<ul>
<li>Os models devem extender de &#8220;Doctrine_Record&#8221; e não mais de &#8220;Model&#8221;.</li>
<li>Na função setTableDefinition, devemos definir qual a estrutura da tabela à qual este model está relacionado</li>
<li>Por padrão, o Doctrine vai tentar relacionar esta classe à uma tabela com o mesmo nome, neste caso &#8220;user&#8221;. Isto pode ser modificado.</li>
<li>No nosso arquivo doctrine_pi.php que criamos agora a pouco, definimos que todas as tabelas possuem uma primary key chamada id, portanto não precisamos declará-la neste momento.</li>
</ul>
<h2>Adicionando usuários</h2>
<p>Para testar nossa integração, vamos criar um controller chamado usermanager.php. Para isto copie o código a seguir no arquivo:</p>
<pre>/system/application/controllers/usermanager.php</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Usermanager <span style="color: #000000; font-weight: bold;">extends</span> Controller <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> user_test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$u</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #339933;">;</span>
		<span style="color: #000088;">$u</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'fulano'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'12345'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">first_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Fulano'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">last_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'de Tal'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$u2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #339933;">;</span>
		<span style="color: #000088;">$u2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Usuário'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Senha'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">first_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Nome'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">last_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Sobrenome'</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$u2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Acima criamos 2 usuários, setamos seus valores, e apenas chamando o método &#8220;save&#8221; temos os dados persistidos na tabela &#8220;user&#8221;.</p>
<ul>
<li>Podemos acessar as colunas da tabela como se fossem atributos da nossa classe, classe-&gt;atributo.</li>
<li>Outra diferença é na forma de carregar os models. Pelo padrão do CodeIgniter, tínhamos que carregar os models toda vez que precisássemos utilizá-los (ex: $this-&gt;load-&gt;model(&#8216;modelname&#8217;)). Agora basta instanciar o model como um objeto, pois o Doctrine tem a permissão de auto carregar os models.</li>
<li>Não foi preciso criar o método &#8220;save&#8221; dentro do nosso model, o Doctrine disponibiliza métodos genéricos a partir da classe pai de cada model, a &#8220;Doctrine_Record&#8221;.</li>
</ul>
<p>Agora acesse: <a href="http://localhost/codeigniter/index.php/usermanager/user_test">http://localhost/codeigniter/index.php/usermanager/user_test</a></p>
<p>Depois acesse seu banco de dados e perceba que os 2 registros foram gravados na tabela user.</p>
<p>Agora eu gostaria de saber do vocês, o que acharam do tutorial? Dúvidas? Críticas? Sugestões?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/06/07/integrando-o-codeigniter-com-o-doctrine/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Programas para Android</title>
		<link>http://blog.asneto.eti.br/2010/05/27/programas-para-android/</link>
		<comments>http://blog.asneto.eti.br/2010/05/27/programas-para-android/#comments</comments>
		<pubDate>Fri, 28 May 2010 01:00:02 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[BuscarCEP]]></category>
		<category><![CDATA[Notepad]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=18</guid>
		<description><![CDATA[Comecei a me interessar no Android há uns 2 ou 3 meses atrás. Li uns artigos, fiz uns testes, rodei umas bobagens no emulador, mas o que eu queria mesmo é ver a aplicação rodando em um aparelho real. Fiz meus planos e então comprei um Samsung Galaxy Lite com Android 2.1. Então, novamente fiz [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei a me interessar no Android há uns 2 ou 3 meses atrás. Li uns artigos, fiz uns testes, rodei umas bobagens no emulador, mas o que eu queria mesmo é ver a aplicação rodando em um aparelho real. Fiz meus planos e então comprei um <a href="http://www.samsung.com/br/consumer/cellular-phone/cellular-phone/touchscreen/GT-I5700HKLZVV/index.idx?pagetype=prd_detail" target="_blank">Samsung Galaxy Lite</a> com Android 2.1. Então, novamente fiz uns exemplos, um HelloWorld, tive umas ideias interessantes que ainda não sairam do papel, fiz um aplicativo para o Twitpic que não funcionou tão bem quanto eu esperava e depois me aventurei no exemplo de <a href="http://developer.android.com/resources/tutorials/notepad/notepad-extra-credit.html">bloco de notas</a>, do site do Android, que foi o primeiro aplicativo estável e &#8220;útil&#8221;. Digo isso, porque ele nem é tão útil assim, mas até que eu uso. O detalhe é que existem diversas aplicações com o mesmo propósito e com muito mais recursos, serve para aprendizado. Aproveitei esse exemplo pra dar uma fuçada, dei umas mexidas no layout, adicionei uns ícones e saiu isso:</p>
<p style="text-align: center;"><a rel="lightbox-notepad" href="http://blog.asneto.eti.br/wp-content/uploads/2010/05/Notepad-1.png"><img class="alignnone size-medium wp-image-25" title="Notepad - Tela Inicial" src="http://blog.asneto.eti.br/wp-content/uploads/2010/05/Notepad-1-202x300.png" alt="" width="202" height="300" /></a><a rel="lightbox-notepad" href="http://blog.asneto.eti.br/wp-content/uploads/2010/05/notepad-2.png"><img class="alignnone size-medium wp-image-27" title="Notepad - Criando uma nota" src="http://blog.asneto.eti.br/wp-content/uploads/2010/05/notepad-2-202x300.png" alt="" width="202" height="300" /></a></p>
<p style="text-align: center;"><a rel="lightbox-notepad" href="http://blog.asneto.eti.br/wp-content/uploads/2010/05/notepad-3.png"><img class="alignnone size-medium wp-image-29" title="Notepad - Lista de notas" src="http://blog.asneto.eti.br/wp-content/uploads/2010/05/notepad-3-201x300.png" alt="" width="201" height="300" /></a><a rel="lightbox-notepad" href="http://blog.asneto.eti.br/wp-content/uploads/2010/05/notepad-4.png"><img class="alignnone size-medium wp-image-30" title="Notepad - Operações" src="http://blog.asneto.eti.br/wp-content/uploads/2010/05/notepad-4-200x300.png" alt="" width="200" height="300" /></a></p>
<p>Pra quem tiver interesse em baixar:</p>
<p>- Download <a href="http://blog.asneto.eti.br/wp-content/uploads/Notepad_v0.1_20100527_ASNeto.apk" target="_blank">Notepad_v0.1_20100527_ASNeto.apk</a> (clique com o direito, e &#8220;Salvar destino como&#8230;&#8221;)</p>
<p>- Download do <a href="http://blog.asneto.eti.br/wp-content/uploads/Notepad_v0.1_20100527_ASNeto-src.zip">Código Fonte</a></p>
<p>Mas, voltando ao assunto, andei procurando WebServices públicos pra desenvolver aplicações de consulta pelo Android. Tive umas ideias e acredito que vou conseguir colocar algumas em prática. Ontem então eu comecei brincando com um aplicativo que até já existe no Market, mas fiz como hobby. Criei um aplicativo para consultar o endereço a partir de um CEP.</p>
<p style="text-align: center;"><a rel="lightbox-buscarcep" href="http://blog.asneto.eti.br/wp-content/uploads/2010/05/buscarcep-1.png"><img class="alignnone size-medium wp-image-36" title="BuscarCEP - Tela inicial" src="http://blog.asneto.eti.br/wp-content/uploads/2010/05/buscarcep-1-202x300.png" alt="" width="202" height="300" /></a><a rel="lightbox-buscarcep" href="http://blog.asneto.eti.br/wp-content/uploads/2010/05/buscarcep-3.png"><img class="alignnone size-medium wp-image-38" title="BuscarCEP - Resultado" src="http://blog.asneto.eti.br/wp-content/uploads/2010/05/buscarcep-3-201x300.png" alt="" width="201" height="300" /></a></p>
<p>Aplicação bem simplória, o usuário seta o CEP, o sistema procura na internet, processa a   informação e exibe o resultado. Criei para brincar e mostrar algumas coisas aqui. Como fonte de dados, usei o serviço do <a href="http://www.buscarcep.com.br" target="_blank">BuscarCEP</a> que me fornece o resultado em String ou XML. Optei pelo XML e precisei usar a biblioteca jDom para processar o XML. Isso deixou a aplicação um tanto grande (para os padrões do Android) e depois quero pesquisar pra ver se encontro algumas soluções mais leves.</p>
<p>- Download <a href="http://blog.asneto.eti.br/wp-content/uploads/BuscarCEP_v0.1.0-20100527.apk" target="_blank">BuscarCEP_v0.1.0-20100527.apk</a> (clique com o direito, e &#8220;Salvar destino como&#8230;&#8221;)</p>
<p>- Download do <a href="http://blog.asneto.eti.br/wp-content/uploads/BuscarCEP_v0.1.0-20100527-src.zip">Código Fonte</a></p>
<p>Uma coisa legal que fiz nessa aplicação foi usar reflexão. Isso aqui é puramente Java e pode ser usado em qualquer aplicação. Após ler o XML eu setei os valores lidos em um ValueObject (VO) que continha propriedades com os mesmos nomes das tags do XML. Dai pra chamar o método &#8220;set&#8230;&#8221; do VO, eu fiz assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// ... código antes ...</span>
<span style="color: #666666; font-style: italic;">// Instância do meu VO</span>
CepModel cepModel <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CepModel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Pega o Elemento root do XML</span>
<span style="color: #003399;">Element</span> root <span style="color: #339933;">=</span> doc.<span style="color: #006633;">getRootElement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Pega um filho chamado &quot;retorno&quot;</span>
<span style="color: #003399;">Element</span> retorno <span style="color: #339933;">=</span> root.<span style="color: #006633;">getChild</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;retorno&quot;</span>, root.<span style="color: #006633;">getNamespace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Pega os filhos do &quot;retorno&quot;</span>
<span style="color: #003399;">List</span> cepData <span style="color: #339933;">=</span> retorno.<span style="color: #006633;">getChildren</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Itera sobre cada filho</span>
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> rx <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> rx <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> cepData.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> rx<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Pega o valor do filho</span>
	<span style="color: #003399;">String</span> data <span style="color: #339933;">=</span> cepData.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>rx<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Pega o nome do filho.</span>
	<span style="color: #666666; font-style: italic;">// Esse cara que vai ser usado pra chamar o método &quot;set&quot;</span>
	<span style="color: #003399;">String</span> methodName <span style="color: #339933;">=</span> cepData.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>rx<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Aqui eu formato ele para ficar com a inicial maiúscula e</span>
	<span style="color: #666666; font-style: italic;">// concatenar o &quot;set&quot; na frente, ficando, por exemplo &quot;setLogradouro&quot;</span>
	methodName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;set&quot;</span> <span style="color: #339933;">+</span> methodName.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">+</span> methodName.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, methodName.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Aqui que começa a ficar legal</span>
	<span style="color: #666666; font-style: italic;">// Esse array define qual o tipo de dado de cada parâmetro que será</span>
	<span style="color: #666666; font-style: italic;">// passado para o método, no meu caso uma String</span>
	<span style="color: #000000; font-weight: bold;">Class</span> partypes<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	partypes<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003399;">String</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Esse array contém os valores de cada parâmetro que será passado para</span>
	<span style="color: #666666; font-style: italic;">// o método, neste caso 1</span>
	<span style="color: #003399;">Object</span> arglist<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	arglist<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> data<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Aqui eu digo qual o nome do método que eu quero chamar, passando</span>
	<span style="color: #666666; font-style: italic;">// os tipos de valores</span>
	<span style="color: #003399;">Method</span> setMethod <span style="color: #339933;">=</span> cepModel.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span>methodName, partypes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Aqui é a instância do meu VO</span>
	<span style="color: #003399;">Object</span> instance <span style="color: #339933;">=</span> cepModel<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// E aqui eu chamo o método &quot;set&quot;</span>
	setMethod.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>instance, arglist<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Gosto de explorar esses recursos do Java. Sei que existem outras formas de se fazer isso, talvez até com uma melhor performance, mas o objetivo é explorar e descobrir recursos.</p>
<p>Certamente vou seguir fazendo uns programinhas pro Android e assim que eles ficarem estáveis, eu posto aqui. Ainda não desisti do meu app pro Twitpi, assim que ele ficar bom eu faço um post sobre ele.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/05/27/programas-para-android/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Blogando? Eu?</title>
		<link>http://blog.asneto.eti.br/2010/05/24/blogando-eu/</link>
		<comments>http://blog.asneto.eti.br/2010/05/24/blogando-eu/#comments</comments>
		<pubDate>Mon, 24 May 2010 23:41:05 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Diversos]]></category>

		<guid isPermaLink="false">http://blog.asneto.eti.br/?p=1</guid>
		<description><![CDATA[Sejam bem vindos! Bom, nunca fui bom com as palavras e a minha idéia com o blog não é sair escrevendo sobre mim ou coisa parecida. Mexo com computadores desde que eu tinha uns 10 anos e ao longo desse tempo fui aprendendo muita coisa. Eu DETESTO ensinar às pessoas a usar um computador, os [...]]]></description>
			<content:encoded><![CDATA[<p>Sejam bem vindos! <img src='http://blog.asneto.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bom, nunca fui bom com as palavras e a minha idéia com o blog não é sair escrevendo sobre mim ou coisa parecida. Mexo com computadores desde que eu tinha uns 10 anos e ao longo desse tempo fui aprendendo muita coisa. Eu <strong>DETESTO</strong> ensinar às pessoas a usar um computador, os motivos são vários e não merecem ser comentados aqui. Apesar disso, eu gosto muito de ensinar sobre o que eu realmente gosto de fazer, que é programação. Nunca tive nenhuma experiência com didática e acredito que o blog vai me trazer um grande aprendizado.</p>
<p>Bom, resumindo, minha idéia com este blog é registrar etapas que eu tenha passado ou simplesmente postar sobre tecnologias recentes. Atualmente tenho mexido com PHP, CodeIgniter, Java, JSF, Richfaces, Hipernate, JPA, Spring, Struts, Velocity e Android. Tenho juntando algum material para poder iniciar o blog, então logo logo vou postar alguma coisa mais técnica por aqui.</p>
<p>Só me apresentando: me chamo Alexandre, tenho 23 anos, me formei no curso de Análise e Desenvolvimento de Sistemas pela <a href="http://www.ucpel.tche.br" target="_blank">Universidade Católica de Pelotas</a> no ano de 2009 e tenho ainda um curso técnico de Sistemas de Informação pelo antigo CEFET-RS, atual <a href="http://www.ifsul.edu.br" target="_blank">IF-SUL</a>, onde tive minhas primeiras experiências na área de programação. Profissionalmente, comecei a trabalhar em 2008 na <a href="http://www.create.art.br" target="_blank">Create</a>, uma agência digital de Pelotas. Programava em PHP e toda aquela leva de coisas que os sites institucionais e sistemas trazem: HTML, CSS, JavaScript, jQuery, bla bla bla. Pouco depois tive a oportunidade de fazer um processo seletivo com treinamento, o qual obtive sucesso, e entrei na <a href="http://www.gestum.com.br" target="_blank">Gestum</a>. Foi lá que realmente aprendi a programar em Java usando o framework JSF. Atualmente trabalho na <a href="http://www.voiza.com.br" target="_blank">Voiza</a> como desenvolvedor Java.</p>
<p>Quero ver se pratico aqui o meu Inglês também, então dependendo do tamanho do post, quero ver se consigo fazer uma versão em inglês. Vale lembrar também que eu nunca mexi no WordPress, então to aprendendo ainda e pode ser que as vezes apareçam uns testes meus por ai! hehehe</p>
<p>Para entrar em contato comigo:</p>
<p>alexandre.sneto@gmail.com</p>
<p><a href="http://twitter.com/alexandresneto" target="_blank">twitter.com/alexandresneto</a></p>
<p>msn: alexandre@ftlan.com (preciso mudar isso)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asneto.eti.br/2010/05/24/blogando-eu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

