<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>CodeIgniter Brasil</title>
	
	<link>http://codeigniterbrasil.com</link>
	<description>tutoriais, dicas, macetes, códigos e informações sobre o melhor framework PHP: CodeIgniter</description>
	<lastBuildDate>Mon, 30 Jan 2012 11:20:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cibrasil" /><feedburner:info uri="cibrasil" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/cibrasil" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fcibrasil" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Como compactar HTML no CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/nRM7slJjpZg/</link>
		<comments>http://codeigniterbrasil.com/dicas/como-compactar-html-codeigniter/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 16:01:52 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[classes]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=143</guid>
		<description><![CDATA[Exatamente ontem surgiu num repositório fork do CodeIgniter uma novidade muito interessante: uma feature para compactar HTML! Apesar de não ser oficial, fiz alguns testes e está tudo funcionando muito bem! Portanto, compactar HTML no CodeIgniter agora é possível e, acredite, os resultados são incríveis! Baixando a nova classe de Output A primeira coisa a [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2012/01/codeigniter-compactar-html.jpg" alt="CodeIgniter: como compactar HTML (imagem ilustrativa)" title="" width="500" height="200" class="aligncenter size-full wp-image-144 ilustra-artigo" /></p>
<p>Exatamente ontem surgiu num <a href="https://github.com/atiredmachine/CodeIgniter">repositório fork do CodeIgniter</a> uma novidade muito interessante: uma feature para <strong>compactar HTML</strong>! Apesar de não ser oficial, fiz alguns testes e está tudo funcionando muito bem! Portanto, compactar HTML no CodeIgniter agora é possível e, acredite, os resultados são incríveis!</p>
<h2>Baixando a nova classe de Output</h2>
<p>A primeira coisa a se fazer é substituir a classe nativa de Output do CodeIgniter pela que tem as modificações. Então, <a href="https://github.com/atiredmachine/CodeIgniter/blob/5528c0e3335a8d0826b2bcb8aef6283681d3a0c6/system/core/Output.php">copie a Output Class modificada</a> e coloque em <strong>/system/core</strong> (para os mais cautelosos, um backup é sempre bem-vindo).</p>
<h2>Ativando a compactação de HTML</h2>
<p>Assim como pode ser visto na <a href="https://github.com/EllisLab/CodeIgniter/pull/965">pull request da compatação de HTML no CodeIgniter</a>, a partir do momento em que a nova Output Class está presente, é preciso ativar a funcionalidade de compactar através de uma diretiva de configuração.</p>
<p>Por padrão, esta diretiva estaria presente em <strong>application/config/config.php</strong>, mas, como ela não existe, é preciso criá-la. Então, em qualquer ponto do arquivo <strong>config.php</strong> (ou outro arquivo de configuração que você esteja usando), inclua a seguinte diretiva:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p143code2'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1432"><td class="code" id="p143code2"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'minify_output'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>E pronto! A partir de agora o <strong>CodeIgniter comprime toda e qualquer saída de HTML</strong> (e CSS inline) que passar pela Output (que, caso você esteja usando corretamente a <a href="http://codeigniterbrasil.com/passos-iniciais/models-views-controllers-trabalhando-juntos-codeigniter/">abordagem MVC no CodeIgniter</a>, significa a exibição nas views).</p>
<h2>Conclusão sobre compactação de HTML no CodeIgniter</h2>
<p>Apesar de (ainda) não ser um recurso oficial do CI e que, não há que se duvidar, ainda ganhará melhorias, realmente vale a pena, pelo menos, testar a compactação (embora já esteja estável o suficiente para ser usado em ambiente de produção).</p>
<p><strong>&lt;update&gt;</strong><br />
Como esperado, <a href="https://github.com/EllisLab/CodeIgniter/pull/965">as alterações na classe de Output já foram para o repositório oficial</a>. O pessoal ainda está discutindo melhorias, portanto, fique ligado!<br />
<strong>&lt;/update&gt;</strong></p>
<p>Claro que há muitos fatores a se considerar, mas estima-se que esta compactação reduza o tamanho da saída HTML em <strong>10~15%</strong> (chegando, em alguns casos, a incríveis 30%), o que é bastante considerável! Com isso, a transferência de recursos no servidor e exibição de conteúdos, consequentemente, também ficam mais rápidos.</p>
<p>E tudo isso pode ficar ainda melhor quando se usa <strong>cache</strong> para os conteúdos! Mas isso já é assunto para outro artigo&#8230;  ;-)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=nRM7slJjpZg:EoLkjopoIBA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=nRM7slJjpZg:EoLkjopoIBA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=nRM7slJjpZg:EoLkjopoIBA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=nRM7slJjpZg:EoLkjopoIBA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/nRM7slJjpZg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/dicas/como-compactar-html-codeigniter/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/dicas/como-compactar-html-codeigniter/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter Drivers</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/oWVsfZP5G3w/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/codeigniter-drivers/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 15:57:25 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[código-fonte]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=140</guid>
		<description><![CDATA[Drivers no CodeIgniter, apesar de ser algo relativamente novo no framework, não tem nada de complicado. Na verdade, drivers não passam de bibliotecas, mas com característica e modo de usar ligeiramente diferentes. Como já foi abordado aqui, no CodeIgniter Brasil, como carregar bibliotecas e como criar bibliotecas no CodeIgniter, chegou a hora de abordar os [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codeigniterbrasil.com/wp-content/uploads/2012/01/codeigniter-driver-drivers.jpg"><img src="http://codeigniterbrasil.com/wp-content/uploads/2012/01/codeigniter-driver-drivers.jpg" alt="CodeIgniter Drivers" title="" width="500" height="200" class="aligncenter size-full wp-image-141 ilustra-artigo" /></a></p>
<p><strong>Drivers no CodeIgniter</strong>, apesar de ser algo relativamente novo no framework, não tem nada de complicado. Na verdade, drivers não passam de bibliotecas, mas com característica e modo de usar ligeiramente diferentes. Como já foi abordado aqui, no CodeIgniter Brasil, <a href="http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/" title="Carregando bibliotecas (libraries) no CodeIgniter">como carregar bibliotecas</a> e <a href="http://codeigniterbrasil.com/passos-iniciais/como-criar-biblioteca-library-codeigniter/" title="Como criar bibliotecas (libraries) no CodeIgniter">como criar bibliotecas no CodeIgniter</a>, chegou a hora de abordar os <strong>Drivers do CodeIgniter</strong>.</p>
<h2>Drivers no CodeIgniter</h2>
<p>Como foi dito, <strong>drivers</strong> são, somente, um tipo diferente de library que trabalha mais com o conceito de herança do PHP, quer dizer, existe uma classe mãe e outras classes filhas quaisquer. Classes filhas têm acesso à classe mãe, mas não a suas &#8220;classes irmãs&#8221;.</p>
<p>Então, drivers podem ser usados em situações em que a programação e organização de uma ou mais bibliotecas de um projeto sejam beneficiados ao serem esta(s) classe(s) dividida(s) em diversas outras classes.</p>
<h2>Criando drivers no CodeIgniter</h2>
<p>Drivers devem ser criados no diretório <strong>system/libraries</strong>, em sua própria pasta, que deve ter o mesmo nome da classe mãe. Dentro deste diretório deve existir outra pasta chamada <strong>drivers</strong>, que conterá todas as possíveis classes filhas.</p>
<p>Para que fique mais claro, veja o seguinte modelo de estrutura de drivers no CodeIgniter:</p>
<ul>
<li>/application/libraries/Driver_name</li>
<ul>
<li>Driver_name.php</li>
<li>drivers</li>
<ul>
<li>Driver_name_subclass_1.php</li>
<li>Driver_name_subclass_2.php</li>
<li>Driver_name_subclass_3.php</li>
</ul>
</ul>
</ul>
<div class="alert">
A fim de manter compatibilidade em sistemas de arquivos que são case-sensitive, o diretório &#8220;Driver_name&#8221; deve seguir o padrão <a href="http://www.php.net/manual/pt_BR/function.ucfirst.php">ucfirst()</a>, ou seja, o primeiro caracter em maiúsculo e, os demais, em minúsculo.
</div>
<h2>Usando drivers no CodeIgniter</h2>
<p>Para usar um driver, primeira é preciso inicializá-lo (tal como fazemos com libraries) da seguinte maneira:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p140code6'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1406"><td class="code" id="p140code6"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">driver</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'driver_name'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Métodos dessa classe são invocados usando:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p140code7'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1407"><td class="code" id="p140code7"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">driver_name</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">method</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>As classes filhas &#8211; os drivers, propriamente ditos &#8211; podem ser chamados diretamente por sua classe mãe, sem a necessidade de iniciar cada uma delas:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p140code8'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1408"><td class="code" id="p140code8"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">driver_name</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">child_one</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">some_method</span><span style="color: #009900;">&#40;</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;">driver_name</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">child_two</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">another_method</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Bem tranquilo, certo? Como dissemos, não passam de <a href="http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/" title="Carregando bibliotecas (libraries) no CodeIgniter">bibliotecas do CI</a>.</p>
<h2>Exemplo de driver no CodeIgniter</h2>
<p>Pelo fato de já termos passado sobre alguns artigos sobre libraries e pelo conceito e conteúdo deste artigo, já é possível entender o funcionamento e dinâmica dos drivers no CodeIgniter. Mas, para fixar um conceito, é sempre interessante a visualização e análise de algum exemplo concreto.</p>
<p>E, para o caso, indico o projeto no GitHub que foi criado, justamente, para servir de exemplo: <a href="https://github.com/oliverhr/CI2_Drivers_example/" title="CI2_Drivers_example, no GitHub">CI2_Drivers_example</a>.</p>
<p>Ao baixar e analisar os arquivos, certamente você entenderá melhor como é funcionamento deste recursos interessantíssimo do framework e poderá, a partir de agora, julgar corretamente ao escolher quando usar <strong>drivers no CodeIgniter</strong>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=oWVsfZP5G3w:RTnvoxSBrDE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=oWVsfZP5G3w:RTnvoxSBrDE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=oWVsfZP5G3w:RTnvoxSBrDE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=oWVsfZP5G3w:RTnvoxSBrDE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/oWVsfZP5G3w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/codeigniter-drivers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/codeigniter-drivers/</feedburner:origLink></item>
		<item>
		<title>Como criar bibliotecas (libraries) no CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/O_aRDEIjfaw/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/como-criar-biblioteca-library-codeigniter/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 12:00:02 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[padrões de projeto]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=136</guid>
		<description><![CDATA[Bibliotecas (ou libraries) no CodeIgniter são importantíssimas, pois, através delas, podemos estender recursos do framework, seja criando nossas próprias bibliotecas ou pegando recursos já prontos disponibilizados pela comunidade. Para o primeiro caso, aprenda como criar bibliotecas no CodeIgniter e veja como essa criação é simples e fácil de ser feita. O que são as bibliotecas [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/08/codeigniter-library-biblioteca.jpg" alt="Como criar bibliotecas (libraries) no CodeIgniter: imagem ilustrativa" title="" width="500" height="200" class="aligncenter ilustra-artigo size-full wp-image-122"></p>
<p><strong>Bibliotecas</strong> (ou <strong>libraries</strong>) no CodeIgniter são importantíssimas, pois, através delas, podemos estender recursos do framework, seja criando nossas próprias bibliotecas ou pegando recursos já prontos disponibilizados pela comunidade. Para o primeiro caso, aprenda <strong>como criar bibliotecas no CodeIgniter</strong> e veja como essa criação é simples e fácil de ser feita.</p>
<h2>O que são as bibliotecas no CodeIgniter</h2>
<p>Bibliotecas no CodeIgniter nada mais são do que classes PHP localizadas em <strong>/application/libraries</strong>. Perceba que existe, também, a pasta <strong>/system/libraries/</strong>, mas como foi visto no artigo <a href="http://codeigniterbrasil.com/passos-iniciais/estrutura-de-diretorios-organizacao-de-pastas-do-codeigniter-2/" title="Estrutura de diretórios no CodeIgniter 2">sobre a estrutura de diretórios do CodeIgniter</a>, dentro de /system ficam os arquivos de core do CI, portanto, é prudente mexer ali somente quando realmente souber o que está fazendo.</p>
<p>Fique sabendo, também, que, caso crie uma biblioteca com o mesmo nome de alguma biblioteca nativa do CodeIgniter, esta será sobreescrita pelo seu código! Tenha muita atenção!</p>
<h2>Convenções sobre libraries no CodeIgniter</h2>
<p>Em relação a bibliotecas no CI, <strong>com exceção</strong> das que são para mexer com bancos de dados, é possível:</p>
<ul>
<li>Criar novas bibliotecas</li>
<li>Estender bibliotecas nativas</li>
<li>Sobreescrever bibliotecas nativas (!)</li>
</ul>
<p>Como vimos, os arquivos devem ser criados em <strong>/application/libraries</strong> e seguir as seguintes convenções:</p>
<ul>
<li>O nome deve capitalizado. Por exemplo: <strong>Minhalib.php</strong> </li>
<li>A declaração da classe também: <strong>class Minhalib</strong></li>
<li>O nome do arquivo e da classe devem ser o mesmo (vide exemplos acima)</li>
</ul>
<p>Veja este protótipo de como deve ser uma library no CodeIgniter:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code23'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13623"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p136code23"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <a href="http://www.php.net/defined"><span style="color: #990000;">defined</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Minhalib <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#91;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* End of file Minhalib.php */</span></pre></td></tr></table></div>

<p>E pronto! Já temos uma biblioteca pronta e já podemos usá-la em nossa aplicação! Para usar, você já sabe, basta seguir o que foi explicado no artigo &#8220;<a href="http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/" title="Como carregar bibliotecas (libraries) no CodeIgniter">Carregando bibliotecas (libraries) no CodeIgniter</a>&#8220;. Em um controller, basta usar:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code24'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13624"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p136code24"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'minhalib'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Em minúsculo, mesmo</span></pre></td></tr></table></div>

<p>E, depois, usar quaisquer funções que sua library contenha. Vamos passar nosso modelo para o seguinte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code25'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13625"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p136code25"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <a href="http://www.php.net/defined"><span style="color: #990000;">defined</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Minhalib <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ola_mundo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'Ol&amp;aacute; mundo!'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* End of file Minhalib.php */</span></pre></td></tr></table></div>

<p>Então, depois de carregar a biblioteca, para se usar a função ola_mundo(), basta codificar:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code26'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13626"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p136code26"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">minhalib</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ola_mundo</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;">// Sempre em minúsculo</span></pre></td></tr></table></div>

<p>No caso, como temos um retorno em texto, caso fosse preciso escrever esse retorno:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code27'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13627"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p136code27"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">minhalib</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ola_mundo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h2>Passando parâmetros no carregamento da biblioteca</h2>
<p>É bastante comum ser preciso passar alguns parâmetros na invocação de uma biblioteca. Evidentemente o CI permite fazer isso de uma maneira bastante simples. Primeiramente, vamos preparar nossa classe para receber parâmetros:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code28'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13628"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p136code28"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <a href="http://www.php.net/defined"><span style="color: #990000;">defined</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Minhalib <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$parametros</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#91;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* End of file Minhalib.php */</span></pre></td></tr></table></div>

<p>Com isso feito, os $parametros passados o devem ser através de um array (chave/valor). Dessa maneira, na inicialização da classe teríamos algo como:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code29'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13629"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p136code29"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'minhalib'</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'chave1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'valor1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chave2'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'valor2'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Ou, para facilitar a leitura e entendimento posteriores:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code30'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13630"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p136code30"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$parametros</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'chave1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'valor1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chave2'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'valor2'</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;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'minhalib'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parametros</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Então, você pode fazer o que quiser com esses parâmetros. Só por curiosidade, execute o código acima depois de mudar a biblioteca para:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code31'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13631"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p136code31"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Minhalib <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$parametros</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <a href="http://www.php.net/print_r"><span style="color: #990000;">print_r</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parametros</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Usando recursos do CodeIgniter em bibliotecas</h2>
<p>É perfeitamente possível (e frequentemente necessário) utilizar recursos nativos do CodeIgniter em bibliotecas que criamos. Mas, para isso, é preciso fazer uma coisinha antes. Como foi visto anteriormente, para chamarmos algum recurso do CI devemos nos valer de funções usando o <strong>$this</strong>, mas, no contexto de criação/edição de bibliotecas, isso não funciona; o $this só funciona, por padrão, para <a href="http://codeigniterbrasil.com/passos-iniciais/models-views-controllers-trabalhando-juntos-codeigniter/" title="MVC em ação no CodeIgniter">models, views e controllers</a>. </p>
<p>Então, para se usar recursos nativos do CodeIgniter em bibliotecas próprias, é preciso <strong>atribuir por referência o super objeto do CodeIgniter a uma variável</strong>:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code32'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13632"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p136code32"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$CI</span> <span style="color: #339933;">=&amp;</span> get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>A partir de então, temos acesso a todos os recursos nativos usando a variável <strong>$CI</strong> (ou qualquer outro nome que você queira):</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code33'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13633"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p136code33"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'session'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#91;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<h2>Estendendo bibliotecas nativas do CodeIgniter</h2>
<p>Foi explicado no <a href="http://codeigniterbrasil.com/passos-iniciais/my_controller-estendendo-o-ci_controller/" title="MY_Controller : estendendo o CI_Controller">artigo sobre MY_Controller</a> que é possível estender o &#8220;controller base&#8221; CI_Controller. O mesmo raciocínio se aplica para o caso de ser preciso estender libraries nativas do CI e, para se fazer isso, é um processo tão simples quanto.</p>
<p>Por exemplo, caso queiramos estender as funcionalidades da library nativa de e-mails, nos valemos do já conhecido prefixo de subclasse &#8220;<strong>MY_</strong>&#8221; (ou o que você tenha definido em <strong>/application/config/config.php</strong>):</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code34'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13634"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p136code34"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MY_Email <span style="color: #000000; font-weight: bold;">extends</span> CI_Email <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> minha_funcao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #009900;">&#91;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>E, para os (não raros) casos em que é preciso chamar o construtor da superclasse na inicialização da biblioteca:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code35'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13635"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p136code35"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MY_Email <span style="color: #000000; font-weight: bold;">extends</span> CI_Email <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span>__construct<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> <span style="color: #000000; font-weight: bold;">function</span> minha_funcao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #009900;">&#91;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Feitos os devidos acréscimos de funcionalidades, a chamada para a biblioteca e o uso das funções não se altera em nada:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p136code36'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13636"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p136code36"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// SEM o prefixo &quot;MY_&quot;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">minha_funcao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Simples, rápido, objetivo, enfim, nenhum mistério no mundo PHP OO!</p>
<h2>Conclusão</h2>
<p>Como vimos, <strong>criar bibliotecas no CodeIgniter</strong> é bastante simples. Seguindo algumas pequenas convenções de localização e nomenclatura, é possível criar funcionalidades espetaculares e/ou estender as (também espetaculares) funcionalidades do CI. Afinal, é para isso que serve um <a href="http://codeigniterbrasil.com/passos-iniciais/o-que-e-um-framework-definicao-e-beneficios-de-se-usar-frameworks/">framework</a>! Sua produtividade agradece!</p>
<p>Ah, e espero que você tenha notado o quão fácil é integrar classes feitas em PHP puro ao CodeIgniter, simplesmente as &#8220;transformando&#8221; em bibliotecas do framework! ;-)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=O_aRDEIjfaw:uRVK399DWuY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=O_aRDEIjfaw:uRVK399DWuY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=O_aRDEIjfaw:uRVK399DWuY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=O_aRDEIjfaw:uRVK399DWuY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/O_aRDEIjfaw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/como-criar-biblioteca-library-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/como-criar-biblioteca-library-codeigniter/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter 2.1</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/qAkFrAiaHpY/</link>
		<comments>http://codeigniterbrasil.com/noticias/codeigniter-2-1/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 00:27:15 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=134</guid>
		<description><![CDATA[A comunidade estava ansiosa por algumas mudanças e, como não é costume da Equipe CodeIgniter deixar seus fãs usuários na mão, eis que é lançado o CodeIgniter 2.1! Este é um guest post de William Rufino, que pode ser encontrado na internet através de: Site de William Rufino twitter de William Rufino Boa tarde a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-28 ilustra-artigo" title="Codeigniter." src="http://codeigniterbrasil.com/wp-content/uploads/2008/10/codeigniter.gif" alt="Codeigniter." width="500" height="150"></p>
<p>A comunidade estava ansiosa por algumas mudanças e, como não é costume da Equipe CodeIgniter deixar seus <del>fãs</del> usuários na mão, eis que é lançado o <strong>CodeIgniter 2.1</strong>!</p>
<div class="guest-post">
Este é um guest post de <strong>William Rufino</strong>, que pode ser encontrado na internet através de:
</p>
<ul>
<li><a href="http://www.williamrufino.com.br/">Site de William Rufino</a></li>
<li><a href="http://twitter.com/williamhrs">twitter de William Rufino</a></li>
</ul>
</div>
<p>Boa tarde a todos! Finalmente após 3 meses da mudança do nosso querido <strong>CodeIgniter</strong> para o <a href="http://github.com">Github</a>, foi anunciado hoje, pela EllisLab, o lançamento da <a title="Codeigniter 2.1 lançado pela EllisLab" href="http://codeigniter.com/news/codeigniter_2.1.0_belated_release_announcement">versão 2.1.0 do CodeIgniter</a>. Nesta versão foram adicionadas algumas grandes mudanças ao framework:</p>
<ul>
<li><a href="http://codeigniter.com/user_guide/libraries/migration.html">Migrations</a>. Para versionar também o banco de dados, através do Migrations, você simplesmente da um up() ou down().</li>
<li><strong>PDO Driver</strong>. Foi adicionado PDO como driver para os banco de dados, aumentando assim a gama de bancos suportados pelo CodeIgniter.</li>
<li><strong>Mais PHP5</strong>. Desde que foi &#8220;dropado&#8221; o suporte do CodeIgniter ao PHP4 aos poucos foi sendo mudada a sintaxe do core para o PHP5, e nesta versão mais coisa foi altearada para PHP5.</li>
</ul>
<p>Estas foram as maiores mudanças, e também mais significativas desta versão. Para mais informações vejam no <a href="http://codeigniter.com/user_guide/changelog.html">changelog</a>.</p>
<p>A EllisLab também informou que todas mudanças (correções de bugs) que forem feitas na versão 2.1.x serão mescladas na versão 3.0 e todas novidades serão commitadas para o branch 3.0.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=qAkFrAiaHpY:C_J6CNc3H2s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=qAkFrAiaHpY:C_J6CNc3H2s:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=qAkFrAiaHpY:C_J6CNc3H2s:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=qAkFrAiaHpY:C_J6CNc3H2s:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/qAkFrAiaHpY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/noticias/codeigniter-2-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/noticias/codeigniter-2-1/</feedburner:origLink></item>
		<item>
		<title>Estendendo o CodeIgniter: como adicionar novas funcionalidades ao framework</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/lQhUzMeX-sk/</link>
		<comments>http://codeigniterbrasil.com/dicas/estendendo-o-codeigniter-como-adicionar-novas-funcionalidades-ao-framework/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 17:18:22 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=118</guid>
		<description><![CDATA[Lembrando das lições básicas sobre controllers no CodeIgniter, vimos que, quando criamos um novo controller para um projeto, devemos estender o &#8220;CI_Controller&#8221;. Isso nada mais é do que PHP OO básico: uma classe estendendo outra para adquirir as propriedades e métodos permitidos. Seguindo a OO, o CodeIgniter permite, de forma bastante simples, estender suas principais [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/08/como-estender-codeigniter.jpg" alt="" title="Estendendo o CodeIgniter: imagem ilustrativa" width="500" height="200" class="aligncenter ilustra-artigo size-full wp-image-119" /></p>
<p>Lembrando das lições básicas sobre <a href="http://codeigniterbrasil.com/passos-iniciais/controllers-no-codeigniter/">controllers no CodeIgniter</a>, vimos que, quando criamos um novo controller para um projeto, devemos estender o &#8220;CI_Controller&#8221;. Isso nada mais é do que <a href="http://www.php.net/manual/pt_BR/language.oop5.php">PHP OO</a> básico: uma classe estendendo outra para adquirir as propriedades e métodos permitidos.</p>
<p>Seguindo a OO, o <strong>CodeIgniter</strong> permite, de forma bastante simples, estender suas principais classes, adicionando ou substituindo funcionalidades a suas classes de sistema ou, como mais comumente conhecidas, <strong>core classes</strong>.</p>
<p>Toda vez que o CodeIgniter roda, essas core classes são iniciadas automaticamente (por serem essenciais ao funcionamento do <em>framework</em>) e, ao estender ou modificar alguma funcionalidade delas, a modificação é iniciada também <strong>automaticamente</strong>, conferindo um nível de adaptação e flexibilidades incríveis a qualquer projeto! Estas são as core classes que são chamadas toda vez que o CI roda (localizadas em <strong>/system/core</strong>):<br />
<strong></p>
<ul>
<li>Benchmark</li>
<li>Config</li>
<li>Controller</li>
<li>Exceptions</li>
<li>Hooks</li>
<li>Input</li>
<li>Language</li>
<li>Loader</li>
<li>Log</li>
<li>Output</li>
<li>Router</li>
<li>URI</li>
<li>Utf8</li>
</ul>
<p></strong><br />
O &#8220;segredo&#8221; para estender/modificar estas classes está no diretório <strong>/application/core</strong> (<a href="http://codeigniterbrasil.com/passos-iniciais/estrutura-de-diretorios-organizacao-de-pastas-do-codeigniter-2/">veja o artigo sobre a estrutura de diretórios no CodeIgniter</a>).</p>
<h2>Estender as core classes do CodeIgniter</h2>
<p>Em tempo oportuno serão mostradas, aqui no <a href="http://codeigniterbrasil.com">CodeIgniter Brasil</a>, as funcionalidades de todas as <a href="http://codeigniterbrasil.com/passos-iniciais/classes-do-codeigniter/">classes do CodeIgniter</a>. Por enquanto, basta saber que, mesmo suas funcionalidades padrão já serem poderosíssimas, é possível estendê-las, conferindo mais poder e flexibilidade no momento de desenvolver projetos.</p>
<p>Então, por exemplo, caso queira estender a classe de Input do CI (/system/core/Input.php), basta criar o arquivo <strong>/application/core/MY_Input.php</strong> e partir do seguinte ponto:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p118code39'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11839"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p118code39"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MY_Input <span style="color: #000000; font-weight: bold;">extends</span> CI_Input <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span>__construct<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: #666666; font-style: italic;">// Seu código aqui</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>A partir deste trecho de código, podemos deduzir 2 importantes informações:</p>
<ul>
<li><strong>Prefixo para o nome da classe.</strong> Ao estender uma core classe do CodeIgniter, é preciso que o nome da classe seja &#8220;prefixo&#8221; + &#8220;nome&#8221;, como no exemplo &#8220;MY_Input&#8221;.</li>
<li><strong>Declaração &#8220;extends&#8221;.</strong> Sua classe deve, necessariamente, estender a classe-pai que se deseja manipular propriedades/métodos. No exemplo, a classe MY_Input estendeu a classe CI_Input (localizada em /system/core/Input.php).</li>
</ul>
<p>Para quem já está familiarizado com PHP OO (o que, aliás, é um <a href="http://codeigniterbrasil.com/pre-requisitos/">pré-requisito</a> para se trabalhar com CI), a única novidade ficou por conta do prefixo necessário ao nome da classe. Como é de se esperar, caso você use um nome de método igual a algum já existem na core classe, toda a classe será substituída por suas novas instruções, portanto, atenção a isso!</p>
<p>Aliás, este prefixo pode ser outro, conforme sua vontade. Basta abrir o arquivo <strong>/application/config/config.php</strong> e alterar a diretiva &#8220;subclass_prefix&#8221; &#8211; por razões óbvias, não é possível alterar para &#8220;CI_&#8221;&#8230;</p>
<h2>Substituir as core classes do CodeIgniter</h2>
<div class="alert">Só substitua uma classe inteira do CodeIgniter se você <strong>realmente souber</strong> o que está fazendo!</div>
<p>Para substituir as core classes do CodeIgniter, basta criar um arquivo com o mesmo nome da &#8220;classe alvo&#8221;. Por exemplo, para substituir a classe de Input, basta criar o arquivo <strong>/application/core/Input.php</strong> com o seguinte código-base:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p118code40'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11840"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p118code40"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> CI_Input <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// seu código aqui</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>O prefixo &#8220;CI_&#8221; é necessário para que o framework entenda do que se trata. Então, para substituir as <em>core classes</em>, basta seguir este modelo acima, sempre lembrando de usar o prefixo indicado.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=lQhUzMeX-sk:bqA4Ceo5oM4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=lQhUzMeX-sk:bqA4Ceo5oM4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=lQhUzMeX-sk:bqA4Ceo5oM4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=lQhUzMeX-sk:bqA4Ceo5oM4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/lQhUzMeX-sk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/dicas/estendendo-o-codeigniter-como-adicionar-novas-funcionalidades-ao-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/dicas/estendendo-o-codeigniter-como-adicionar-novas-funcionalidades-ao-framework/</feedburner:origLink></item>
		<item>
		<title>Nova licença do CodeIgniter: OSL 3.0</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/uf9IX6BoRKY/</link>
		<comments>http://codeigniterbrasil.com/noticias/nova-licenca-codeigniter-osl-3/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 11:36:33 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[diversidades]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=129</guid>
		<description><![CDATA[É isso, mesmo, meus amigos: conforme tweet oficial, o CodeIgniter está sendo &#8220;relicenciado&#8221; para a Open Software License v. 3.0, também conhecida como OSL 3.0. A mudança não virá com a próxima versão, o CodeIgniter 2.1, e sim com a versão 3 do framework &#8211; CI 3; OSL 3&#8230; Entendeu? ;-) No site da Open [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/10/codeigniter-nova-licenca-osl-3.jpg" alt="Nova licença do CodeIgniter: OSL 3.0" width="500" height="150" class="ilustra-artigo aligncenter size-full wp-image-130" /></p>
<p>É isso, mesmo, meus amigos: conforme <a href="http://twitter.com/#!/CodeIgniter/status/127115100904624129">tweet oficial</a>, o <strong>CodeIgniter</strong> está sendo &#8220;relicenciado&#8221; para a <strong>Open Software License v. 3.0</strong>, também conhecida como <strong>OSL 3.0</strong>. A mudança não virá com a próxima versão, o CodeIgniter 2.1, e sim com a versão 3 do framework &#8211; CI 3; OSL 3&#8230; Entendeu?  ;-)</p>
<p>No site da <a href="http://www.opensource.org/">Open Source Initiative</a> é possível acessar a <a href="http://www.opensource.org/licenses/OSL-3.0">página com os termos da OSL 3.0</a> para saber, juridicamente falado, quais os termos, deveres, obrigações e permissões que esta licença institui.</p>
<h2>Na prática, o que muda?</h2>
<p>Apesar de não ter formação jurídica, parece que o uso e desenvolvimento de sites, ferramentas e sistemas online do framework não foi alterado. Quer dizer, aparentemente, tudo o que consta no artigo sobre <a href="http://codeigniterbrasil.com/diversos/codeigniter-requisitos-de-servidor-e-licenca-de-uso/">requisitos de servidor e licença de uso</a> continua valendo (inclusive, na própria <a href="http://codeigniter.com/user_guide/license.html">página da licença no User Guide</a>, nada foi alterado).</p>
<p>Com a mudança para a <strong>OSL 3.0</strong> a <a href="http://ellislab.com/">EllisLab</a>, em termos gerais e em relação ao CodeIgniter, concede uma licença mundial, isenta de <em>royalties</em>, não exclusiva e sublicenciável de:</p>
<p><strong></p>
<ul>
<li>Concessão de Licença de Direitos Autorais</li>
<li>Concessão de Licença de Patentes</li>
<li>Concessão de Licença do código fonte</li>
<li>Exclusões da Concessão de Licença</li>
<li>Concessão de &#8220;Implantação Externa&#8221;</li>
</ul>
<p></strong></p>
<p>Mas, para saber na íntegra o que tudo isso significa, juridicamente falando (com todas suas aplicações, direitos e deveres), deem uma olhada na <a href="http://www.opensource.org/licenses/OSL-3.0">página com os termos da OSL 3.0</a>.</p>
<p>Parece que esta licença veio para dar ainda mais liberdade para o uso do CI (com determinadas garantias e isenções para a EllisLab, evidentemente). Agora, resta esperar para maiores notícias sobre a mudança para vermos, efetivamente, o que mudou, não mudou e o que pode ou não pode ser feito com esta <strong>mudança de licença do CodeIgniter para a OSL 3.0</strong> para saber as reais implicações na prática.</p>
<p>Enquanto isso, mais informações a respeito e discussões sobre a mudança podem ser acompanhadas no <a href="http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor/suggestions/2344554-gpl-compatible-non-copyleft-popular-licesne">UserVoice do CodeIgniter</a> e, no fórum oficial, no tópico &#8220;<a href="http://codeigniter.com/forums/viewthread/202562/">CodeIgniter changes license to OSL 3.0?</a>&#8220;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=uf9IX6BoRKY:qFt-M2-VKC0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=uf9IX6BoRKY:qFt-M2-VKC0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=uf9IX6BoRKY:qFt-M2-VKC0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=uf9IX6BoRKY:qFt-M2-VKC0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/uf9IX6BoRKY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/noticias/nova-licenca-codeigniter-osl-3/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/noticias/nova-licenca-codeigniter-osl-3/</feedburner:origLink></item>
		<item>
		<title>MY_Controller : estendendo o CI_Controller</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/t17-ZTacGaU/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/my_controller-estendendo-o-ci_controller/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 16:13:57 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=120</guid>
		<description><![CDATA[Como já vimos no artigo sobre Controllers no CodeIgniter, todo controller que criamos deve estender o controller &#8220;original&#8221; CI_Controller: ?View Code PHPclass Usuario extends CI_Controller &#123; // código &#125; Isso é simplesmente PHP Orientado a Objetos no qual, no exemplo, a classe &#8220;Usuario&#8221; estende a classe &#8220;CI_Controller&#8221; para herdar os métodos e propriedades herdáveis (públicos [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/09/codeigniter-my_controller-ci_controller.jpg" alt="MY_Controller : estendendo o CI_Controller" title="" width="500" height="200" class="aligncenter size-full wp-image-128 ilustra-artigo" /></p>
<p>Como já vimos no artigo sobre <a href="http://codeigniterbrasil.com/passos-iniciais/controllers-no-codeigniter/">Controllers no CodeIgniter</a>, todo controller que criamos deve estender o controller &#8220;original&#8221; <strong>CI_Controller</strong>:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code48'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12048"><td class="code" id="p120code48"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Usuario <span style="color: #000000; font-weight: bold;">extends</span> CI_Controller <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">// código</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Isso é simplesmente <a href="http://www.php.net/manual/pt_BR/oop5.intro.php">PHP Orientado a Objetos</a> no qual, no exemplo, a classe &#8220;Usuario&#8221; estende a classe &#8220;CI_Controller&#8221; para herdar os métodos e propriedades herdáveis (públicos e protegidos).</p>
<p>Como estamos falando do bom e &#8220;velho&#8221; PHP OO, pensem comigo: seria possível, também, estender o próprio CI_Controller, já que se trata, tão somente, de uma classe em PHP? A boa notícia é que, sim, é possível <strong>estender o CI_Controller</strong> e adicionar novas funcionalidades ao &#8220;controller-mor&#8221; do CodeIgniter!</p>
<h2>MY_Controller</h2>
<p>Podemos encontrar no arquivo principal de configuração do CodeIgniter, em <strong>/application/config/config.php</strong> a diretiva de qual é o prefixo a ser usado para estender classes nativas. Por padrão, é &#8220;MY_&#8221; (mas pode ser alterado):</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code49'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12049"><td class="code" id="p120code49"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'subclass_prefix'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'MY_'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Ou seja, quando queremos estender <a href="http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/">libraries</a> nativas (e alguns outros recursos, também), usamos o prefixo especificado nesta diretiva.</p>
<p>Então para estender o CI_Controller, é preciso criar o arquivo <strong>/application/core/MY_Controller.php</strong> e usar o modelo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code50'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12050"><td class="code" id="p120code50"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MY_Controller <span style="color: #000000; font-weight: bold;">extends</span> CI_Controller <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">// código</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Se não, vejamos: já que estendemos o CI_Controller para usar métodos e propriedades gerais, não faz mais sentido os controllers &#8220;comuns&#8221; estenderem o CI_Controller, já que ele continua o mesmo da instalação original. Portanto, a partir do momento em que se quer estender as funcionalidades do CI usando esta técnica, todos os controller devem, a partir de agora, estender o MY_Controller!</p>
<p>Nosso exemplo mudaria para:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code51'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12051"><td class="code" id="p120code51"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Usuario <span style="color: #000000; font-weight: bold;">extends</span> MY_Controller <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">// código</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Ficando com a seguinte hierarquia:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code52'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12052"><td class="code" id="p120code52"><pre class="php" style="font-family:monospace;">CI_Controller <span style="color: #339933;">&gt;</span> MY_Controller <span style="color: #339933;">&gt;</span> Usuario <span style="color: #009900;">&#40;</span>e demais controllers<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<h2>Benefícios de uso do MY_Controller</h2>
<p>Ao usar o <strong>MY_Controller</strong> temos tantos benefícios quantos podem ser necessários/requeridos em um projeto. Obviamente esta técnica não é para ser usada sem critérios, mas alguns pontos são indicativos de quando devemos nos valer do MY_Controller:</p>
<ul>
<li>Se determinados métodos e/ou propriedades devem (ou tem a chance de ser) usados em muitos controllers</li>
<li>Criação de métodos específicos que ajudarão e poderão ser usados em muitos controllers</li>
<li>Variáveis (propriedades) usadas em todos ou muitos controllers</li>
</ul>
<p>Porque, agora, os controllers do projeto que estendem o MY_Controller tem acesso a todas as funções e variáveis de CI_Controller e MY_Controller (conforme pode ser visto na representação da hierarquia acima). Vamos a um exemplo de uma função útil que pode constar no MY_Controller:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code53'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12053"><td class="code" id="p120code53"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MY_Controller <span style="color: #000000; font-weight: bold;">extends</span> CI_Controller <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> is_ajax<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_X_REQUESTED_WITH'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_X_REQUESTED_WITH'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'XMLHttpRequest'</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></td></tr></table></div>

<p>Nisso, todos os controllers que estenderem o MY_Controller contarão com o método is_ajax(), que testa se a requisição à classe está sendo feita via AJAX ou não. Poderíamos ter, por exemplo, algo assim:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p120code54'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12054"><td class="code" id="p120code54"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Usuario <span style="color: #000000; font-weight: bold;">extends</span> MY_Controller <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> get_by_name<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for AJAX...</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se não for AJAX...</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Conclusão</h2>
<p>Como pudemos ver, há casos em que todos ou a maioria dos controllers precisam acessar ou serem capazes de realizar determinados métodos e/ou ter determinadas propriedades em comum.</p>
<p>Caso seja esse seu caso, é possível facilitar a produção e a manutenção de códigos usando o <strong>MY_Controller</strong>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=t17-ZTacGaU:2kAKCsqB6aA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=t17-ZTacGaU:2kAKCsqB6aA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=t17-ZTacGaU:2kAKCsqB6aA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=t17-ZTacGaU:2kAKCsqB6aA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/t17-ZTacGaU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/my_controller-estendendo-o-ci_controller/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/my_controller-estendendo-o-ci_controller/</feedburner:origLink></item>
		<item>
		<title>CICON 2011 e novidades no mundo CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/f3osK2wTvwM/</link>
		<comments>http://codeigniterbrasil.com/noticias/cicon-2011-e-novidades-no-mundo-codeigniter/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 14:56:18 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[comunidade]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=126</guid>
		<description><![CDATA[Como os mais chegados no CodeIgniter já estavam sabendo, aconteceu recentemente a CodeIgntier Conference ou, como ficou mais conhecida, CICON. Infelizmente não deu para eu ir este ano e ajudar com o quórum de 100 codeigniters que lá estiveram&#8230; Quem sabe no próximo ano! ;-) E, no CICON 2011, algumas coisas importantes a respeito do [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="CICON 2011" src="http://farm7.static.flickr.com/6064/6067761331_afa0ab6d4e.jpg" class="aligncenter ilustra-artigo" width="500" height="331" /></p>
<p>Como os mais chegados no CodeIgniter já estavam sabendo, aconteceu recentemente a <strong>CodeIgntier Conference</strong> ou, como ficou mais conhecida, <strong>CICON</strong>. Infelizmente não deu para eu ir este ano e ajudar com o quórum de 100 codeigniters que lá estiveram&#8230; Quem sabe no próximo ano!  ;-)</p>
<p>E, no <a href="http://cicon2011.com/">CICON 2011</a>, algumas coisas importantes a respeito do melhor framework PHP foram decididas (<a href="http://philsturgeon.co.uk/blog/2011/08/cicon2011-and-the-future-of-codeigniter">comunicado oficial</a>), dentre as quais:</p>
<ul>
<li><strong>&#8220;Core&#8221; e &#8220;Reactor&#8221;? Não mais&#8230;</strong> É isso, mesmo, não há mais os diferentes <a href="http://codeigniterbrasil.com/noticias/codeigniter-reactor-codeigniter-core-e-mais-novidades-do-mundo-ci/">grupos &#8220;Core&#8221; e &#8220;Rector&#8221;</a> para manter o framework. Devido a algumas reclamações da comunidade, agora voltamos ao bom e velho <strong>CodeIgniter</strong>, somente.</li>
<li><strong>Mudança para o Github.</strong> Agora o repositório oficial está hospedado no <a href="https://github.com/">Github</a>. Segundo os próprios <em>engineers</em>, essa será uma mudança que atenderá melhor às necessidades do projeto e anseios da comunidade.</li>
<li><strong>CodeIgniter 2.0.3.</strong> Saiu uma nova versão do CI! Veja no <a href="ho que mudougniter.com/user_guide/changelog.html">changelog</a> o que mudou e, se vai fazer alguma diferença em algum projeto seu, <a href="http://codeigniter.com/user_guide/installation/upgrading.html">atualize</a>!</li>
</ul>
<p>Segundo um dos principais <em>engineers</em>, <a href="http://philsturgeon.co.uk/">Phil Sturgeon</a>, o encontro foi bastante positivo, o pessoal gostou de se encontrar e bater um papo a respeito do CI e, inclusive, a base de contribuidores aumentou! Ele, e todos nós envolvidos com o projeto, esperamos que o CI continue crescendo!</p>
<p>Agora, vamos a algumas <a href="http://www.flickr.com/photos/kylefarris/sets/72157627489315606/">fotos do CICON 2011</a>!</p>
<p>Quem sabe no próximo alguns <em>brazilians codeigniters</em> também aparece!  ;-)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=f3osK2wTvwM:aMMSY2-j-D4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=f3osK2wTvwM:aMMSY2-j-D4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=f3osK2wTvwM:aMMSY2-j-D4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=f3osK2wTvwM:aMMSY2-j-D4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/f3osK2wTvwM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/noticias/cicon-2011-e-novidades-no-mundo-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/noticias/cicon-2011-e-novidades-no-mundo-codeigniter/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter Template Parser Class</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/m3jPhfCwyy0/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/codeigniter-template-parser-class/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 17:38:02 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[documentação]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=123</guid>
		<description><![CDATA[Vimos no artigo &#8220;Models, Views e Controllers trabalhando juntos no CodeIgniter&#8221; como é feita a &#8220;passagem&#8221; de dados numa aplicação em CodeIgniter e como se faz para exibir informações nas views. Bem, esse é o método &#8220;tradicional&#8221; de se trabalhar nas views, mas não o único! Já existe no CodeIgniter, nativamente, uma maneira de deixar [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/08/codeigniter-template-parser-engine.jpg" alt="CodeIgniter Template Parser Engine Class: imagem ilustrativa" title="" width="500" height="200" class="ilustra-artigo aligncenter size-full wp-image-125" /></p>
<p>Vimos no artigo &#8220;<a href="http://codeigniterbrasil.com/passos-iniciais/models-views-controllers-trabalhando-juntos-codeigniter/">Models, Views e Controllers trabalhando juntos no CodeIgniter</a>&#8221; como é feita a &#8220;passagem&#8221; de dados numa aplicação em <strong>CodeIgniter</strong> e como se faz para exibir informações nas <a href="http://codeigniterbrasil.com/passos-iniciais/views-no-codeigniter/">views</a>.</p>
<p>Bem, esse é o método &#8220;tradicional&#8221; de se trabalhar nas views, mas não o único! Já existe no CodeIgniter, nativamente, uma maneira de deixar os views mais enxutos e facilmente inteligíveis; uma maneira de exibir dados mais fácil e rapidamente; e essa maneira é usar a <strong>Template Parser Class do CodeIgniter</strong>!</p>
<h2>O que é a Template Parser Class</h2>
<p>A <a href="http://codeigniter.com/user_guide/libraries/parser.html">Template Parser Class</a> é uma classe nativa do CodeIgniter que permite usar o sistema de &#8220;<strong>parser</strong>&#8221; em pseudo-variáveis nas views. Se você ainda não trabalhou com <em>template engines</em>, então veja a nítida diferença entre exibir dados assim:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p123code61'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12361"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p123code61"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?</span>php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$title</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #339933;">&lt;/</span>h1<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$posts</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$p</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    <span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/blog/&lt;?php echo <span style="color: #006699; font-weight: bold;">$p-&gt;slug</span> ?&gt;&quot;</span><span style="color: #339933;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?</span>php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$p</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #339933;">&lt;/</span>a<span style="color: #339933;">&gt;&lt;/</span>h1<span style="color: #339933;">&gt;</span>
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$p</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>E assim:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p123code62'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12362"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p123code62"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #000088;">$title</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>h1<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>posts<span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/blog/{slug}&quot;</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#123;</span>title<span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>a<span style="color: #339933;">&gt;&lt;/</span>h1<span style="color: #339933;">&gt;</span>
    <span style="color: #009900;">&#123;</span>content<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>posts<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>E aí, qual você prefere?  ;-)</p>
<h2>Como usar a Template Parser Class do CodeIgniter</h2>
<p>Se você gostou dessa maneira &#8220;diferente&#8221; de apresentar seus dados nas views, saiba que é muito simples começar a usar a Template Parser Class!</p>
<p>Primeira, você deve <a href="http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/">carregar a biblioteca</a> (ou configurar para auto carregar, como conta no artigo) de parser:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p123code63'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12363"><td class="code" id="p123code63"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'parser'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h4>No controller</h4>
<p>Tomemos um controller fictício para exemplificar o uso do parser. Primeiro carregamos a library (caso não esteja auto carregada), pegar os dados do <a href="http://codeigniterbrasil.com/passos-iniciais/models-no-codeigniter/">model</a>, normalmente, mas, ao invés de darmos um load em alguma view usando $this->load->view(), chamamos o &#8220;método-base&#8221; da Template Parser Class:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p123code64'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12364"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p123code64"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Carrega Template Parser Class</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'parser'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Carrega um model de Blog qualquer</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Blog_model'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Pega algumas informações do BD	</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Blog de Testes do CodeIgniter'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'posts'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Blog_model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_posts</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Chama a view &quot;parseada&quot;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parser</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parse</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog_index'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Perceba o seguinte neste método:</p>
<ul>
<li><strong>Primeiro parâmetro.</strong> É o nome da view que se deseja &#8220;parsear&#8221; (&#8220;blog_index&#8221;).</li>
<li><strong>Segundo parâmetro.</strong> Dados enviados para o &#8220;parseamento&#8221; ($data).</li>
</ul>
<p>Dessa maneira, como foi visto no início do artigo, é possível usar a seguinte sintaxe para exibição de dados nas views:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p123code65'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12365"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p123code65"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #000088;">$title</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>h1<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>posts<span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/blog/{slug}&quot;</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#123;</span>title<span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>a<span style="color: #339933;">&gt;&lt;/</span>h1<span style="color: #339933;">&gt;</span>
    <span style="color: #009900;">&#123;</span>content<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>posts<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Veja que, para as variáveis simples, não é preciso echo(), print() ou qualquer função de exibição que seja. Basta envolver o nome da pseudo-variável entre colchetes que funciona! Para <em>sets</em> de resultados vindos do BD ou algum array multidimensional de dados, nos quais, para cada iterador, há valores diferentes a serem exibidos, basta &#8220;abrir&#8221; e &#8220;fechar&#8221; o par de pseudo-variáveis, tal como consta no exemplo.</p>
<p>Há um terceiro parâmetro, booleano, opcional, que pode ser usado para, ao invés de já enviar as pseudo-variáveis para serem exibidas, retorna o valor do &#8220;parseamento&#8221; para ser usado de alguma outra forma na view:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p123code66'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12366"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p123code66"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parser</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parse</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog_index'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</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></pre></td></tr></table></div>

<p>E existe, também, um método para parsear strings ao invés de views. Caso queira saber mais a respeito, veja o método <em>$this->parser->parse_string()</em> na <a href="http://codeigniter.com/user_guide/libraries/parser.html">documentação oficial</a>.</p>
<h2>Conclusão sobre o template engine do CodeIgniter</h2>
<p>Como foi visto, usar o <strong>template engine do CodeIgniter</strong> para fazer o parser de pseudo-variáveis nas views é bastante simples e intuitivo. Além de reduzir o tamanho do código e poupar tempo de escrita, o código fica tão fácil de entender que até os designers conseguirão realizar pequenas manutenções em views!  ;-)</p>
<p>É uma template engine básica, sem maiores recursos de outras mais poderosas que podemos encontrar por aí, mas, até para CI existem recursos de terceiros que aprimoram isso. Provavelmente estes serão mostrados em artigos futuros, <a href="http://codeigniterbrasil.com/feed">não percam</a>!</p>
<p>É verdade que há um consumo de recursos ligeiramente mais elevado do que se não estivéssemos usando um echo(), mas isso não é considerável para projetos pequenos e médios, então a <strong>Template Parser Class</strong> pode ser usada sem preocupações!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=m3jPhfCwyy0:KIPqoX77Flk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=m3jPhfCwyy0:KIPqoX77Flk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=m3jPhfCwyy0:KIPqoX77Flk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=m3jPhfCwyy0:KIPqoX77Flk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/m3jPhfCwyy0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/codeigniter-template-parser-class/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/codeigniter-template-parser-class/</feedburner:origLink></item>
		<item>
		<title>Carregando bibliotecas (libraries) no CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/VeWO0DlkZPs/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 11:08:04 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[libraries]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=121</guid>
		<description><![CDATA[No artigo apresentando as classes do CodeIgniter demos uma passada geral em algumas das funcionalidades do framework. Como pôde ser visto, o CodeIgniter já vem com uma série de classes, funcões e funcionalidades para facilitar, e muito, a vida do programador! Mas, para usarmos e nos valermos deste poder, é preciso, antes, que saibamos como [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/08/carregar-biblioteca-codeigniter.jpg" alt="Como carregar bibliotecas no CodeIgniter: imagem ilustrativa" title="" width="500" height="200" class="aligncenter size-full wp-image-138 ilustra-artigo" /></p>
<p>No artigo apresentando as classes do <a href="http://codeigniterbrasil.com/passos-iniciais/classes-do-codeigniter/">CodeIgniter</a> demos uma passada geral em algumas das funcionalidades do <em>framework</em>. Como pôde ser visto, o <strong>CodeIgniter</strong> já vem com uma série de classes, funcões e funcionalidades para facilitar, e muito, a vida do programador!</p>
<p>Mas, para usarmos e nos valermos deste poder, é preciso, antes, que saibamos como &#8220;chamar&#8221; este poder. E este artigo mostrará justamente isso: <strong>como carregar e usar bibliotecas do CodeIgniter</strong>!</p>
<h2>Loader</h2>
<p>Existe, no <em>core</em> do CodeIgniter, uma classe que é iniciada sempre e automaticamente, responsável por prover o loader dos recursos do CI: é a <strong>Loader</strong> (&#8220;carregador&#8221;). Através desta classe é possível carregar recursos do CI, tais como <a href="http://codeigniterbrasil.com/passos-iniciais/views-no-codeigniter/">views</a>, <a href="http://codeigniterbrasil.com/passos-iniciais/diferenca-entre-library-helper-plugin-codeigniter/">helpers e libraries</a>, <a href="http://codeigniterbrasil.com/passos-iniciais/models-no-codeigniter/">models</a> e outros.</p>
<p>Basicamente, a loader possui uma sintaxe bastante comum entre os diferentes recursos que podem ser chamadas, diferindo, somente, em algum parâmetros. Veremos, a seguir, como carregar um dos recursos mais comuns do CodeIgniter> libraries.</p>
<h2>Como carregar uma library no CodeIgniter</h2>
<p>Para se carregar uma library (ou, se preferir, &#8220;biblioteca&#8221;) no CodeIgniter, use o seguinte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code74'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12174"><td class="code" id="p121code74"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'classe'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$config</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'alias'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Ou seja: o primeiro parâmetro é o nome do recurso que se deseja carregar; o segundo, as configurações desta classe e; o terceiro, seu <em>alias</em> (apelido).</p>
<h4>Nome da library</h4>
<p>Por exemplo, para carregar as funcionalidades de e-mail do CodeIgniter, usa-se o seguinte (em qualquer controller):</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code75'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12175"><td class="code" id="p121code75"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Pronto, as funcionalidades de e-mail já estão prontas para serem usadas! Uma vez carregada a classe, você precisará acessar os métodos desta e, para isso, usa-se o modelo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code76'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12176"><td class="code" id="p121code76"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">funcao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Por exemplo, a classe library possui a função to() que serve para especificar para quem o e-mail será enviado. Depois de carregada a classe, usa-se</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code77'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12177"><td class="code" id="p121code77"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">to</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fulano.de.tal@exemplo.com.br'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Não se preocupe com funções específicas no momento. Futuramente, explicaremos o uso de todas as funcionalidades do CI aqui no <a href="http://codeigniterbrasil.com/">CodeIgniter Brasil</a>.  ;-)</p>
<h4>Configurações</h4>
<p>O segundo parâmetro (opcional), como vimos, é a configuração que se quer quando o recurso for inicializado. Por exemplo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code78'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12178"><td class="code" id="p121code78"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'mailtype'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'html'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'charset'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'utf-8,
    '</span>priority<span style="color: #0000ff;">' =&gt; '</span><span style="color: #cc66cc;">1</span><span style="color: #0000ff;">'
);
&nbsp;
$this-&gt;load-&gt;library('</span>email<span style="color: #0000ff;">', $config);</span></pre></td></tr></table></div>

<p>Ou seja, através de um array de configurações, passamos as opções que sejam da necessidade naquele momento de iniciar o recurso (novamente, não se preocupe, pois a classe de e-mail será vista em momento futuro).</p>
<h4>Apelido</h4>
<p>O terceiro parâmetro (opcional) é o apelido que podemos atribuir àquela classe para seu uso durante a programação. Por exemplo, é possível fazer o seguinte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code79'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12179"><td class="code" id="p121code79"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'em'</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;">em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">to</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fulano.de.tal@exemplo.com.br'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Obviamente este apelido de exemplo não tem nenhuma utilidade prática e serviu somente para exemplificar o uso do recurso. Em projetos &#8220;de verdade&#8221;, provavelmente não será preciso atribuir apelidos aos recursos básicos do CI.</p>
<h2>Auto carregar libraries no CodeIgniter</h2>
<p>É bastante comum um projeto usar diversos recursos nativos do CodeIgniter. Se esse for o caso, imagine a inconveniência de carregar a biblioteca em cada controller&#8230; Felizmente, existe a possibilidade de autoload de libraries (de demais recursos) do CodeIgniter.</p>
<p>Basta acessar o arquivo <strong>application/config/autoload.php</strong> e procurar o array de recursos que se quer. No caso das libraries, que estamos tratando, basta encontrar a diretiva &#8220;libraries&#8221; (na versão atual, linha 55) e preencher o array com os nomes das bibliotecas que se queira. Por exemplo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p121code80'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12180"><td class="code" id="p121code80"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'libraries'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'database'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'session'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Com isso, estas bibliotecas serão automaticamente carregadas em cada chamada ao CI, dispensando e economizando o uso de um loader específico para cada recurso.</p>
<h2>Palavras finais</h2>
<p>Como pôde ser visto, carregar e usar recursos de uma <strong>library no CodeIgniter</strong> é bastante simples e, depois de certo tempo usando o <em>framework</em>, bastante intuitivo.</p>
<p>A atenção fica para 2 pontos: ao usar apelidos, não cometer o erro juvenil de dar nomes iguais para recursos diferentes e; analisar bem o recurso de autoload explicado, já que carregar recursos do CI para controllers que não farão uso deste é desperdiçar recursos e comprometer a performance do projeto.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=VeWO0DlkZPs:hUCLK2peJi4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=VeWO0DlkZPs:hUCLK2peJi4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=VeWO0DlkZPs:hUCLK2peJi4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=VeWO0DlkZPs:hUCLK2peJi4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/VeWO0DlkZPs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/carregando-bibliotecas-libraries-no-codeigniter/</feedburner:origLink></item>
		<item>
		<title>Autocomplete do CodeIgniter 2 no Eclipse</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/x_Ql0rDWwrs/</link>
		<comments>http://codeigniterbrasil.com/integracao/autocomplete-codeigniter-eclipse/#comments</comments>
		<pubDate>Mon, 16 May 2011 13:58:38 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Integração]]></category>
		<category><![CDATA[código-fonte]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=108</guid>
		<description><![CDATA[Depois de alguns artigos aqui no CodeIgniter Brasil, algumas pessoas enviaram questões referentes à facilidade em se programar com CodeIgniter. É certo que cada um escolhe seu ambiente de desenvolvimento segundo seus próprios critérios, mas existem alguns que são realmente fantásticos para se trabalhar com PHP. É o caso do Eclipse PDT (PHP Development Tools), [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/05/autocomplete-codeigniter-eclipse-tela-final.gif" alt="Autocomplete do CodeIgniter 2 no Eclipse: exemplo" title="" width="500" height="200" class="size-full wp-image-112 aligncenter ilustra-artigo" /></p>
<p>Depois de alguns artigos aqui no <a href="http://codeigniterbrasil.com/">CodeIgniter Brasil</a>, algumas pessoas enviaram questões referentes à facilidade em se programar com CodeIgniter. É certo que cada um escolhe seu ambiente de desenvolvimento segundo seus próprios critérios, mas existem alguns que são realmente fantásticos para se trabalhar com PHP. É o caso do <a href="http://www.eclipse.org/pdt/">Eclipse PDT</a> (PHP Development Tools), &#8220;ramificação&#8221; do <a href="http://www.eclipse.org/">Eclipse</a>, um dos IDEs mais conhecidos e eficientes para programação.</p>
<p>Então, para o caso de você já usar o IDE, este tutorial vai ensinar <strong>como fazer autocomplete do CodeIgniter no Eclipse</strong>. Caso ainda não o conheça, dê uma pesquisada, baixe e teste o IDE que certamente você vai gostar. Não digo que esta deve ser a ferramenta definitiva para todas as necessidades, mas, certamente, é uma opção interessante a se considerar. Então, para entender as explicações, é preciso que você tenha tido, pelo menos, um mínimo de contato com o Eclipse PDT.</p>
<h2>A lógica do autocomplete CodeIgniter + Eclipse</h2>
<p>Por padrão, o Eclipse já faz <strong>autocomplete de classes e funções</strong> que você desenvolve em diferentes arquivos. Quando se trata de um projeto &#8220;comum&#8221;, é fácil para ele reconhecer e realizar o autocompletar. No entanto, para o CodeIgniter, em função da disposição peculiar de seus arquivos constituintes, devemos &#8220;ensinar&#8221; a ferramenta a reconhecer estas classes e funções.</p>
<p>O que é preciso para que o <strong>Eclipse faça o autocompletar do CodeIgniter</strong> é que ele, de alguma forma, tenha acesso e reconheça todas as classes e funções presentes no core do CI. A partir disso, ele será capaz de realizar o autocomplete dentro de qualquer controller e/ou model que você crie em seu projeto.</p>
<p>Basicamente, o que precisamos é:</p>
<ul>
<li>Criar 2 projetos no Eclipse: 1 com o CodeIgniter &#8220;puro&#8221;; outro com o CodeIgniter para o projeto, propriamente dito;</li>
<li>Incluir, no CI &#8220;puro&#8221;, um pequeno trecho de código em 2 arquivos do code;</li>
<li>No &#8220;Include Path&#8221; do projeto, propriamente dito, referenciar o projeto do CI &#8220;puro&#8221;;</li>
</ul>
<h2>Criando projetos no Eclipse</h2>
<p><a href="http://codeigniter.com/download.php">Baixe a versão mais recente do CodeIgniter</a>. O download fornece um arquivo zipado. Na pasta de sua preferência, descompacte a estrutura 2 vezes: uma delas será nossa &#8220;base&#8221;, o outro, o projeto oficial. Chame, por exemplo, respectivamente, &#8220;CI_BASE&#8221; e &#8220;PROJETO&#8221;.</p>
<p>No Eclipse, crie 2 projetos, cada um apontando para uma pasta que foi gerada a partir da extração do CodeIgniter.</p>
<div id="attachment_109" class="wp-caption aligncenter" style="width: 510px"><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/05/autocomplete-codeigniter-eclipse-passo1.gif" alt="Autocomplete do CodeIgniter 2 no Eclipse" title="" width="500" height="200" class="size-full wp-image-109" /><p class="wp-caption-text">Tela mostrando os 2 projetos criados no Eclipse</p></div>
<h2>Código-extra no &#8220;CI_BASE&#8221;</h2>
<p>No projeto CI_BASE, você vai precisar alterar 2 arquivos de core:</p>
<p><strong></p>
<ul>
<li>/system/core/controller.php</li>
<li>/system/core/model.php</li>
</ul>
<p></strong></p>
<p>Acrescente, em ambos, exatamente após o início do escopo da classe, o seguinte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p108code82'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p10882"><td class="code" id="p108code82"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * @var CI_Config
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$config</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_DB_active_record
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$db</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Email
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$email</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Form_validation
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$form_validation</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Input
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$input</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Loader
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$load</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Router
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$router</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Session
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$session</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Table
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$table</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Unit_test
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$unit</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_URI
 */</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$uri</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @var CI_Pagination
 */</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$pagination</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Atente-se em inserir o código nos lugares corretos.</p>
<div id="attachment_111" class="wp-caption aligncenter" style="width: 510px"><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/05/autocomplete-codeigniter-eclipse-passo3.gif" alt="Autocomplete do CodeIgniter 2 no Eclipse" title="" width="500" height="200" class="size-full wp-image-111" /><p class="wp-caption-text">Insira o código onde está a linha em destaque. O mesmo para /system/core/model.php.</p></div>
<h2>Referenciando CI_BASE em PROJETO</h2>
<p>Por fim, é preciso referenciar o projeto CI_BASE em PROJETO, a fim de que o autocomplete aparece neste. Para tanto, faça o seguinte:</p>
<ul>
<li>Clique o botão direito no projeto PROJETO e vá em <strong>Properties > PHP Include Path > aba Projects > botão Add&#8230;</strong></li>
<li>Selecione o check de <strong>CI_BASE > botão OK</strong></li>
<li>Confirme a ação clicando no botão <strong>OK</strong></li>
</ul>
<div id="attachment_110" class="wp-caption aligncenter" style="width: 510px"><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/05/autocomplete-codeigniter-eclipse-passo2.gif" alt="Autocomplete do CodeIgniter 2 no Eclipse" title="" width="500" height="200" class="size-full wp-image-110" /><p class="wp-caption-text">Include Path do projeto CI_BASE</p></div>
<p>A partir de agora, o autocomplete do CodeIgniter estará disponível em qualquer controller e model que você crie para seu projeto! Faça o teste e comprove: crie algum controller e tente usar, por exemplo, a função de carregar um view (já explicada no artigo sobre <a href="http://codeigniterbrasil.com/passos-iniciais/views-no-codeigniter/">Views no CodeIgniter</a>).<br />
<div id="attachment_112" class="wp-caption aligncenter" style="width: 510px"><img src="http://codeigniterbrasil.com/wp-content/uploads/2011/05/autocomplete-codeigniter-eclipse-tela-final.gif" alt="Autocomplete do CodeIgniter 2 no Eclipse" title="" width="500" height="200" class="size-full wp-image-112" /><p class="wp-caption-text">Exemplo de autocomplete do CodeIgniter no Eclipse</p></div></p>
<h2>Conclusão</h2>
<p>Na verdade, PROJETO continua sendo somente uma &#8220;instalação&#8221; do CodeIgniter. CI_BASE foi adicionado à lista de projetos somente para dar o suporte necessário ao autocomplete. Portanto, esta é uma técnica específica de prover o<strong> autocomplete do CodeIgniter no Eclipse</strong>, servindo para conferir maior comodidade, rapidez e eficiência para quem programa com CI neste incrível IDE.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=x_Ql0rDWwrs:cuM0LvqGXCE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=x_Ql0rDWwrs:cuM0LvqGXCE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=x_Ql0rDWwrs:cuM0LvqGXCE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=x_Ql0rDWwrs:cuM0LvqGXCE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/x_Ql0rDWwrs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/integracao/autocomplete-codeigniter-eclipse/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/integracao/autocomplete-codeigniter-eclipse/</feedburner:origLink></item>
		<item>
		<title>Estrutura de diretórios: organização de pastas do CodeIgniter 2</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/qs0i3g_ITaA/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/estrutura-de-diretorios-organizacao-de-pastas-do-codeigniter-2/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 12:59:08 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[diretórios]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[libraries]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=106</guid>
		<description><![CDATA[Não dá pra trabalhar com o CodeIgniter sem conhecer sua estrutura de diretórios. É conhecendo como é a organização das pastas no CodeIgniter e sabendo sua função dentro do &#8220;todo&#8221; do framework que é possível mexer no CI com eficiência e consciência &#8211; também é importantíssimo conhecer o Fluxograma de Dados do CodeIgniter (se ainda [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_56" class="wp-caption aligncenter" style="width: 277px"><img class="size-full wp-image-56" title="Estrutura de diretórios do CodeIgniter 2" src="http://codeigniterbrasil.com/wp-content/uploads/2011/03/estrutura-de-diretorios-codeigniter-2.gif" alt="Estrutura de diretórios do CodeIgniter 2" width="267" height="372" /><p class="wp-caption-text">Estrutura de diretórios do CodeIgniter 2</p></div>
<p>Não dá pra trabalhar com o <strong>CodeIgniter</strong> sem conhecer sua <strong>estrutura de diretórios</strong>. É conhecendo como é a <strong>organização das pastas</strong> no CodeIgniter e sabendo sua função dentro do &#8220;todo&#8221; do <em>framework</em> que é possível mexer no CI com <strong>eficiência</strong> e <strong>consciência</strong> &#8211; também é importantíssimo conhecer o <a title="Fluxograma de Dados do CodeIgniter: como tudo funciona" href="http://codeigniterbrasil.com/passos-iniciais/fluxograma-de-dados-do-codeigniter-como-tudo-funciona/">Fluxograma de Dados do CodeIgniter</a> (se ainda não leu o artigo, leia antes de continuar).</p>
<p>Com um pouco mais de experiência é possível alterar a <strong>estrutura de diretórios do CodeIgniter</strong>, mas, para fins didáticos, será mostrada no tutorial a estrutura padrão de pastas do <strong>CodeIgniter 2</strong>.</p>
<p>Não serão detalhadas as funções/possibilidades completas de cada pasta e seus respectivos arquivos; isso será feito, com o tempo, na medida em que novos artigos são publicados no <em>blog</em>. Portanto, não é preciso ficar frustrado caso encontre termos que ainda desconhece; <a title="Assinar feed do CodeIgniter Brasil." href="http://codeigniterbrasil.com/feed">assine o feed do CodeIgniter Brasil</a> para não perder as atualizações.  ;-)</p>
<h2>Visão geral da estrutura de pastas do CodeIgniter 2</h2>
<p>Como pode ser visto na imagem da estrutura de pastas acima, na raiz da estrutura do CodeIgniter existem 3 diretórios e 2 arquivos.</p>
<h4>Diretórios</h4>
<p>Os 3 diretórios existentes na raiz da estrutura do CodeIgniter são:</p>
<ul>
<li><strong>application.</strong> Pasta onde os arquivos do aplicativo desenvolvido ficam. Praticamente toda a codificação em CI fica nesta pasta, que abriga seus <a title="MVC (Model – View – Controller)" href="http://codeigniterbrasil.com/passos-iniciais/mvc-model-view-controller/">models, views, controllers</a> e outros que ainda serão tratados no <em>blog</em>.</li>
<li><strong>system.</strong> Local destinado aos arquivos que fazem o CodeIgniter o que é; são os arquivos do <em>core</em>. Geralmente, não devem ser mexidos.</li>
<li><strong>user_guide.</strong> Contém o Guia do Usuário (<em>User Guide</em>) do CodeIgniter (cópia da documentação <em>online</em>).</li>
</ul>
<h4>Arquivos</h4>
<p>Juntamente com os diretórios supracitados, na raiz do esquema de diretórios do CodeIgniter existem 2 arquivos:</p>
<ul>
<li><strong>index.php.</strong> Primordial para o funcionamento do CI, contém informações para se alterar o nível de <a href="http://br.php.net/manual/pt_BR/errorfunc.configuration.php#ini.error-reporting">error reporting</a> que se vai trabalhar; opcionalmente, também é possível alterar os nomes padrão da pasta &#8220;system&#8221; e &#8220;application&#8221; (mais a respeito: <a title="Instalação e configuração inicial do CodeIgniter" href="http://codeigniterbrasil.com/passos-iniciais/instalacao-e-configuracao-inicial-do-codeigniter/">Instalação e configuração inicial do CodeIgniter</a>), dentre outras muitas configurações</li>
<li><strong>licente.txt.</strong> É o arquivo com a licença do CI que, como já foi tratado no artigo sobre <a title="CodeIgniter: Requisitos de Servidor e Licença de Uso" href="http://codeigniterbrasil.com/diversos/codeigniter-requisitos-de-servidor-e-licenca-de-uso/">requisitos de servidor e licença de uso</a>, deve constar em todo <em>software</em>/aplicativo feito em CodeIgniter.</li>
</ul>
<h2>application</h2>
<p>Sem dúvidas, a pasta<strong> application</strong> é a mais importante para o desenvolvimento dos aplicativos e é a que mais vai exigir sua atenção/codificação. Já que todo seu trabalho vai ser aqui, é importante conhecer bem a estrutura de subdiretórios da pasta &#8220;application&#8221;:</p>
<ul>
<li><strong>cache.</strong> Pasta usada quando se está usando <a href="http://codeigniter.com/user_guide/general/caching.html">caching no CodeIgniter</a>. É aqui que as páginas cacheadas ficam armazenadas e são servidas.</li>
<li><strong>config.</strong> Contém diversos (e importantes) arquivos relacionados a configurações de seu CI. São arquivos de configuração de <em>database</em>, variáveis sobre URL, quais <em>libraries</em> e <em>helpers</em> serão carregados automaticamente e muitas outras coisas.</li>
<li><strong>controllers.</strong> Armazena os <em>controllers</em> que você cria para o seu <em>software</em>.</li>
<li><strong>core.</strong> Pasta criada no CI 2 para conter algumas bibliotecas consideradas mais &#8220;core&#8221; que outras. Não é usada em todos os projetos.</li>
<li><strong>errors.</strong> Vem com os templates de páginas de erros do CodeIgniter (erros genéricos, 404, conexão ao banco de dados, etc). É conveniente que tudo isso seja alterado para que os erros do aplicativo fiquem personalizados e consonantes com a finalidade deste.</li>
<li><strong>helpers.</strong> Para armazenar todos os <em>helpers</em> que você venha a criar/aprimorar.</li>
<li><strong>hooks.</strong> Para colocar os <em>hooks</em> que você cria. Em artigos futuros será mostrado que <em>hooks</em> são a maneira mais rápida e segura de você extender o <em>core</em> do CodeIgniter (geralmente feito por usuários avançados).</li>
<li><strong>language.</strong> Para aplicativos multi-idioma, esta pasta é bem usada por armazenar as mensagens nas diferentes escritas.</li>
<li><strong>libraries.</strong> Aqui ficam as<em> libraries</em> personalizadas, com funcionalidades para o programa a ser criado. Perceba que há diferença entre as pastas <strong>system/libraries</strong> e <strong>system/application/libraries</strong>.</li>
<li><strong>logs.</strong> Quando se habilita o salvamento de logs em arquivo em <strong>/application/config/config.php</strong>, é nesta pasta que eles serão salvos. </li>
<li><strong>migrations.</strong> Quando se usa acesso externo ao CodeIgniter via linha de comando (CLI), a pasta &#8220;migrations&#8221; é usada para algumas operações.</li>
<li><strong>models.</strong> Armazena os <em>models</em> que você cria para seu aplicativo.</li>
<li><strong>third_party.</strong> É possível distribuir aplicativos inteiros do CodeIgniter de forma fácil, e, para tal, é possível criar estrutura personalizadas nesta pasta, onde constam todos helpers, liberaries, models, etc, destas aplicações.</li>
<li><strong>views.</strong> Armazena os <em>views</em> que você cria para seu programa.</li>
</ul>
<div class="alert">Todos os seus projetos terão imagens, folhas de estilo, javascript e outros arquivos necessários. Evidentemente será preciso pastas para organizar tudo isso. Existe uma técnica que preconiza que a melhor maneira para organizar isso é fazer pastas na raiz da instalação do CodeIgniter &#8211; ou seja, no mesmo nível hierárquico da pasta <strong>application</strong>. Mas, para se fazer isso, é preciso utilizar um <a href="http://en.wikipedia.org/wiki/Htaccess">.htaccess</a> com algumas poucas linhas para que o CodeIgniter reconheça as novas pastas:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p106code84'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p10684"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p106code84"><pre class="php" style="font-family:monospace;">RewriteEngine on
RewriteCond $<span style="color: #cc66cc;">1</span> <span style="color: #339933;">!</span>^<span style="color: #009900;">&#40;</span>index\<span style="color: #339933;">.</span>php<span style="color: #339933;">|</span>img<span style="color: #339933;">|</span>css<span style="color: #339933;">|</span>js<span style="color: #009900;">&#41;</span>
RewriteRule ^<span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span>$ index<span style="color: #339933;">.</span>php<span style="color: #339933;">/</span>$<span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#91;</span>L<span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<p>Basicamente as instruções fazem com que o CI reconheça as pastas &#8220;img&#8221;, &#8220;css&#8221;, &#8220;js&#8221; e, de quebra, ainda retiram &#8220;index.php&#8221; do URL (algo que será explicado em um momento mais oportuno).</p></div>
<h2>O importante é a função de cada pasta</h2>
<p>Principalmente quando se está começando, é bastante comum ficar em dúvida sobre a função de cada diretório e ter receio de criar arquivos no lugar errado. Estudando a estrutura de pastas do CodeIgniter, certamente esse não será um problema que irá travar seu processo de desenvolvimento.</p>
<p>O CodeIgniter foi projetado para manter seguros seus arquivos de <em>core</em> e é por uma razão que existe uma pasta específica para você criar os arquivos de seu <em>software</em>. <strong>Você deve concentrar seus arquivos em &#8220;application&#8221;</strong>, criando arquivos nos diretórios adequados &#8211; conforme foi abordado neste artigo &#8211; e somente criar/alterar arquivos de &#8220;system&#8221; caso você saiba exatamente o que está fazendo (e tenha um bom motivo pra isso).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=qs0i3g_ITaA:nsk5BJCOxFc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=qs0i3g_ITaA:nsk5BJCOxFc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=qs0i3g_ITaA:nsk5BJCOxFc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=qs0i3g_ITaA:nsk5BJCOxFc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/qs0i3g_ITaA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/estrutura-de-diretorios-organizacao-de-pastas-do-codeigniter-2/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/estrutura-de-diretorios-organizacao-de-pastas-do-codeigniter-2/</feedburner:origLink></item>
		<item>
		<title>Classes do CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/65LEd65-O6E/</link>
		<comments>http://codeigniterbrasil.com/passos-iniciais/classes-do-codeigniter/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 13:10:46 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[classes]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=98</guid>
		<description><![CDATA[Como já foi mostrado no artigo sobre o que é um framework e algumas características do framework CodeIgniter, existem, embutidos, vários e vários arquivos prontos com scripts que garantem um bom funcionamento ao CI. E fazem parte dessa estrutura as classes. Grande parte do poder do CodeIgniter se dá devido a suas classes e o [...]]]></description>
			<content:encoded><![CDATA[<p>Como já foi mostrado no artigo sobre <a href="http://codeigniterbrasil.com/passos-iniciais/o-que-e-um-framework-definicao-e-beneficios-de-se-usar-frameworks/">o que é um framework</a> e <a href="http://codeigniterbrasil.com/passos-iniciais/codeigniter-framework-php-agil-robusto-e-de-alta-performance/">algumas características do framework CodeIgniter</a>, existem, embutidos, vários e vários arquivos prontos com scripts que garantem um bom funcionamento ao CI.</p>
<p>E fazem parte dessa estrutura as <strong>classes</strong>. Grande parte do <strong>poder do CodeIgniter</strong> se dá devido a suas classes e o que se pode fazer com elas. Veja que classes são essas e um resumo sobre o que cada uma pode fazer.</p>
<h2>Classes do CodeIgniter: apresentação e resumo</h2>
<ul>
<li><strong>Benchmarking Class</strong>. A classe de benchmarking permite &#8220;marcar&#8221; pontos no código, fazer comparações sobre tempos de execução diferentes e até saber quanto de memória está sendo gasta para rodar a aplicação.</li>
<li><strong>Calendar Class</strong>. Com esta classe é possível criar calendários dinâmicos. Criar o layout dos calendários e inserir dados dinâmicos é tarefa simples com esta classe.</li>
<li><strong>Cart Class</strong>. A classe de carrinho de compras tem todo o básico que envolve processo de e-commerce: adicionar itens ao carrinho, atualizar, deletar, mostrar o preço, etc.</li>
<li><strong>Config Class</strong>. Serve para mostrar as opções de configuração do CodeIgniter, tanto as <em>default</em> (/application/config/config.php), quanto as em arquivos personalizados.</li>
<li><strong>Email Class</strong>. Como sugere o próprio nome, esta é para envio de e-mails. Com extrema facilidade é possível adicionar endereços, CC, CCO, anexar arquivos e muito mais.</li>
<li><strong>Encryption Class</strong>. Se o problema é gerar strings encriptadas, então ele acabou. Com a classe de encriptação, as tarefas de encriptar, descriptar e correlacionados são bem mais simples.</li>
<li><strong>File Uploading Class</strong>. Com uma vasta gama de opções, fazer upload no CodeIgniter é a uma das coisas mais fáceis quando se usa a classe para upload de arquivos.</li>
<li><strong>Form Validation Class</strong>. Uma boa validação também deve ser feita no back-end; para tanto, o CI conta com muitas e diversificadas opções de validação para formulários.</li>
<li><strong>FTP Class</strong>. Classe para fazer as operações FTP tradicionais, como transferências, mover arquivos, renomear, apagar, etc.</li>
<li><strong>HTML Table Class</strong>. Classe que permite gerar tabelas dinâmicas a partir de resultados de arrays e/ou consultas a bancos de dados.</li>
<li><strong>Image Manipulation Class</strong>. Uma das mais incríveis classes do CI, permite fazer alterações em images como redimensionar, rotacionar, criar miniaturas, inserir marcas d&#8217;água, dentre outros.</li>
<li><strong>Input Class</strong>. Tem dupla finalidade: pré-processar dados de inputs (questões de segurança) e funções para manipulação/verificação de dados via input.</li>
<li><strong>Javascript Class</strong>. Classe que, usando funções javascript, provê algumas funcionalidades e efeitos básicos do <a href="http://jquery.com/">jQuery</a>, como hide/show, fadeIn/fadeOut, animation e outros.</li>
<li><strong>Loader Class</strong>. É a classe do CodeIgniter para carregar recursos diversos do framework, como libraries, views, helpers e models.</li>
<li><strong>Language Class</strong>. Classe que tem por objteivo prover suporte a <em>internationalization</em>.</li>
<li><strong>Output Class</strong>. Classe que, juntamente com recursos de <em>cache</em>, tem a finalidade de enviar a web page requerida completa.</li>
<li><strong>Pagination Class</strong>. Classe muitos fácil de se usar que permite fazer paginações em quaisquer conjuntos de resultados (muitas opções inclusas).</li>
<li><strong>Security Class</strong>. Como sugere o próprio nome, a Security Class provê funções para tratar da segurança da aplicação feita em CodeIgniter.</li>
<li><strong>Session Class</strong>. Classe para manipulação de sessões com o CodeIgniter (não são as sessões nativas do PHP).</li>
<li><strong>Trackback Class</strong>. Esta classe permite que se trabalhe com envio e recebimento de informações de <a href="http://en.wikipedia.org/wiki/Trackback">trackback</a>.</li>
<li><strong>Template Parser Class</strong>. Permite utilizar pseudo-variáveis nas <a href="http://codeigniterbrasil.com/passos-iniciais/views-no-codeigniter/">views</a>, de modo a simplificar a separação HTML/PHP.</li>
<li><strong>Typography Class</strong>. Esta classe provê funções para formatação de textos.</li>
<li><strong>Unit Testing Class</strong>. Classe para se mexer com <a href="http://en.wikipedia.org/wiki/Unit_testing">Unit Testing</a> (conta com funções simples, mas possui várias opções).</li>
<li><strong>URI Class</strong>. Essencial para se trabalhar com CI, esta classe serve para se trabalhar com informações contidas em URLs.</li>
<li><strong>User Agent Class</strong>. Permite saber informações sobre o &#8220;agente&#8221; que acessa a aplicação web (browser, dispositivo mobile, robô de busca). Possui diversas opções interessantes.</li>
<li><strong>XML-RPC Class</strong>. Como consta no nome, esta classe serve para tarefas envolvendo <a href="http://www.xmlrpc.com/">XML-RPC</a>.</li>
<li><strong>Zip Encoding Class</strong>. Permite tarefas com arquivos compactados (.zip), tais como criação, adição/deleção de arquivos e até disponibilizar arquivos para download (forçado ou não).</li>
</ul>
<h2>Classes do CodeIgniter: conclusão</h2>
<p>Como se pode ver, existem dezenas de classes no CodeIgniter para prover funções e funcionalidades prontas, que são de fácil manipulação e têm simplicidade de uso (pelo menos, a maioria delas).</p>
<p>Com o advento do <a href="http://codeigniterbrasil.com/noticias/codeigniter-2/">CodeIgniter 2</a>, algumas novas classes foram inseridas e, certamente, com as futuras versões, muitas outras ainda serão e as atuais serão modificadas, sempre no intuito de melhorar/facilitar ainda mais seu uso e interações.</p>
<p>É o <strong>CodeIgniter</strong>, mais uma vez, mostrando que é o <strong>melhor framework PHP</strong>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=65LEd65-O6E:MWH7dMgof6g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=65LEd65-O6E:MWH7dMgof6g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=65LEd65-O6E:MWH7dMgof6g:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=65LEd65-O6E:MWH7dMgof6g:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/65LEd65-O6E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/passos-iniciais/classes-do-codeigniter/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/passos-iniciais/classes-do-codeigniter/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter 2</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/UMzkH2FQWks/</link>
		<comments>http://codeigniterbrasil.com/noticias/codeigniter-2/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 12:35:38 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=94</guid>
		<description><![CDATA[E, depois de muita espera, mudanças na estrutura de desenvolvimento, choro e ranger de dentes, eis que é lançado o CodeIgniter 2! É isso, mesmo, a equipe CodeIgniter Reactor oficialmente liberou o CodeIgniter 2 anteontem, dia 28 de janeiro de 2011! Quem vem acompanhando as notícias do mundo CodeIgniter, não tem nada o que se [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-28 ilustra-artigo" title="Codeigniter." src="http://codeigniterbrasil.com/wp-content/uploads/2008/10/codeigniter.gif" alt="Codeigniter." width="500" height="150"></p>
<p>E, depois de muita espera, mudanças na estrutura de desenvolvimento, choro e ranger de dentes, eis que é lançado o <strong>CodeIgniter 2</strong>! É isso, mesmo, a equipe <a href="http://codeigniterbrasil.com/noticias/codeigniter-reactor-codeigniter-core-e-mais-novidades-do-mundo-ci/">CodeIgniter Reactor</a> oficialmente liberou o CodeIgniter 2 anteontem, dia 28 de janeiro de 2011!</p>
<p>Quem vem acompanhando as notícias do mundo CodeIgniter, não tem nada o que se surpreender com as novas <em>features</em>, que foram exaustivamente discutidas e &#8220;pré apresentadas&#8221; à comunidade. Mas, para quem ainda desconhece, algumas das principais mudanças/benefícios foram:</p>
<ul>
<li>Não há mais suporte a PHP4. Agora é a partir do PHP 5.1;</li>
<li>Diretório &#8220;application&#8221; movido para a raiz;</li>
<li>Diretórios &#8220;system/cache&#8221; e &#8220;system/logs&#8221; movidos para o diretório &#8220;application&#8221;</li>
<li>Adicionado o prefixo &#8220;CI_&#8221; para todas as classes do <em>core</em>.</li>
<li>O <a href="http://codeigniter.com/user_guide/helpers/form_helper.html">Form Helper</a> agora conta com proteção <a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery">CSRF</a>;</li>
<li><a href="http://codeigniter.com/user_guide/general/drivers.html">Drivers</a>;</li>
<li>Remoção do Scaffolding;</li>
<li>Não existem mais plugins, em detrimento dos <a href="http://codeigniterbrasil.com/passos-iniciais/diferenca-entre-library-helper-plugin-codeigniter/">helpers</a>;</li>
<li>Mais de 50 bugs corrigidos;</li>
<li>E muito mais!</li>
</ul>
<p>Para ver a lista completa, veja o <a href="http://codeigniter.com/user_guide/changelog.html">changelog do CodeIgniter</a>.</p>
<p>Uma outra coisa que está para sair em breve é um <strong>sistema de comentários</strong> em cada página do User Guide, tal como existe hoje no <a href="http://br.php.net/">site oficial do PHP</a>. Dessa maneira, a documentação se tornará ainda mais rica com as contribuições, dicas e macetes dos membros da comunidade.</p>
<p>O jeito, agora, é <a href="http://codeigniter.com/download.php">baixar o CodeIgniter</a>, fazer muitos testes e partir para o abraço com mais esta evolução do melhor framework PHP!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=UMzkH2FQWks:5C82zINwNFY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=UMzkH2FQWks:5C82zINwNFY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=UMzkH2FQWks:5C82zINwNFY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=UMzkH2FQWks:5C82zINwNFY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/UMzkH2FQWks" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/noticias/codeigniter-2/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/noticias/codeigniter-2/</feedburner:origLink></item>
		<item>
		<title>$_GET no CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/duJiNgDw43Q/</link>
		<comments>http://codeigniterbrasil.com/configuracoes/_get-no-codeigniter/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 12:00:04 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[controller]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=93</guid>
		<description><![CDATA[Por padrão, o CodeIgniter não suporta parâmetros $_GET; quando algo assim é identificado no URL, é automaticamente destruído pelo CI. Entretanto, pode haver situações em que é preciso pegar/passar variáveis com GET, seja por usar algum webservice, serviço de pagamento ou o que quer que seja. Como o CodeIgniter é o melhor framework PHP, com [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-61 ilustra-artigo" src="http://codeigniterbrasil.com/wp-content/uploads/2010/01/url-uri-codeigniter.jpg" alt="" width="350" height="200"></p>
<p>Por padrão, o <strong>CodeIgniter</strong> não suporta parâmetros $_GET; quando algo assim é identificado no URL, é automaticamente destruído pelo CI. Entretanto, pode haver situações em que é preciso pegar/passar variáveis com GET, seja por usar algum webservice, serviço de pagamento ou o que quer que seja.</p>
<p>Como o <strong>CodeIgniter é o melhor framework PHP</strong>, com ele também é possível liberar o acesso a parâmetros $_GET com muita facilidade. E mais: somente em <a href="http://codeigniterbrasil.com/passos-iniciais/controllers-no-codeigniter/">controllers</a> específicos!</p>
<div class="alert">
Este artigo é altamente inspirado no post &#8220;<a href="http://www.dannyherran.com/2010/12/_get-parameters-on-codeigniter/">$_GET parameters on CodeIgniter</a>&#8220;, do <a href="http://www.dannyherran.com/">blog de Danny Herran</a>.
</div>
<h2>Configurar o CodeIgniter para aceitar $_GET</h2>
<p>A primeira coisa que deve ser feita é uma pequena alteração no arquivo <strong>/application/config/config.php</strong>. Localize a linha com a configuração &#8220;<strong>uri_protocol</strong>&#8221; e altere seu valor para &#8220;<strong>PATH_INFO</strong>&#8220;:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p93code89'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p9389"><td class="code" id="p93code89"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uri_protocol'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span>  <span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Então, para cada método que seja preciso mexer com parâmetros GET, adicione o seguinte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p93code90'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p9390"><td class="code" id="p93code90"><pre class="php" style="font-family:monospace;"><a href="http://www.php.net/parse_str"><span style="color: #990000;">parse_str</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'QUERY_STRING'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>A <a href="http://php.net/manual/en/function.parse-str.php">função parse_str do PHP</a> simplesmente converte os parâmetros do URL em variáveis. Por exemplo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p93code91'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p9391"><td class="code" id="p93code91"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;framework=codeigniter&amp;features[]=best+framework&amp;features[]=rocks&quot;</span><span style="color: #339933;">;</span>
<a href="http://www.php.net/parse_str"><span style="color: #990000;">parse_str</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$framework</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// &quot;codeigniter&quot;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$features</span><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: #666666; font-style: italic;">// &quot;best framework&quot;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$features</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// &quot;rocks&quot;</span></pre></td></tr></table></div>

<p>Obviamente a variável &#8220;str&#8221; do exemplo vai receber a URL-alvo (uma ajudinha sobre <a href="http://www.google.com.br/search?q=php+get+url">como pegar a URL atual</a>) e, a partir daí, é possível trabalhar com variáveis comuns pra usar os parâmetros passados através de $_GET no CodeIgniter. Um exemplo de URL seria:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p93code92'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p9392"><td class="code" id="p93code92"><pre class="php" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//codeigniterbrasil.com/controller/metodo/?s=conteudo&amp;c=codeigniter</span></pre></td></tr></table></div>

<p>Bem facinho, certo? Se alguém tiver alguma outra solução/dica sobre <strong>como usar GET no CodeIgniter</strong> e/ou pegar o URL atual, basta comentar!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=duJiNgDw43Q:KG9FO7-Bilk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=duJiNgDw43Q:KG9FO7-Bilk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=duJiNgDw43Q:KG9FO7-Bilk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=duJiNgDw43Q:KG9FO7-Bilk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/duJiNgDw43Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/configuracoes/_get-no-codeigniter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/configuracoes/_get-no-codeigniter/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter Reactor, CodeIgniter Core e mais novidades do mundo CI</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/MPZ_zoGS4VI/</link>
		<comments>http://codeigniterbrasil.com/noticias/codeigniter-reactor-codeigniter-core-e-mais-novidades-do-mundo-ci/#comments</comments>
		<pubDate>Mon, 06 Dec 2010 13:00:13 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[código-fonte]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[documentação]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=92</guid>
		<description><![CDATA[Há algumas semanas, no CodeIgniter News, uma notícia chamou a atenção da comunidade: &#8220;The Official CodeIgniter Community Branch&#8220;. Neste &#8220;comunicado oficial&#8221; da EllisLab, foi informado que o CodeIgniter iria ser organizado em duas &#8220;ramificações&#8221;, uma &#8220;oficial&#8221; e outra mais da própria comunidade. Alguns membros da comunidade CI ficaram alarmados e preocupados com o futuro do [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img width="500" height="150" alt="Codeigniter." src="http://codeigniterbrasil.com/wp-content/uploads/2008/10/codeigniter.gif" title="Codeigniter." class="size-full wp-image-28 ilustra-artigo"></p>
<p>Há algumas semanas, no <a href="http://codeigniter.com/news/">CodeIgniter News</a>, uma notícia chamou a atenção da comunidade: &#8220;<a href="http://codeigniter.com/news/the_official_codeigniter_community_branch/">The Official CodeIgniter Community Branch</a>&#8220;. Neste &#8220;comunicado oficial&#8221; da EllisLab, foi informado que o CodeIgniter iria ser organizado em duas &#8220;ramificações&#8221;, uma &#8220;oficial&#8221; e outra mais da própria comunidade.</p>
<p>Alguns membros da comunidade CI ficaram alarmados e preocupados com o <strong>futuro do CodeIgniter</strong>, alguns chegando a especular que a notícia foi a sentença de morte do framework e outras opiniões de caráter duvidoso&#8230; Mas, na verdade, a proposta é somente uma (segundo os próprios mantenedores do CI): facilitar o desenvolvimento do CodeIgniter, tornando-o mais eficiente e de acordo aos anseios e necessidades da comunidade.</p>
<h2>CodeIgniter Core e CodeIgniter Reactor</h2>
<p>Então, mais recentemente, foram reveladas outras novidades sobre esta &#8220;ramificação&#8221;: a partir de agora, existe o <strong>CodeIgniter Reactor</strong> e <strong>CodeIgniter Core</strong>! Segundo a própria EllisLab, ambos focadas em oferecer um framework simples e poderoso através de acesso fácil, consumo mínimo de recursos e uma documentação de qualidade.</p>
<p>Embora ambas as &#8220;versões&#8221; continuem sendo de responsabilidade e petencentes à <a href="http://ellislab.com/">EllisLab</a>, existem diferenças.</p>
<p>O <strong>CodeIgniter Reactor</strong> será guiada e mantida por 6 membros da comunidade CodeIgniter (eles foram eleitos através de um misto de voluntariado com análise de conhecimentos necessários), conhecidos, a partir de agora, como <strong>Reactor Engineers</strong>. Eles terão acesso e permissão de editar o CodeIgniter Reactor e contribuir livremente com códigos e documentação, tanto de si mesmos, como da comunidade, em geral. Para evitar discrepâncias ou alterações que podem causar erros e/ou instabilidades no framework PHP, os Engenheiros irão debater inclusões/alterações meticulosamente, com base num &#8220;acordo&#8221; sobre a filosofia do CodeIgniter.</p>
<p><strong>CodeIgniter Core</strong> será exclusivamente mantido pela EllisLab e continuará com sua &#8220;tradição&#8221; de lançar versões sem pressa para poder testar exaustivamente os recursos novos ou editados &#8211; não deixando de lado sua &#8220;hiper crítica&#8221; ao incorporar código novo. A intenção é garantir que o CodeIgniter Core seja super estável e dê tranquilidade e segurança a quem o for utilizar, tendo em vista que existem muitos projetos realmente importantes que usam o CI, tais como aplicações web de nível empresarial, desenvolvimento em grande escala de empresas, projetos de instituições governamentais, etc.</p>
<p>Na prática, o que vai acontecer é que o CodeIgniter Reactor, depois de muita discussão entre os membros da comunidade e os Reactor Engineers, irá &#8220;despachar&#8221; as implementações que julgar necessárias para o CodeIgniter Core; será como um &#8220;pré-filtro&#8221;. Então, a &#8220;equipe de elite&#8221; vai julgar quais implementações serão oficialmente incorporadas e, depois de muitos, muitos testes, estas farão parte do Codeigniter Core.</p>
<h2>CodeIgniter UserVoice</h2>
<p>A fim de manter uma certa ordem no caos de pedidos e solicitações que a comunidade faz, alguém teve a ideia de criar um UserVoice para o CodeIgniter Reactor. Basicamente, o <a href="http://uservoice.com/">UserVoice</a> permite as pessoas votarem em solicitações para saber quais os anseios mais &#8220;emergentes&#8221; da comunidade.</p>
<p>Paticipe, você, também, do <a href="http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor">UserVoice do Codeigniter Reactor</a>!</p>
<h2>CodeKindling</h2>
<p>Existe, também, um projeto não-oficial, mas que tem uma proposta muita interessante, que é o <a href="http://codekindling.net/">CodeKindling</a>. O CodeKindling tem a proposta de ter &#8220;recursos coletivos para a comunidade CodeIgniter&#8221;, ou seja, através do site, é possível submeter libraries, helpers, recursos em geral, ideias, feedback ou o que for, através de uma interface única.</p>
<p>O bom que é que você pode assinar uma espécie de newsletter e ser avisado sempre que novos recursos forem submetidos.</p>
<h2>Conclusões sobre CodeIgniter Core e CodeIgniter Reactor</h2>
<p>Muitas pessoas já manifestaram sua opinião (inclusive <a href="http://philsturgeon.co.uk/">Phil Sturgeon</a>, que é um dos Reactor Engineers (!), em seu artigo &#8220;<a href="http://philsturgeon.co.uk/index.php/news/2010/12/ellislab-react-with-codeigniter-reactor">EllisLab react with CodeIgniter Reactor</a>&#8220;), e a minha é o seguinte: a comunidade gostando ou não, é assim que vai ser!</p>
<p>Não adianta ficar discutindo ou esbravejando com uma decisão &#8220;de cima&#8221;, da cúpula do CodeIgniter. Querendo ou não, aquele(s) que tomou(aram) esta decisão o fizeram depois de muito pensar e refletir, pois é assim que o mundo do <em>business</em> funciona. A EllisLab tem vários projetos comerciais (ela é uma empresa, certo?) diretamente ligados ao CodeIgniter, e isso certamente foi levado em consideração.</p>
<p>É quase certo, também, que os membros do CodeIgniter Reactor estão levando bons dólares &#8220;por fora&#8221;, afinal, eles tiveram que ser recrutados para o cargo, certo? Dependendo do seu ponto de vista, isso pode ser algo bom ou ruim&#8230;</p>
<p>O que podemos esperar é que esta &#8220;bifurcação&#8221; traga bons resultados à comunidade e que possamos continuar participando e sugerindo alterações e inserções no CI. Aparentemente é isso, mesmo, que está acontecendo e será reforçado, e isso é algo bom!</p>
<p>Agora é aguardar os resultados e desdobramentos dessa nova &#8220;fase&#8221; do CodeIgniter, sempre com o pensamento de que recursos cada vez melhores e mais fáceis de usar sejam lançados.</p>
<p>O futuro dirá.</p>
<p>PS: Phil Sturgeon fez um <a href="http://philsturgeon.co.uk/documentation/codeigniter/user_guide/toc.html"><em>mirror</em> da documentação oficial do CodeIgniter 2</a>. Segundo o próprio, a versão já está muito estável, inclusive podendo ser usada para projetos oficiais.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=MPZ_zoGS4VI:H0ONrcyP_7A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=MPZ_zoGS4VI:H0ONrcyP_7A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=MPZ_zoGS4VI:H0ONrcyP_7A:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=MPZ_zoGS4VI:H0ONrcyP_7A:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/MPZ_zoGS4VI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/noticias/codeigniter-reactor-codeigniter-core-e-mais-novidades-do-mundo-ci/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/noticias/codeigniter-reactor-codeigniter-core-e-mais-novidades-do-mundo-ci/</feedburner:origLink></item>
		<item>
		<title>HMVC no CodeIgniter com Modular Extensions</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/2cyu4Q7HTyw/</link>
		<comments>http://codeigniterbrasil.com/tutoriais/hmvc-no-codeigniter-com-modular-extensions/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 13:00:14 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[instalação]]></category>
		<category><![CDATA[libraries]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=88</guid>
		<description><![CDATA[Já vimos, no estudo sobre o padrão MVC, que todos frameworks modernos utilizam a abordagem de Model-View-Controller para separar o acesso ao banco de dados, a apresentação e o controle de toda a aplicação; e também vimos como models, views e controllers trabalham juntos no CodeIgniter. Essa é a base de funcionamento do CodeIgniter. Nada [...]]]></description>
			<content:encoded><![CDATA[<p>Já vimos, no estudo sobre o <a href="http://codeigniterbrasil.com/passos-iniciais/mvc-model-view-controller/">padrão MVC</a>, que todos frameworks modernos utilizam a abordagem de <a href="http://codeigniterbrasil.com/passos-iniciais/models-no-codeigniter/">Model</a>-<a href="http://codeigniterbrasil.com/passos-iniciais/views-no-codeigniter/">View</a>-<a href="http://codeigniterbrasil.com/passos-iniciais/controllers-no-codeigniter/">Controller</a> para separar o acesso ao banco de dados, a apresentação e o controle de toda a aplicação; e também vimos como <a href="http://codeigniterbrasil.com/passos-iniciais/models-views-controllers-trabalhando-juntos-codeigniter/">models, views e controllers trabalham juntos no CodeIgniter</a>. Essa é a base de funcionamento do <strong>CodeIgniter</strong>. Nada além, nada aquém.</p>
<p>Mas, além do MVC, existem uma abordagem diferente, considerada, por alguns, como uma evolução a esse consagrado padrão. Trata-se do <strong>Hierarquical Model-View-Controller</strong> (Model-View-Controller Hierárquico), mais conhecido como <strong>HMVC</strong>!</p>
<p>O CodeIgniter atualmente não apresenta suporte nativo ao padrão HMVC, portanto,, caso se queira usufruir de seus benefícios, é preciso se valer de códigos da comunidade. Neste artigo, ensinaremos como dar suporte ao HMVC no CodeIgniter usando o <strong>Modular Extensions</strong>.</p>
<h2>Sobre o HMVC</h2>
<p>O HMVC é tido como uma <strong>evolução do MVC</strong>. Basicamente, é como se a estrutura básica de funcionamento do CodeIgniter tivesse um nível hierárquico acima, &#8220;englobando&#8221; cada <strong>tríade MVC</strong>, tornando-a modular e, até certo ponto, independente das demais. </p>
<p>Em outras palavras: com HMVC é possível ter &#8220;pacotinhos&#8221; de models, views e controllers independentes, que funcionam separadamente de outros &#8220;pacotinhos&#8221;, mas que podem se comunicar com todos eles. É como mostra a seguinte imagem:</p>
<div id="attachment_89" class="wp-caption aligncenter" style="width: 497px"><img src="http://codeigniterbrasil.com/wp-content/uploads/2010/10/codeigniter-hmvc.png" alt="CodeIgniter: HMVC" title="" width="487" height="382" class="size-full wp-image-89" /><p class="wp-caption-text">Estrutura HMVC no CodeIgniter</p></div>
<h2>HMVC no CodeIgniter</h2>
<p>A primeira coisa a se fazer para implementar o HMVC no CodeIgniter é <a href="https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/downloads">fazer download do Modular Extensions</a>. Depois de baixá-lo, você verá que existem 2 pastas no arquivo compactado: &#8220;<strong>core</strong>&#8221; e &#8220;<strong>third_party</strong>&#8220;. Proceda da seguinte maneira:</p>
<p><strong></p>
<ul>
<li>Coloque a subpasta &#8220;MX&#8221; (dentro de &#8220;third_part&#8221;) no diretório &#8220;application/third_party&#8221;</li>
<li>Coloque os arquivos da pasta &#8220;core&#8221; (não a própria pasta!) dentro de &#8220;application/core&#8221;</li>
<li>Crie a pasta &#8220;modules&#8221; dentro da pasta &#8220;application&#8221;</li>
</ul>
<p></strong></p>
<p>Pronto, agora você já tem uma <strong>estrutura HMVC no CodeIgniter</strong>!</p>
<p>Atenção para algo muito importante: ao implementar a estrutrura de HMVC no CodeIgniter com o <a href="http://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/wiki/Home">Modular Extensions</a>, você abre mão da estrutura tradicional do CI. A partir de agora, você deve criar subdiretórios dentro de &#8220;modules&#8221; com seus &#8220;pacotinhos&#8221; de tríades MVC. Ou seja, a partir de agora, os diretórios &#8220;models&#8221;, &#8220;views&#8221; e &#8220;controllers&#8221;, que ficam dentro da pasta &#8220;application&#8221;, não mais necessitam ser usados.</p>
<div class="alert">
<p>Com HMVC, toda a interação do CI deve ser feita pelo diretório &#8220;modules&#8221;.</p></div>
<p>Por exemplo, vamos supor que você utilize uma tríade para exibição de livros de um site ou sistema virtual, qualquer. Neste caso, poderia usar uma estrutura como esta:</p>
<p><strong></p>
<ul>
<li>application/modules/livros/</li>
<li>application/modules/livros/controllers/</li>
<li>application/modules/livros/models/</li>
<li>application/modules/livros/views/</li>
</ul>
<p></strong></p>
<p>E, dentro dessa estrutura, mexer normalmente com os models, views e controllers. Em relação à estrutura de URLs, nada se altera; dentro do exemplo, se tivéssemos um controller &#8220;listar&#8221; dentro de <strong>application/modules/livros/controllers/</strong>, este seria acessado via (usando a técnica explicada no artigo <a href="http://codeigniterbrasil.com/dicas/dicas-basicas-configuracao-codeigniter/">Dicas básicas de configuração do CodeIgniter</a> para retirar o segmento &#8220;index.php&#8221;):</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p88code94'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8894"><td class="code" id="p88code94"><pre class="php" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//www.site.com.br/livros/listar/</span></pre></td></tr></table></div>

<p>Quanto à configuração de <strong>$route['default_controller']</strong> em <strong>application/config/routes.php</strong>, pode ficar tranquilo, já que, também, nada se altera: coloque o nome do controller e pronto.</p>
<h2>Conclusão sobre HMVC no CodeIgniter</h2>
<p>Talvez as maiores vantagens da abordagem HMVC sejam a <strong>praticidade</strong> e <strong>facilidade de reaproveitamento de códigos</strong>. Para o caso de um módulo desenvolvido precisar ser usado em outro projeto, simplesmente copie o módulo em questão e cole na nova instalação do CodeIgniter (provida de HMVC e mesma estrutura de banco de dados, obviamente) e pronto! Nada mais precisa ser feito!</p>
<p>Não é só porque o HMVC é considerado como uma &#8220;evolução&#8221; por alguns que seja preciso utilizá-lo em todo e qualquer projeto. Entretanto, a praticidade de se usar módulos prontos de outros projetos é notável e pode, sim, fazer a diferença num cumprimento de um prazo mais apertado! Se for o caso, não hesite em se valer da praticidade do padrão <strong>HMVC</strong>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=2cyu4Q7HTyw:NrQ_jq5bdp0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=2cyu4Q7HTyw:NrQ_jq5bdp0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=2cyu4Q7HTyw:NrQ_jq5bdp0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=2cyu4Q7HTyw:NrQ_jq5bdp0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/2cyu4Q7HTyw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/tutoriais/hmvc-no-codeigniter-com-modular-extensions/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/tutoriais/hmvc-no-codeigniter-com-modular-extensions/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter Framework PHP : considerações de leitura</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/bCSobvygosg/</link>
		<comments>http://codeigniterbrasil.com/diversos/codeigniter-framework-php-consideracoes-de-leitura/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 13:13:08 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Diversos]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=86</guid>
		<description><![CDATA[No início deste mês de setembro fui agraciado com um exemplar do livro &#8220;CodeIgniter Framework PHP&#8220;, de Ademir Cristiano Gabardo, cedido gentilmente pela editora Novatec, através de contato que tive com Mariana Prates, do departamento de marketing. Dada a óbvia relação entre o livro e o assunto principal deste blog, CodeIgniter, fui convidado a ler [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.novatec.com.br/livros/codeigniter/"><img width="234" height="337" alt="Livro CodeIgniter Framework PHP" src="http://codeigniterbrasil.com/wp-content/uploads/2010/08/codeigniter-framework-php-capa-livro.jpg" title="Comprar livro CodeIgniter Framework PHP" class="aligncenter size-full wp-image-81 ilustra-artigo"></a></p>
<p>No início deste mês de setembro fui agraciado com um exemplar do livro &#8220;<strong>CodeIgniter Framework PHP</strong>&#8220;, de <strong>Ademir Cristiano Gabardo</strong>, cedido gentilmente pela <a href="http://www.novatec.com.br/">editora Novatec</a>, através de contato que tive com <strong>Mariana Prates</strong>, do departamento de marketing.</p>
<p>Dada a óbvia relação entre o livro e o assunto principal deste blog, <strong>CodeIgniter</strong>, fui convidado a ler a obra e escrever algumas palavras com minhas considerações sobre o <strong>melhor framework PHP</strong>!</p>
<h2>Estruturação do livro CodeIgniter Framework PHP</h2>
<p>O livro “CodeIgniter Framework PHP” é estruturado em 15 capítulos principais, quais sejam:</p>
<p><strong></p>
<ol>
<li>Design pattern MVC (model, view, controller)</li>
<li>Construindo seu ambiente de testes</li>
<li>CodeIgniter na prática: primeiros exemplos</li>
<li>Criando melhores views com os helpers do CodeIgniter</li>
<li>Criando um catálogo de produtos com o CodeIgniter</li>
<li>Processando um formulário de contato</li>
<li>Paginação com CodeIgniter</li>
<li>Rotas</li>
<li>Construindo a área de administração do catálogo</li>
<li>Protegendo a área de administração com senha</li>
<li>Adicionando funcionalidades de carrinho de compras</li>
<li>Mais funcionalidades do CodeIgniter</li>
<li>Mais sobre a classe Database e o Active Record</li>
<li>Integrando CodeIgniter com Ajax</li>
<li>Considerações finais</li>
</ol>
<p></strong></p>
<p>Para facilitar o entendimento dessas considerações, fica mais fácil agrupar determinados capítulos e discorrer com base nestes agrupamentos. Então, a fim de facilitar o entendimento, consideremos que o primeiro grupamento, a qual chamaremos &#8220;<strong>Início</strong>&#8220;, abrange os capítulos <strong>1, 2, 3 e 4</strong>; o seguinte, chamado &#8220;<strong>Meio</strong>&#8220;, envolve os capítulos <strong>5, 6, 7, 8, 9, 10 e 11</strong>; e, por &#8220;<strong>Fim</strong>&#8220;, os capítulos restantes, <strong>12, 13, 14 e 15</strong>.</p>
<h2>CodeIgniter Framework PHP: &#8220;Início&#8221;</h2>
<p>O livro, em seus capítulos iniciais, como não poderia deixar de ser, apresenta uma base teórica necessária para o entendimento e uso do CodeIgtniter. As primeiras dezenas de páginas se encarregam de explicar conceitos primordiais como design pattern, MVC, o conceito de model, view e controller e outros.</p>
<p>Inclusive, algumas considerações sobre a atual versão do framework e o que se pode esperar da próxima – o que, pessoalmente, considerei uma abordagem precoce, dado que o leitor iniciante ainda desconhece termos abordados, como &#8220;scaffolding&#8221;, &#8220;helpers&#8221;, &#8220;drivers&#8221;. Talvez a intenção de Ademir Gabardo tenha sido, justamente, suscitar curiosidade no leitor. É uma possibilidade&#8230;</p>
<p>Achei especialmente interessante a explicação de como montar um ambiente de testes para CodeIgniter, explicando como baixar, instalar e configurar <a href="http://www.apache.org/">Apache</a>, <a href="http://www.php.net/">PHP</a> e <a href="http://www.mysql.com/">MySQL</a>, separadamente. É fato que existem programas que, nas palavras do próprio autor, são &#8220;pacotes de softwares &#8216;pré-embalados&#8217;&#8221;, ou seja, permitem instalar os sistemas citados de forma bem mais simples (um deles, inclusive, sendo citado pelo autor); mas, a meu ver, é interessante ao estudante saber algo sobre o funcionamento de servidores e instalação de aplicações nestes, tal como foi abordado no livro.</p>
<p>Depois disso, a estrutura de diretórios do <a href="http://codeigniter.com/">CodeIgniter</a> é explicada, mostrando para que serve e os cuidados necessários que se deve ter com cada pasta do CI. A essa altura, alguns exemplos básicos de uso de controllers e views já são apresentados, mostrando a quem está lendo como o CodeIgniter alia poder e simplicidade de uso para a construção de sites e aplicativos.</p>
<p>Evoluindo com as explicações, mais considerações são feitas sobre o funcionamento interno e funcionalidades nativas do framework e acontece a apresentação dos helpers, seguida de exemplos de como usar alguns helpers importantes e comuns quando se está usando o CodeIgniter.</p>
<h2>CodeIgniter Framework PHP: &#8220;Meio&#8221;</h2>
<p>Ademir Cristiano Gabardo, o autor do livro &#8220;CodeIgniter Framework PHP&#8221;, utilizou uma abordagem que julgo bastante eficiente quando o assunto é passar conhecimento técnico desta natureza: apresentou o modo de fazer, exemplos, nuances e alguns macetes através do desenvolvimento de um aplicativo “do mundo real”. Sua proposta foi criar um <em>catálogo de produtos</em> com o CI e, no processo, habituar seu leitor às ações e peculiaridades encontradas no processo. Mais um ponto positivo!</p>
<p>E o importante é que, no livro, o desenvolvimento de uma boa parte de um &#8220;sistema de verdade&#8221; é mostrado, com explicações de se fazer páginas de categorias e de detalhes de produtos (com recursos completos de visualização e paginação), recursos de busca, formulário para contato e área administrativa protegida por senha, reforçando a abordagem de exemplo de “aplicativo do mundo real” apresentada.</p>
<p>As explicações sobre este catálogo de produtos abrangeram desde a criação do banco de dados apropriado – mostrando o Diagrama Entidade Relacionamento, ou DER (chamado, no livro de “Esquema do banco de dados”), inclusive com a disponibilização da SQL necessária –, passando pela configuração de BD do próprio CodeIgniter e mostrando o fabuloso recurso <em>scaffolding</em> (que, conforme podemos encontrar nas primeiras páginas da obra, deixará de funcionar a partir da próxima versão do CI), até chegar no uso da <a href="http://codeigniter.com/user_guide/database/active_record.html">Active Record</a>, classe essencial do Code Igniter para qualquer site/aplicação que utilize banco de dados.</p>
<p>E um dos principais pontos fortes da obra: apresentação e exemplos de uso da <a href="http://codeigniter.com/user_guide/libraries/cart.html">biblioteca nativa do CodeIgniter para carrinho de compras</a>, recurso de versões recentes do framework para facilitar a manipulação de operações envolvendo este conceito!</p>
<h2>CodeIgniter Framework PHP: &#8220;Fim&#8221;</h2>
<p>Nos capítulos finais da publicação, outros recursos não abordados para a criação do catálogo de produtos são apresentados.</p>
<p>Certamente o autor não deixaria seus leitores na mão quanto à apresentação e exemplos de uso de funcionalidades tão importantes como customização de páginas de erros, criação dinâmica de tabelas, operações variadas relacionadas a manipulação de imagens, criação de backups dinâmicos, recursos especiais de string e texto e, de forma complementar, exposição de outras possibilidades oferecidas pela Active Record.</p>
<p>Como <em>plus</em>, Gabardo explica uma das maneiras possíveis de se fazer a integração CodeIgniter + AJAX, tão essencial à quase totalidade de sites/aplicativos modernos.</p>
<h2>CodeIgniter Framework PHP: considerações finais</h2>
<p>Com o desenvolvimento do catálogo de produtos que fez parte da proposta do &#8220;<strong>CodeIgniter Framework PHP</strong>&#8220;, é possível tomar contato e receber explicações de muitos recursos excepcionais do framework, como transição de dados entre camadas do padrão MVC, tratamento de informações, segurança, criação de formulários, paginação, upload e tratamento de imagens e outros tipos de arquivos, roteamento de URLs, sessões, trabalho com carrinho de compras e muitos outros.</p>
<p>O livro é destinado a pessoas que tiveram pouco ou nenhum contato com o CodeIgniter – ou seja, o público iniciante – e, acredito, por este motivo, o autor foi feliz na quase totalidade das páginas de sua publicação.</p>
<p>Se fosse pedido para a avaliação do livro se dar através de pontuação de 1 a 10, &#8220;<strong>8,5</strong>&#8221; seria minha resposta. Excetuando-se um equívoco de tradução ou conceito aqui e acolá, digo, com toda certeza, que a obra é indicada e recomendada a todos os iniciantes em CodeIgniter que queiram aprender/reforçar desde conceitos básicos a alguns mais além. Ficou um gostinho de &#8220;quero mais&#8221; para uma edição ampliada!  ;-)</p>
<p>Parabéns ao autor <strong>Ademir Cristiano Gabardo</strong> e à editora <strong>Novatec</strong> pela publicação!</p>
<div class="alert">
Lembre-se: até dia 31/12/2010 você pode <a href="http://codeigniterbrasil.com/dicas/desconto-na-compra-do-livro-codeigniter-framework-php/">adquirir seu exemplar do livro &#8220;CodeIgniter Framework PHP&#8221; com 20% de desconto</a>!
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=bCSobvygosg:eZ0Sdrjz13Q:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=bCSobvygosg:eZ0Sdrjz13Q:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=bCSobvygosg:eZ0Sdrjz13Q:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=bCSobvygosg:eZ0Sdrjz13Q:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/bCSobvygosg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/diversos/codeigniter-framework-php-consideracoes-de-leitura/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/diversos/codeigniter-framework-php-consideracoes-de-leitura/</feedburner:origLink></item>
		<item>
		<title>Dicas básicas de configuração do CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/B-dDXCFIuvE/</link>
		<comments>http://codeigniterbrasil.com/dicas/dicas-basicas-configuracao-codeigniter/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 20:06:51 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[libraries]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=84</guid>
		<description><![CDATA[Algumas vezes, em projetos feitos com CodeIgniter, é preciso realizar operações relativamente corriqueiras mas, principalmente quando se está começando a mexer com o framework, ainda não se tem confiança nem a &#8220;malandragem&#8221; de alterar/criar determinadas personalizações. Este artigo aborda 5 dicas básicas do CodeIgniter que poderão salvar sua pele: Remover &#8220;index.php&#8221; do URL O diretório [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2010/09/dicas-basicas-configuracao-codeigniter.gif" alt="Dicas básicas de configuração do CodeIgniter" title="" width="400" height="200" class="aligncenter size-full wp-image-85 ilustra-artigo" /></p>
<p>Algumas vezes, em projetos feitos com <strong>CodeIgniter</strong>, é preciso realizar operações relativamente corriqueiras mas, principalmente quando se está começando a mexer com o <em>framework</em>, ainda não se tem confiança nem a &#8220;malandragem&#8221; de alterar/criar determinadas personalizações.</p>
<p>Este artigo aborda 5 dicas básicas do CodeIgniter que poderão salvar sua pele:</p>
<p><strong></p>
<ul>
<li>Remover &#8220;index.php&#8221; do URL</li>
<li>O diretório &#8220;application&#8221;</li>
<li>Mover o diretório &#8220;system&#8221;</li>
<li>Usar um diretório &#8220;views&#8221; alternativo</li>
<li>Diretório para imagens, estilos, javascript e outros</li>
</ul>
<p></strong></p>
<div class="alert">
Este artigo é altamente inspirado no post &#8220;<a href="http://www.moraywebsolutions.com/tutorials/codeigniter-configuration-tips-for-beginners">CodeIgniter Configuration Tips For Beginners</a>&#8220;, do <a href="http://www.moraywebsolutions.com/">Moray Web Solutions</a>.
</div>
<h2>Remover &#8220;index.php&#8221; do URL</h2>
<p>Como remover o index.php do URI é algo já bastante discutido (inclusive no artigo sobre <a href="http://codeigniterbrasil.com/passos-iniciais/urls-no-codeigniter/">URLs no Codeigniter</a>) e que pode ser feito através de jeitos diferentes; mas é interessante incluir esta dica, também, para que o artigo tenha várias boas dicas em um só lugar.</p>
<p>Retirar o &#8220;index.php&#8221; do endereço de seus sites ou softwares feitos com CodeIgniter é uma das <strong>primeiras coisas</strong> que devem ser feitas quando se está configurando uma instalação do CI para um novo projeto, e é realmente simples de se fazer! Aliás, seria bastante interessante se, em versões futuras do framework, já houvesse um arquivo .htaccess padrão juntamente com o <em>framework</em>. Realmente facilitaria bastante&#8230;</p>
<p>Então, para excluir o segmento &#8220;index.php&#8221; das URLs no CodeIgniter, é preciso fazer 2 coisas. A primeira delas é editar o arquivo <strong>/system/application/config/config.php</strong>, alterando o valor da diretiva index_page para vazio:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p84code101'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84101"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p84code101"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_page'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>A segunda etapa é a criação de um arquivo &#8220;.htaccess&#8221; (com um pontinho na frente, mesmo) na raiz de sua instalação do CodeIgniter. Como mencionado, existem diversas configurações diferentes para se alcançar o mesmo objetivo; para facilitar as coisas, coloquemos no exemplo o que é recomendado no <a href="http://codeigniter.com/user_guide/">Guia do Usuário Oficial do CodeIgniter</a>. Portanto, depois de ter criado seu arquivo <strong>.htaccess</strong>, escreva o seguinte nele:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p84code102'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84102"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p84code102"><pre class="php" style="font-family:monospace;">RewriteEngine on
RewriteCond $<span style="color: #cc66cc;">1</span> <span style="color: #339933;">!</span>^<span style="color: #009900;">&#40;</span>index\<span style="color: #339933;">.</span>php<span style="color: #339933;">|</span>images<span style="color: #339933;">|</span>robots\<span style="color: #339933;">.</span>txt<span style="color: #009900;">&#41;</span>
RewriteRule ^<span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span>$ index<span style="color: #339933;">.</span>php<span style="color: #339933;">/</span>$<span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#91;</span>L<span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<p>E é só isso! A partir de agora, os URLs de seu site/sistema feitos com CodeIgniter não terão mais o segmento (chamado de &#8220;irritante&#8221; por alguns) &#8220;index.php&#8221;.</p>
<h2>O diretório &#8220;application&#8221;</h2>
<div class="alert">
Com o lançamento do <a href="http://codeigniterbrasil.com/noticias/codeigniter-2/">CodeIgniter 2</a>, esta dica não é mais tão útil assim&#8230;
</div>
<p>Muitos desenvolvedores preferem mover a pasta &#8220;application&#8221; para fora da pasta fora da pasta &#8220;system&#8221; &#8211; prática, inclusive, da qual sou adepto. É interessante a abordagem de fazer uma separação mais evidente do código da aplicação do <em>core</em> do <em>framework</em>, embora oferecendo oportunidades para continuar a <strong>reforçar a segurança</strong>.</p>
<p>Não há nada especial que seja preciso fazer; basta mover a pasta &#8220;application&#8221; para fora da pasta &#8220;system&#8221;.</p>
<p>Então, a &#8220;nova&#8221; estrutura de diretórios fica:</p>
<p><strong></p>
<ul>
<li>/application</li>
<li>/system</li>
<li>/index.php</li>
</ul>
<p></strong></p>
<p>É possível, também, mudar o nome da pasta da aplicação para algo mais significativo. Geralmente, quem usa esta abordagem faz isso, em parte, por trabalhar simultaneamente em uma série de projetos e, dessa forma, isso ajuda a descobrir mais facilmente onde se está. Outra razão pela qual isso pode ser útil é quando se pretende <strong>executar várias aplicações usando somente uma instalação do CodeIgniter</strong> &#8211; este é um tema que pode ser abordado em artigos futuros.</p>
<p>Em primeiro lugar, é preciso renomear a pasta &#8220;application&#8221; para o nome que se queira. Então, é preciso alterar o arquivo &#8220;index.php&#8221; que se encontra na raiz da instalação do CI. Basta procurar a variável <strong>$application_folder</strong> e digitar o novo nome para a pasta do aplicativo.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p84code103'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84103"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p84code103"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$application_folder</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;meuSistemaCI&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// nome fictício...</span></pre></td></tr></table></div>

<p>Para garantir, vale a pena navegar por seu <em>software</em> e fazer uma verificação rápida para conferir se tudo ainda está funcionando bem! :-P</p>
<h2>Mover o diretório &#8220;system&#8221;</h2>
<p>Esta é uma medida que pode ser tomara para <strong>aumentar a segurança</strong> de sua aplicação CodeIgniter. A ideia é mover a pasta &#8220;system&#8221; para um nível em que fique fora da área pública da instalação padrão, consequentemente, ficando &#8220;fora de perigo&#8221;.</p>
<p>É preciso conhecer a estrutura de diretórios de seu servidor para fazer a mudança e o apontamento correto para a nova localização. Como exemplo didático, tomemos o uso do <a href="http://www.wampserver.com/">WampServer</a> para a instalação do CI. Nessas condições, a nova estrutura de pastas ficaria da seguinte maneira (nomes também ilustrativos):</p>
<p><strong></p>
<ul>
<li>www/system/</li>
<li>www/projectfolder/newappname/</li>
<li>www/projectfolder/index.php</li>
</ul>
<p></strong></p>
<p>Agora é necessário alterar a variável <strong>$system_folder</strong> do arquivo &#8220;index.php&#8221;, na raiz da instalação, para refletir essa mudança:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p84code104'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84104"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p84code104"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$system_folder</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;../system&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Frisando: é preciso conhecer a estrutura de diretórios para fazer a correta referência à pasta &#8220;system&#8221;. Depois da mudança, faça uma verificação rápida para conferir se tudo ainda está funcionando como deveria.</p>
<h2>Usar um diretório &#8220;views&#8221; alternativo</h2>
<p>Apesar de não ser uma prática tão utilizada dentre os desenvolvedores CodeIginter (eu, pelo menos, não vejo sem feito com frequência), é possível usar um diretório alternativo para &#8220;views&#8221;. Quem usa esta técnica alega que a separação de código e <em>interface </em>fica mais fácil, já que o diretório das views não fica &#8220;afundado&#8221; em uma estrutura de muitos subdiretórios. Então, eles se valem disso para poder ter a pasta no diretório raiz.</p>
<p>Crie a pasta na raiz, como faria normalmente. Para o exemplo, a pasta pode ser &#8220;templates&#8221;, mas, claro, você dá o nome que quiser.</p>
<p>A fim de o CI reconhecer esse novo diretório como o padrão para as <a href="http://codeigniterbrasil.com/passos-iniciais/views-no-codeigniter/">views</a>, é preciso estender uma das bibliotecas do core do <em>framework</em>. O CodeIgniter é tão fantástico que, por padrão, <strong>permite estender facilmente suas funções nativas</strong> (o que facilita bastante o serviço e evita alterar o código fonte original).</p>
<p>Primeiro, é preciso criar uma nova biblioteca dentro da pasta &#8220;application&#8221; (ou talvez você tenha alterado o nome dela usando a dica anterior!), que precisa ser nomeada apropriadamente para que o CI a reconheça! Ele deve ser chamado &#8220;<strong>MY_Loader.php</strong>&#8221; e conter o seguinte:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p84code105'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84105"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p84code105"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">Class</span> MY_Loader <span style="color: #000000; font-weight: bold;">extends</span> CI_Loader <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> MY_Loader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    	parent<span style="color: #339933;">::</span><span style="color: #004000;">CI_Loader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_ci_view_path <span style="color: #339933;">=</span> <span style="color: #0000ff;">'templates/'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>Atenção!</strong> Antes de continuar, lembre-se de mover todos as <em>views</em> existentes para o novo diretório! Do contrário, você será premiado com uma família inteira de erros!</p>
<h2>Diretório para imagens, estilos, javascript e outros</h2>
<p>Geralmente é bom ter diretórios próprios para imagens, folhas de estilo, javascript e demais recursos necessários para o desenvolvimento de sites/sistemas. Se for em um local unificado ao invés de espalhar os &#8220;assets&#8221; pela <a href="http://codeigniterbrasil.com/passos-iniciais/estrutura-diretorios-organizacao-pastas-codeigniter/">estrutura de diretórios do CodeIgniter</a>, então, é melhor ainda!</p>
<p>Fazer isso é algo simples e existem diversas maneiras de se conseguir. Uma dessas maneiras (pesquise para encontrar mais, vale a pena) é ter um diretório &#8220;assets&#8221; na raiz da instalação com subdiretórios para cada tipo de recurso que se precise:</p>
<p><strong></p>
<ul>
<li>/assets</li>
<ul>
<li>/css</li>
<li>/img</li>
<li>/js</li>
<li>[etc]</li>
</ul>
</ul>
<p></strong></p>
<p>Então, para fazer as chamadas aos recursos, basta fazer como:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p84code106'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84106"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p84code106"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Fazer link para um css (precisa do HTML Helper)</span>
<span style="color: #b1b100;">echo</span> link_tag<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'assets/css/styles.css'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Especificar caminho de uma imagem</span>
<span style="color: #339933;">&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?php echo base_url() . 'assets/img/image.jpg' ?&gt;&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;alt text&quot;</span> <span style="color: #339933;">/&gt;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Link para um javascript</span>
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;?php echo base_url() . 'assets/js/jquery.js' ?&gt;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<h2>Mãos à obra!</h2>
<p>Como falado diversas maneiras durante o artigo, existem muitos jeitos para se alcançar os mesmos resultados apresentados aqui. <strong>Estas dicas são excelentes</strong>, mas não são as únicas a serem realizadas. Certamente são boas dicas e, caso você tenha necessidade de aplicar alguma(s) técnica(s) mostrada, já sabe uma das maneiras de conseguir.</p>
<p>O jeito é experimentar e experimentar, procurar outras dicas similares e, com o tempo e experiência, criar suas próprias maneiras de facilitar o fluxo do CodeIgniter (que já é simples, diga-se de passagem) e aprimorar dicas de outras pessoas. Os conceitos de &#8220;<strong>comunidade</strong>&#8221; e &#8220;<strong>colaboração</strong>&#8221; tem a ver com isso, meus amigos!</p>
<p>E você, tem alguma boa <strong>dica de configuração do CodeIgniter</strong> para compartilhar?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=B-dDXCFIuvE:Vpi2vwcekDc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=B-dDXCFIuvE:Vpi2vwcekDc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=B-dDXCFIuvE:Vpi2vwcekDc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=B-dDXCFIuvE:Vpi2vwcekDc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/B-dDXCFIuvE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/dicas/dicas-basicas-configuracao-codeigniter/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/dicas/dicas-basicas-configuracao-codeigniter/</feedburner:origLink></item>
		<item>
		<title>Configuração de rotas (routes) no CodeIgniter</title>
		<link>http://feedproxy.google.com/~r/cibrasil/~3/k-5W_Sqmups/</link>
		<comments>http://codeigniterbrasil.com/configuracoes/configuracao-rotas-routes-codeigniter/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 18:38:03 +0000</pubDate>
		<dc:creator>Tárcio Zemel</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Passos Iniciais]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://codeigniterbrasil.com/?p=78</guid>
		<description><![CDATA[O relacionamento padrão entre uma URL e um Controller no CodeIgniter segue a estrutura exemplo.com/classe/metodo/id/ (como mostrado no artigo sobre Controllers no CodeIgniter), mas, às vezes, é preciso &#8220;remapear&#8221; este relacionamento. No CodeIgniter, isso é feito através de routes (rotas). Este é um guest post de Julio Bitencourt, que pode ser encontrado na internet através [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeigniterbrasil.com/wp-content/uploads/2010/07/rotas-routes-codeigniter-configuracao.gif" alt="Rotas (routes) no CodeIgniter: configuração" title="" width="400" height="200" class="aligncenter size-full wp-image-83 ilustra-artigo" /></p>
<p>O relacionamento padrão entre uma URL e um Controller no CodeIgniter segue a estrutura exemplo.com/classe/metodo/id/ (como mostrado no artigo sobre <a href="/passos-iniciais/controllers-no-codeigniter/">Controllers no CodeIgniter</a>), mas, às vezes, é preciso &#8220;remapear&#8221; este relacionamento. No CodeIgniter, isso é feito através de <strong>routes</strong> (rotas).</p>
<div class="guest-post">
Este é um guest post de <strong>Julio Bitencourt</strong>, que pode ser encontrado na internet através de:</p>
<ul>
<li><a href="http://www.juliobitencourt.com/">Blog de Julio Bitencourt</a></li>
<li><a href="http://www.twitter.com/juliobitencourt">twitter de Julio Bitencourt</a></li>
</ul>
</div>
<p>Tomemos como exemplo a visualização de produtos em uma loja virtual. Digamos que a página para visualização dos detalhes de uma cadeira de balanço seja acessada através da URL <strong>minhaloja.com/produtos/detalhes/1/2</strong> onde &#8220;produtos&#8221; é nosso controller; &#8220;detalhes&#8221; é a função que exibe os detalhes do produto; &#8220;1&#8243; seja o código da categoria cadeiras; e &#8220;2&#8243; seja o código de nossa cadeira de balanço. Esta estrutura funciona perfeitamente, mas, convenhamos, não é &#8220;elegante&#8221;.</p>
<h2>Configuração de rotas</h2>
<p>A configuração de rotas é feita através do arquivo <strong>/application/config/routes.php</strong>, na instalação padrão  do CodeIgniter. Alguns exemplos de configuração de routes:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code114'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78114"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p78code114"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// &quot;minhaloja.com/fale-conosco&quot; vai direcionar para o controller &quot;contato&quot;</span>
<span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fale-conosco'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;contato&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// &quot;minhaloja.com/fale-conosco&quot; vai direcionar para o controller &quot;cadastros&quot;</span>
<span style="color: #666666; font-style: italic;">// utilizando a função &quot;novo_cliente&quot;</span>
<span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cadastro/clientes'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;cadastros/novo_cliente&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<div class="alert">
Rotas são executados na ordem em que são definidas. Rotas &#8220;superiores&#8221; sempre prevalecem sobre rotas &#8220;inferiores&#8221;.
</div>
<h2>Wildcards ou Curingas</h2>
<p>Você pode usar curingas (<em>wildcards</em>) para configurar rotas. Desta forma, é possível deixar as URLs mais dinâmicas. Existem 2 tipos de wildcards:</p>
<ol>
<li><strong>:num.</strong> O wildcard &#8220;:num&#8221;, utilizado para rotear somente números.</li>
<li><strong>:any.</strong> O curinga &#8220;:any&#8221;, utilizado para rotear qualquer caractere.</li>
</ol>
<p>Voltando ao exemplo anterior, que tal transformar a URL &#8220;minhaloja.com/produtos/detalhes/1/2&#8243; em &#8220;minhaloja.com/1/2/&#8221;? Seguindo a estrutura padrão do CodeIgniter, pressupõe-se que se está chamando o controller &#8220;1&#8243; e, dentro do controller, a função &#8220;2&#8243;, o que não existe na prática.</p>
<p>Para resolver o problema, vamos escrever a seguinte rota:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code115'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78115"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p78code115"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">':num/:num'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;produtos/detalhes&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Dessa forma, haverá direcionamento para &#8220;produtos/detalhes&#8221; sempre que os seguimentos 1 e 2 da URL sejam numéricos.</p>
<p>Exemplo da função detalhes dentro do controller &#8220;produtos&#8221;:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code116'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78116"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p78code116"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Produtos <span style="color: #000000; font-weight: bold;">extends</span> CI_Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span>__construct<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;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Função index é acessada quando não for passada nenhuma função para o controller</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> detalhes<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">uri</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">segment</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// retorna o código da categoria</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">uri</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">segment</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// retorna o código do produto</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Rotas com expressões regulares</h2>
<p>É possível utilizar expressões regulares para definir as rotas no CodeIgniter. Vamos reescrever a rota do nosso exemplo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code117'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78117"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p78code117"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'(:num)/(:num)'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;produtos/detalhes/<span style="color: #006699; font-weight: bold;">$1</span>/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Agora, o controller fica assim:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code118'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78118"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p78code118"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Produtos <span style="color: #000000; font-weight: bold;">extends</span> CI_Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span>__construct<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;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Função index é acessada quando não for passada nenhuma função para o controller</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> detalhes<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id_categoria</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id_produto</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$id_categoria</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// retorna o código da categoria</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$id_produto</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// retorna o código do produto</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Rotas e SEO</h2>
<p>A URL minhaloja.com/1/2/ ficou bem mais curta e elegante, mas não é amigável quando vamos falar de <a href="http://pt.wikipedia.org/wiki/SEO">SEO</a>. É muito melhor ter uma estrutura como:</p>
<p><strong>http://minhaloja.com/cadeiras/cadeira-de-balanco/</strong></p>
<p>Esta URL é &#8220;amigável&#8221; para os motores de busca e, se você tiver, por exemplo, um campo no cadastro de produtos da loja para armazenar o nome da categoria e uma &#8220;descrição de URL&#8221; (slug) do produto &#8211; como &#8220;cadeira-de-balanco&#8221; -, fica muito fácil. Essa técnica é comumente chamada de <strong>URLs amigáveis</strong>.</p>
<p>A regra do exemplo é:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code119'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78119"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p78code119"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'(:any)/(:any)'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;produtos/detalhes/<span style="color: #006699; font-weight: bold;">$1</span>/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>O controller permanece inalterado; só é preciso buscar no banco de dados os produtos com base nos slugs de categoria e produto &#8211; caso não saiba como criar slugs, confira o artigo &#8220;<a href="http://desenvolvimentoparaweb.com/php/urls-amigaveis-slug-a-wordpress/">URLs amigáveis (slug) à WordPress</a>&#8220;, do blog <a href="http://desenvolvimentoparaweb.com/">desenvolvimento para web</a>.</p>
<h2>Rotas reservadas</h2>
<p>Existem um <em>wildcard</em> reservado no CodeIgniter: &#8220;welcome&#8221;. Ou seja, você não poderá utilizar a seguinte rota em seus projetos:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p78code120'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p78120"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p78code120"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default_controller'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'welcome'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h2>Conclusão</h2>
<p>Rotas servem para alterar o relacionamento padrão entre uma URL e um Controller no CodeIgniter. Sabendo utilizar bem os tipos de rotas disponíveis, é possível criar estruturas incríveis, que realmente facilitam o desenvolvimento e acesso a controllers e funções &#8211; e o SEO agradece!</p>
<p>Com estas dicas já é possível configurar suas rotas e melhorar a navegação em seus projetos com CodeIgniter.</p>
<p>Espero que tenham gostado deste meu primeiro artigo no <a href="/">CodeIgniter Brasil</a> e <a href="/feed">fiquem ligados</a> para mais novidades!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cibrasil?a=k-5W_Sqmups:4Wihnst4mZA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=k-5W_Sqmups:4Wihnst4mZA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cibrasil?a=k-5W_Sqmups:4Wihnst4mZA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cibrasil?i=k-5W_Sqmups:4Wihnst4mZA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cibrasil/~4/k-5W_Sqmups" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://codeigniterbrasil.com/configuracoes/configuracao-rotas-routes-codeigniter/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://codeigniterbrasil.com/configuracoes/configuracao-rotas-routes-codeigniter/</feedburner:origLink></item>
	</channel>
</rss>

