<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Projeto URLcurta!</title>
	<atom:link href="http://blog.urlcurta.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.urlcurta.com</link>
	<description>Diminua o tamanho de suas URLs usando o URLcurta!</description>
	<pubDate>Tue, 24 Jun 2008 18:06:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!</title>
		<link>http://blog.urlcurta.com/ajude-a-sustentar-a-wikipedia-e-outros-projetos-sem-colocar-a-mao-no-bolso-e-concorra-a-um-eee-pc/</link>
		<comments>http://blog.urlcurta.com/ajude-a-sustentar-a-wikipedia-e-outros-projetos-sem-colocar-a-mao-no-bolso-e-concorra-a-um-eee-pc/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 18:06:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[campanha]]></category>

		<category><![CDATA[br-linux]]></category>

		<category><![CDATA[efetividade]]></category>

		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=14</guid>
		<description><![CDATA[…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!<script type="text/javascript">SHARETHIS.addEntry({ title: "Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!", url: "http://blog.urlcurta.com/ajude-a-sustentar-a-wikipedia-e-outros-projetos-sem-colocar-a-mao-no-bolso-e-concorra-a-um-eee-pc/" });</script>]]></description>
			<content:encoded><![CDATA[<p>…e também a pen drives, card drives, camisetas geeks, livros e mais! O <a title="br-linux" href="http://br-linux.org/" target="_blank">BR-Linux</a> e o <a title="efetividade.net" href="http://efetividade.net/" target="_blank">Efetividade</a> lançaram uma <a title="campanha" href="http://br-linux.org/2008/campanha-wikipedia/" target="_blank">campanha</a> para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e <a title="participe" href="http://br-linux.org/2008/campanha-wikipedia/" target="_blank">participe</a> - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!</p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Ajude+a+sustentar+a+Wikip%C3%A9dia+e+outros+projetos%2C+sem+colocar+a+m%C3%A3o+no+bolso%2C+e+concorra+a+um+Eee+PC%21&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Fajude-a-sustentar-a-wikipedia-e-outros-projetos-sem-colocar-a-mao-no-bolso-e-concorra-a-um-eee-pc%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/ajude-a-sustentar-a-wikipedia-e-outros-projetos-sem-colocar-a-mao-no-bolso-e-concorra-a-um-eee-pc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zend_Log</title>
		<link>http://blog.urlcurta.com/zend_log/</link>
		<comments>http://blog.urlcurta.com/zend_log/#comments</comments>
		<pubDate>Sat, 31 May 2008 00:42:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[projeto]]></category>

		<category><![CDATA[Zend_Log]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=13</guid>
		<description><![CDATA[Encontrei hoje um post muito interessante no blog do Tony Bibbs sobre o Zend_Log. E o URLCurta! vai usar o código dele. Provavelmente sem nenhuma mudança;
Segue o link do post
<script type="text/javascript">SHARETHIS.addEntry({ title: "Zend_Log", url: "http://blog.urlcurta.com/zend_log/" });</script>]]></description>
			<content:encoded><![CDATA[<p>Encontrei hoje um post muito interessante no blog do Tony Bibbs sobre o Zend_Log. E o URLCurta! vai usar o código dele. Provavelmente sem nenhuma mudança;</p>
<p><a title="Zend_Log" href="http://www.tonybibbs.com/article.php/Cutting-Use-of-Zend_Log-in-Half" target="_blank">Segue o link do post</a></p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Zend_Log&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Fzend_log%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/zend_log/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Eis que surge a primeira tela do sistema!</title>
		<link>http://blog.urlcurta.com/eis-que-surge-a-primeira-tela-do-sistema/</link>
		<comments>http://blog.urlcurta.com/eis-que-surge-a-primeira-tela-do-sistema/#comments</comments>
		<pubDate>Sat, 17 May 2008 02:58:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[projeto]]></category>

		<category><![CDATA[layout base]]></category>

		<category><![CDATA[tela de inicio]]></category>

		<category><![CDATA[urlcurta]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=9</guid>
		<description><![CDATA[É com muita satisfação que apresento a primeira tela do sistema, a tela de cadastro de usuários.<script type="text/javascript">SHARETHIS.addEntry({ title: "Eis que surge a primeira tela do sistema!", url: "http://blog.urlcurta.com/eis-que-surge-a-primeira-tela-do-sistema/" });</script>]]></description>
			<content:encoded><![CDATA[<p>É com muita satisfação que apresento a primeira tela do sistema, a tela de cadastro de usuários.</p>
<p>Por favor, não levem muito em conta o design, sou péssimo usuário de programas como GIMP (que estou usando) ou Photoshop. Mais adiante eu vou procurar algum amigo que tenha a &#8220;manha&#8221; desses programas e me ajude com um layout mais legalzinho.</p>
<p><a href="http://blog.urlcurta.com/wp-content/uploads/2008/05/sem-titulo.png"><img class="alignnone size-medium wp-image-10" title="URLcurta!" src="http://blog.urlcurta.com/wp-content/uploads/2008/05/sem-titulo-300x193.png" alt="" width="300" height="193" /></a></p>
<p>No próximo post mostrarei a validação (usando Zend_Input_Validate, jQuery, XML) desta tela, por isso propositalmente apresento aqui a tela de cadastro de usuários e não a página inicial do site.</p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Eis+que+surge+a+primeira+tela+do+sistema%21&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Feis-que-surge-a-primeira-tela-do-sistema%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/eis-que-surge-a-primeira-tela-do-sistema/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zend_Controller</title>
		<link>http://blog.urlcurta.com/zend_controller/</link>
		<comments>http://blog.urlcurta.com/zend_controller/#comments</comments>
		<pubDate>Wed, 14 May 2008 23:55:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[projeto]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[zend_controller]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=8</guid>
		<description><![CDATA[Hoje volto a escrever no blog do projeto URLcurta! sobre o Zend_Controller, como este componente é o "coração" do sistema MVC do Zend Framework, é sempre bom conhecer e entender um pouco sobre esse design-pattern. Sendo o Zend_Controller um componente com muitas funcionalidades, neste momento, vou apresentar apenas o básico, que é o que está sendo utilizado no projeto até o momento.<script type="text/javascript">SHARETHIS.addEntry({ title: "Zend_Controller", url: "http://blog.urlcurta.com/zend_controller/" });</script>]]></description>
			<content:encoded><![CDATA[<p>Como dito anteriormente, e depois de alguns dias parado, hoje volto a escrever no blog do projeto URLcurta! sobre o Zend_Controller, como este componente é o &#8220;coração&#8221; do sistema MVC do Zend Framework, é sempre bom conhecer e entender um pouco sobre esse design-pattern, se ainda não conheces, recomendo que dê uma lida neste link sobre <a title="Design-Pattern MVC" href="http://pt.wikipedia.org/wiki/MVC" target="_blank">MVC</a>. Se ainda restar dúvidas, não se preocupe, a medida que vamos escrevendo códigos, vamos entendendo melhor esse pattern.</p>
<p>Sendo o Zend_Controller um componente com muitas funcionalidades, neste momento, vou apresentar apenas o básico, que é o que está sendo utilizado no projeto até o momento.</p>
<p>O inicio de tudo já foi até explicado superficialmente no post sobre a <a title="Organizando o Projeto URLcurta" href="http://blog.urlcurta.com/organizando-o-projeto/" target="_blank">organização do projeto</a>, tudo começa na estrutura, por isso, vou apenas copiar algumas partes que foram descritas lá.<br />
Estrutura de diretórios:</p>
<p><code>../<br />
../application<br />
../application/default/controlers<br />
../application/default/models<br />
../application/default/views<br />
../html<br />
../html/images<br />
../html/scripts<br />
../html/styles<br />
../html/index.php<br />
../html/.htaccess<br />
../library</code></p>
<p>Também faz parte do setup do Zend_Controller o arquivo .htaccess que contém algumas regras de re-escrita de URL.</p>
<p><code> RewriteEngine on<br />
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php</code></p>
<p>O index.php é o nosso &#8220;pontapé&#8221; (bootstrap), todas as requisições são através dele.</p>
<p><code>&lt;?php<br />
/**<br />
* @author Andre de Castro Zorzo<br />
* @version<br />
*/<br />
set_include_path('.' . PATH_SEPARATOR . '../' . PATH_SEPARATOR . '../library' . PATH_SEPARATOR . './application/default/models/' . PATH_SEPARATOR . get_include_path());<br />
require_once 'Zend/Controller/Front.php';<br />
/**<br />
* Setup controller<br />
*/<br />
$controller = Zend_Controller_Front::getInstance();<br />
$controller-&gt;setControllerDirectory('../application/default/controllers');<br />
$controller-&gt;throwExceptions(true); // XXX deixar ligado apenas enquanto estiver desenvolvendo<br />
$controller-&gt;dispatch();<br />
?&gt;</code></p>
<p>Esse &#8220;$controller-&gt;setControllerDirectory(&#8217;&#8230;&#8217;)&#8221; indica o diretório onde estão as &#8220;controllers&#8221; do projeto. E o &#8220;$controller-&gt;dispatch()&#8221; é o responsável por procurar as &#8220;controllers&#8221; nesse diretório e &#8220;despachá-las&#8221;, (fazê-las rodar/executar).</p>
<p>Um pouquinho sobre como funciona o roteamento das urls.</p>
<p>A primeira parte da url indica qual &#8220;controller&#8221; chamar, e a segunda, qual &#8220;action&#8221;. Assim, http://urlcurta.com/cadastro/editar significa que &#8220;cadastro&#8221; é a nossa &#8220;controller&#8221; e &#8220;editar&#8221; a nossa &#8220;action&#8221;. Por padrão, quando não é informada uma &#8220;action&#8221;, o Zend Framework, assume a &#8220;index&#8221; como sendo a &#8220;action&#8221; da controller &#8220;cadastro&#8221;. E se não informar uma &#8220;controller&#8221;, por padrão o Zend Framework assumirá a controller &#8220;index&#8221;, exemplificando:</p>
<p><code>http://urlcurta.com/cadastro/editar (controller "cadastro", action "editar")<br />
http://urlcurta.com/cadastro (controller "cadastro", action "index")<br />
http://urlcurta.com (controller "index", action "index")</code></p>
<p>Pela definição que fizemos anteriormente, no arquivo &#8220;index.php&#8221;, nossas controllers estão no diretorio &#8220;application/default/controllers&#8221;.</p>
<p>Para o nome das controller e actions existe uma regra a ser seguida, por definição do Zend Framework, <strong>o nome de uma controller DEVE começar com letra maiúscula</strong> e terminar com a palavra &#8220;<strong>Controller</strong>&#8221; (a primeira em maiúscula também), por exemplo, &#8220;<strong>CadastroController.php</strong>&#8220;. Assim, temos os arquivos:</p>
<p><code>application/default/controllers/CadastroController.php<br />
application/default/controllers/IndexController.php</code></p>
<p>Para &#8220;actions&#8221; a regra é, o nome seguido pela palavra &#8220;Action&#8221; (a primeira em maiúscula), por exemplo &#8220;editarAction&#8221;.</p>
<p>É possivel definir nomes compostos para controllers e actions, porém, você deve observar um detalhe, digamos que a controller seja: &#8220;TermosDeUsoController.php&#8221;, para isso funcionar corretamente, você deverá chamar na url: http://urlcurta.com/termos-de-uso, se tentar usar http://urlcurta.com/termosDeUso vai dar erro e não vai funcionar.</p>
<p>Agora vamos ver o código da controller &#8220;CadastroController.php&#8221;</p>
<p><code>&lt;?php<br />
/**<br />
* CadastroController<br />
*<br />
* @author  Andre de Castro Zorzo &lt;andre_zorzo@yahoo.com&gt;<br />
* @version<br />
*/<br />
require_once 'Zend/Controller/Action.php';<br />
class CadastroController extends Zend_Controller_Action<br />
{<br />
public function indexAction()<br />
{<br />
}<br />
public function editarAction()<br />
{<br />
}<br />
}<br />
</code></p>
<p>E o IndexController.php está assim</p>
<p><code>&lt;?php<br />
/**<br />
* IndexController - The default controller class<br />
*<br />
* @author  Andre de Castro Zorzo &lt;andre_zorzo@yahoo.com&gt;<br />
* @version<br />
*/<br />
require_once 'Zend/Controller/Action.php';<br />
class IndexController extends Zend_Controller_Action<br />
{<br />
public function indexAction()<br />
{<br />
}<br />
}</code></p>
<p>Além disso, temos um &#8220;action helper&#8221; chamado ViewRenderer que está ativo por padrão, isso significa, que o simples fato de criar uma &#8220;action&#8221; e um arquivo html (view) o conteúdo deste arquivo de &#8220;view&#8221; já será apresentado. Mais um componente que está ativo por padrão, e que é a parte da camada MVC é o Zend_View. Para determinar o nome da view correspondente, o ViewRenderer através do nome da controller e da action descobre qual é template (view/codigo html). A extensão padrão dos templates é &#8220;.phtml&#8221;, assim, a url http://urlcurta.com/cadastro/editar vai utilizar o template que fica no diretório:</p>
<p>application/default/view/scripts/cadastro/editar.phtml<br />
<code><br />
&lt;html&gt;<br />
&lt;title&gt;Projeto URLcurta!&lt;/title&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;Editar Cadastro&lt;/h1&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code></p>
<p>Basicamente é isso o Zend_Controller. Nos próximos posts provavelmente abordarei mais um pouco de Zend_Controller. Qualquer duvida, é só falar!</p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Zend_Controller&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Fzend_controller%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/zend_controller/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zend_DB::factory, Zend_Config e Zend_Registry</title>
		<link>http://blog.urlcurta.com/zend_db-zend_config-e-zend_registry/</link>
		<comments>http://blog.urlcurta.com/zend_db-zend_config-e-zend_registry/#comments</comments>
		<pubDate>Thu, 01 May 2008 18:05:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[projeto]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=7</guid>
		<description><![CDATA[Agora começa a parte legal do negócio, vou tentar explicar de forma simples e objetiva cada uma das coisas que usei no "bootstrap". Zend_DB::factory, Zend_Config e Zend_Registry.<script type="text/javascript">SHARETHIS.addEntry({ title: "Zend_DB::factory, Zend_Config e Zend_Registry", url: "http://blog.urlcurta.com/zend_db-zend_config-e-zend_registry/" });</script>]]></description>
			<content:encoded><![CDATA[<p>Continuando o post sobre &#8220;<a title="Organizando o Projeto URLcurta" href="http://blog.urlcurta.com/organizando-o-projeto/" target="_blank">Organizando o Projeto</a>&#8220;.</p>
<p>Agora começa a parte legal do negócio, vou tentar explicar de forma simples e objetiva cada uma das coisas que usei no &#8220;bootstrap&#8221;.</p>
<p><strong>Zend_Config e Zend_Config_Xml</strong></p>
<p>O Zend_Config serve para simplificar a forma de acessar dados de configuração dentro de um sistema. Você pode ter os dados de configuração em arquivo XML, usado no caso do projeto URLcurta, ou arquivo &#8220;INI&#8221;. Para isso você tem &#8220;adaptadores&#8221; ou &#8220;interfaces&#8221; para acessar os arquivos contendo os dados de configuração, abaixo você verá o arquivo &#8220;config.xml&#8221; usado no projeto:</p>
<p><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;configdata&gt;<br />
&lt;production&gt;<br />
&lt;webhost&gt;urlcurta.com&lt;/webhost&gt;<br />
&lt;database&gt;<br />
&lt;adapter&gt;pdo_mysql&lt;/adapter&gt;<br />
&lt;params&gt;<br />
&lt;host&gt;localhost&lt;/host&gt;<br />
&lt;username&gt;root&lt;/username&gt;<br />
&lt;password&gt;&lt;/password&gt;<br />
&lt;dbname&gt;urlcurta&lt;/dbname&gt;<br />
&lt;/params&gt;<br />
&lt;/database&gt;<br />
&lt;/production&gt;<br />
&lt;development extends="production"&gt;<br />
&lt;database&gt;<br />
&lt;params&gt;<br />
&lt;dbname&gt;dev_urlcurta&lt;/dbname&gt;<br />
&lt;/params&gt;<br />
&lt;/database&gt;<br />
&lt;/development&gt;<br />
&lt;/configdata&gt;</code></p>
<p>Uma coisa que eu achei bem interessante nisso, é que você pode ter varias configurações dentro deste mesmo arquivo, como no exemplo acima, onde o banco de dados &#8220;development&#8221; extende as configurações do banco de dados &#8220;production&#8221;, assim, você não precisa ficar se preocupando em sempre configurar os dados de conexão quando faz uma nova release do projeto, os dados já estão lá. Outro ponto interessante que isso possibilita organizar de forma simples os dados quando você tem um sistema que acessa vários bancos de dados.</p>
<p>Nesse caso, para usar o banco &#8220;development&#8221;, o código ficaria assim:</p>
<p><code>$config = new Zend_Config_Xml('../setup/config.xml', 'development');</code></p>
<p><strong>Zend_Registry</strong></p>
<p>O Zend_Registry é uma alternativa ao uso daquelas variáveis globais, $_GLOBALS, ele permite armazenar objetos, variáveis simples e arrays, por exemplo, e compartilhá-lo atraves de todo o sistema. Vale ressaltar que é diferente do $_SESSION.<br />
No projeto URLcurta, vamos usar o Zend_Registry, apenas para guardar a conexão do banco de dados, para diminuir o tempo que normalmente se perde abrindo e fechando a conexão (preciso confirmar se isso acontece realmente, fazendo alguns testes). Também pretendo fazer testes de carga/stress mais adiante para saber quão eficiente é esse método, se o site tiver uma audiência grande, talvez não seja possivel usar assim. Pois cada usuario segurando uma conexão poderia estrapolar o limite máximo de conexões do mysql/servidor.</p>
<p>O Zend_Registry é uma classe muito simples, nem precisa instanciar:</p>
<p>para adicionar um objeto, um array ou uma variável simples, o método é sempre o mesmo:</p>
<p>Zend_Registry::set(&#8217;db&#8217;, $db_adapter);</p>
<p>para pegar de volta o valor guardado, pode variar um pouco, mas a forma comum é:</p>
<p>$db_adapter = Zend_Registry::get(&#8217;db&#8217;);</p>
<p>para saber se um determinado valor está no &#8220;registry&#8221;, use assim:</p>
<p>if (Zend_Registry::isRegistered(&#8217;db&#8217;)) {<br />
// sim, esta registrado<br />
}</p>
<p>Quando eu digo que pode variar um pouco, a forma como pegar de volta o valor que está no registry, é porque em alguns casos você pode querer iterar o &#8220;registry&#8221;, etc. Tambem não pretendo aprofundar muito aqui, então, qualquer duvida você pode consultar o manual: http://framework.zend.com/manual/en/zend.registry.html, e se ainda assim tiver duvidas, você pode perguntar que eu tentarei ajudar.<br />
<strong>Zend_DB::factory</strong></p>
<p>Zend_DB::factory tem uma documentação bastante extensa, por isso, neste ponto, vou falar apenas do método factory, e a medida que vou postando mais detalhes sobre o projeto, vou esclarecendo outros métodos e classes que extendem Zend_DB.</p>
<p>O metodo factory (fábrica) simplifica a utilização dos adaptadores de acesso a banco de dados disponiveis no Zend Framework, poderia sem qualquer problema simplesmente instanciar diretamente o adaptador Zend_DB_Adapter_PDO_Mysql, mas o factory simplifica isso, por dinamicamente carregar essa classe, que foi especificada no arquivo de configuracao (vide config.xml &#8220;&lt;adapter&gt;PDO_Mysql&lt;/adapter&gt;&#8221;).</p>
<p>Tem um ponto interessante para considerar aqui, o simples fato de chamar o &#8220;Zend_DB::factory&#8221; não conecta no banco de dados, a conexão será aberta no momento que for solicitada (por isso disse antes que precisava confirmar se isso não vai contra o que eu falei sobre o tempo perdido abrindo e fechanco conexão).</p>
<p>Concluindo essa parte, e seguindo a lógica do código, se ainda não houver um registro de Zend_DB, instanciamos Zend_Config_Xml, criamos um objeto de conexão com o banco de dados com o Zend_DB::factory e guardamos no registry (acho que poderiamos chamar $_GLOBALS) com o Zend_Registry.<br />
Por enquanto é isso, no próximo post vou falar sobre Zend_Controller.</p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Zend_DB%3A%3Afactory%2C+Zend_Config+e+Zend_Registry&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Fzend_db-zend_config-e-zend_registry%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/zend_db-zend_config-e-zend_registry/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Organizando o projeto!</title>
		<link>http://blog.urlcurta.com/organizando-o-projeto/</link>
		<comments>http://blog.urlcurta.com/organizando-o-projeto/#comments</comments>
		<pubDate>Thu, 01 May 2008 17:47:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[projeto]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=6</guid>
		<description><![CDATA[Depois de levantar os pontos principais do projeto, no primeiro post, chegou a hora de começar a desenvolver o projeto, e tudo começa com um pouco de leitura e entendimento do zend framework, e no que ele pode facilitar o desenvolvimento do projeto.<script type="text/javascript">SHARETHIS.addEntry({ title: "Organizando o projeto!", url: "http://blog.urlcurta.com/organizando-o-projeto/" });</script>]]></description>
			<content:encoded><![CDATA[<p>Depois de levantar os pontos principais do projeto, no primeiro post, chegou a hora de começar a desenvolver o projeto, e tudo começa com um pouco de leitura e entendimento do zend framework, e no que ele pode facilitar o desenvolvimento do projeto. Quero ressaltar que não pretendo abordar o básico de modelo MVC e outros padrões. Se alguém achar necessário me manda um e-mail e enviar com o maior prazer alguns links sobre esses assuntos.</p>
<p>O ponto inicial de estudo foi o guia de referencia do framework, http://framework.zend.com/manual/en/, parece que tem um pessoal se dedicando a tradução em português do Brasil (se alguém quiser colaborar acesse esse endereço: http://framework.zend.com/wiki/display/ZFDEV/Brazilian+Portuguese), por enquanto estou seguindo essa versão em inglês mesmo, o manual aparentemente esta completo, porém, senti falta de mais detalhes e exemplos, alguma coisas ficam meio confusas a primeira vista e não é raro as vezes que você precisa ler 2 ou 3 vezes um capitulo inteiro para compreender o funcionamento de algumas coisas. Por isso acho que alguns exemplos facilitariam a compreensão.</p>
<p>Agora falando em códigos, o primeiro passo foi definir a estrutura da aplicação, como sendo este um projeto de estudo, optei por fazer o básico, sem módulos, tudo dentro do modulo &#8220;default&#8221; do framework. E assim ficou organizado:</p>
<p><code>../<br />
../application<br />
../application/core<br />
../application/default/controlers<br />
../application/default/models<br />
../application/default/views<br />
../html<br />
../html/images<br />
../html/scripts<br />
../html/styles<br />
../html/index.php<br />
../html/.htaccess<br />
../library</code></p>
<p>No diretorio &#8220;application&#8221;, que deve ser mantido fora do &#8220;document_root&#8221; por questões de segurança, e onde ficará todo o código do projeto.</p>
<p>No diretorio &#8220;application/core&#8221; vão ficar algumas classes, como a classe de validação e outras, que não cabem em outro lugar nessa estrutura, com isso também, a medida que o projeto cresce, e que poderá ser acrescentado algum modulo, é possivel re-utilizar esse codigo e a organização das classes de negocio fica legal. Ficaria estranho, ao meu ver, o modulo &#8220;blog&#8221; por exemplo, chamar a classe validação de dentro do modulo &#8220;default&#8221;. Apenas uma questão de organização e estética <img src='http://blog.urlcurta.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>No diretório &#8220;html&#8221;, além das imagens, folhas de estilo e javascript, tem o arquivo &#8220;index.php&#8221; que é responsável pelo &#8220;dispatch&#8221; das requisições. Quando eu falar em arquivo de &#8220;bootstrap&#8221; é desse arquivo que estou falando. Também teremos um arquivo &#8220;.htaccess&#8221; que contém algumas regras de re-escrita de url, para que tudo seja direcionado ao bootstrap, assim, a aplicação possui um único ponto de entrada, uma das premissas do modelo MVC.</p>
<p>Todas as configurações devem ser inicializadas no bootstrap, para isso vamos criar um arquivo &#8220;config.php&#8221;, que vai conter algumas informações para inicializar a aplicação, diretórios para o &#8220;include_path&#8221;, configurações do banco de dados.</p>
<p>E por ultimo, no diretório &#8220;library&#8221; e onde ficam todos os códigos do zend framework, simplesmente descompactando o arquivo ali dentro.</p>
<p>Acredito que com essa explicação, você já tenha uma noção de como organizar o seu projeto com zend framework. E apartir de agora, vamos começar a ver códigos mesmo.</p>
<p>Começamos então pelo &#8220;.htaccess&#8221; que é bem simples, por enquanto, provavelmente terei que fazer alguma modificação posterior:</p>
<p><code><br />
RewriteEngine on<br />
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php<br />
</code></p>
<p>Isso significa que qualquer coisa digitada na url, que não seja &#8220;.js&#8221;, &#8220;.ico&#8221;, &#8220;.gif&#8221;, &#8220;.jpg&#8221;, &#8220;.png&#8221; ou &#8220;.css&#8221; vai redirecionar para o index.php (nosso bootstrap).</p>
<p>E agora o index.php (bootstrap):</p>
<p><code>&lt;?php<br />
/**<br />
* @author  Andre de Castro Zorzo &lt;andre_zorzo@NOSPAM.yahoo.com&gt;<br />
* @version<br />
*/<br />
set_include_path('.' . PATH_SEPARATOR . '../' . PATH_SEPARATOR . '../library' . PATH_SEPARATOR . './application/default/models/' . PATH_SEPARATOR . get_include_path());<br />
require_once 'Zend/Db.php';<br />
require_once 'Zend/Config.php';<br />
require_once 'Zend/Config/Xml.php';<br />
require_once 'Zend/Controller/Front.php';<br />
require_once 'Zend/Registry.php';<br />
require_once 'Zend/Session/Namespace.php';<br />
require_once 'Zend/Auth.php';<br />
/**<br />
* Setup database<br />
*/<br />
if (!Zend_Registry::isRegistered('db')) {<br />
$config = new Zend_Config_Xml('../setup/config.xml', 'production');<br />
$db = Zend_Db::factory($config-&gt;database);<br />
Zend_Registry::set('db', $db);<br />
$db-&gt;getConnection();<br />
}<br />
/**<br />
* Setup controller<br />
*/<br />
$controller = Zend_Controller_Front::getInstance();<br />
$controller-&gt;setControllerDirectory('../application/default/controllers');<br />
$controller-&gt;throwExceptions(true); // XXX deixar ligado apenas enquanto estiver desenvolvendo<br />
$controller-&gt;dispatch();<br />
?&gt;</code></p>
<p>O primeiro passo nesse arquivo, como comentei anteriormente, é indicar os caminhos das bibliotecas e outros códigos, na sequência, estou incluindo algumas classes, definimos o &#8220;setup&#8221; do banco de dados, definimos o &#8220;setup&#8221; do front controller e fazemos o dispatch.</p>
<p>No próximo post eu explicarei brevemente o uso do Zend_Config, Zend_Config_Xml, Zend_Registry e Zend_DB::factory.</p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Organizando+o+projeto%21&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Forganizando-o-projeto%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/organizando-o-projeto/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Projeto de Estudo Zend Framework - A idéia!</title>
		<link>http://blog.urlcurta.com/zend-framework-a-ideia/</link>
		<comments>http://blog.urlcurta.com/zend-framework-a-ideia/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 01:11:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[projeto]]></category>

		<category><![CDATA[diminuir url]]></category>

		<category><![CDATA[urlcurta]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.urlcurta.com/?p=5</guid>
		<description><![CDATA[Minha intenção é estudar o framework de desenvolvimento, Zend Framework, por isso me propus a desenvolver um projeto que será mantido gratuitamente como um serviço para usuários da rede. A idéia é desenvolver um projeto, baseado no famoso tinyURL, porém adicionar mais funcionalidades ao projeto. A medida que o desenvolvimento vai acontecendo, irei postando trechos do código utilizado nesse projeto, e explicando o porquê disso e daquilo<script type="text/javascript">SHARETHIS.addEntry({ title: "Projeto de Estudo Zend Framework - A idéia!", url: "http://blog.urlcurta.com/zend-framework-a-ideia/" });</script>]]></description>
			<content:encoded><![CDATA[<p>Este é o primeiro post do projeto URLcurta!</p>
<p>Minha intenção é estudar o framework de desenvolvimento, Zend Framework, desenvolvido em PHP5.</p>
<p>Por isso, a medida que o desenvolvimento vai acontecendo, irei postando trechos do código utilizado nesse projeto, e explicando o porquê disso e daquilo e se possivel, ainda darei dicas de como tirar melhor proveito desse framework. Ao final, terei produzido um material o mais didático possivel, com a garantia de funcionamento.</p>
<p>Para realmente estudar o negócio, me propus a desenvolver um projeto aberto ao publico, para outros programadores possam dar seus &#8220;pitacos&#8221;, e que será mantido gratuitamente como um serviço para usuários da rede. Sem um propósito acho que o estudo não vai render. Por isso, além do tempo investido, estou pagando um hosting para o projeto, assim fico na obrigação de colocá-lo no ar.</p>
<p>A idéia é desenvolver um sistema, baseado no famoso tinyURL, um site que permite aos usuários criar atalhos para URLs muito longas, como nesse exemplo, encontrado no próprio tinyURL:</p>
<p>Transforme essa URL:</p>
<blockquote><p><small>http://www.mapquest.com/maps/map.adp?ovi=1&amp;mqma<br />
p.x=300&amp;mqmap.y=75&amp;mapdata=%252bKZmeiIh6N%252bI<br />
gpXRP3bylMaN0O4z8OOUkZWYe7NRH6ldDN96YFTIUmSH3Q6<br />
OzE5XVqcuc5zb%252fY5wy1MZwTnT2pu%252bNMjOjsHjvN<br />
lygTRMzqazPStrN%252f1YzA0oWEWLwkHdhVHeG9sG6cMrf<br />
XNJKHY6fML4o6Nb0SeQm75ET9jAjKelrmqBCNta%252bsKC<br />
9n8jslz%252fo188N4g3BvAJYuzx8J8r%252f1fPFWkPYg%<br />
252bT9Su5KoQ9YpNSj%252bmo0h0aEK%252bofj3f6vCP</small></p></blockquote>
<p>nesta tinyURL:</p>
<blockquote><p>http://tinyurl.com/6</p></blockquote>
<p>Por quê um sistema existente? Principalmente por ser usuário desse site e achar que o tinyURL é um projeto que poderia ter mais recursos para os usuários, por isso fiz algumas pesquisas e anotei uma lista de coisas que o projeto deverá suprir.</p>
<p>1. O mais importante de todos, permitir que usuários possam escolher um nome significativo para as URL, isso facilita a lembrança da URL, em vez de http://urlcurta.com/4808ebc, é mais fácil lembrar de http://urlcurta.com/mapa-de-casa. Além disso, uma URL com um nome sugestivo, facilita a indexação do site por buscadores como google, yahoo, entre outros. E ainda, com um nome sugestivo, estamos seguindo uma das técnicas de SEO (search engine optimization).</p>
<p>2. Outro item interessante, ás vezes você quer manter em segredo uma URL, mas não guarda no bookmark (favoritos) porque o seu computador é compartilhado com a familia, então porque não permitir que o usuário possa indicar um código de segurança para uma URL? Assim, ele pode salvar a URL sem se preocupar, pois só ele ou quem tiver o código de acesso poderá visualizar aquela URL.</p>
<p>3. Uma lista de URLs, por vezes você quer passar uma lista de URLs para seus contatos do MSN, mas são todas URLs enormes, como a do exemplo do tinyURL, para que o usuário não precise criar várias URLs curtas, o site pode permitir que o usuário simplesmente agrupe várias URLs dentro de uma só (e ele poderá indicar o código de segurança), em vez de lembrar 5 URLs, ele só precisa lembar de uma!</p>
<p>4. Não encontrei nenhum site que tenha um diretório de URLs, e isso pode ser muito interessante, pois facilitaria o trabalho dos buscadores para indexar as páginas, além de ajudar os usuário a divulgar o site. Assim, podemos categorizar as URLs e ainda adicionar tags para cada uma, mais meio para os buscadores indexar as páginas cadastradas. Páginas não categorizadas, sem tags, e principalmente com código de segurança não devem aparecer no diretório.</p>
<p>5. Pré-visualizar a URL para a qual está sendo redirecionado, diferente do tinyURL, onde você deve selecionar a opção, vamos fazer o negócio acontecer por padrão, e quem não quiser, que desabilite, vamos garantir que o usuário foi avisado que a URL pode ser perigosa. Penso que isso pode ser um cookie com 30 dias de duração, depois o usuário cancela o aviso novamente, se for o caso. Uma forma de proteger o usuário.</p>
<p>6. Outro item importante, é um espaço para que usuário possam denunciar URLs mal-intencionadas, sempre vai ter um engraçadinho para usar o sistema de forma errada, para práticas de spamming, esconder vírus, etc. Além disso, mais para frente, pretendo implementar um sistema (talvez um novo projeto) para que no momento de cadastrar uma URL, esse sistema possa analisar o conteudo da URL e bloquear a criação da URL, antes mesmo de acontecer. Tenho algumas idéias para isso, mas preciso estudar um pouco mais o assunto. É um complemento ao item anterior.</p>
<p>7. Para estudar um pouco mais webservices, pretendo também, criar uma área especial onde desenvolvedores de outros sites poderiam utilzar esse sistema para gerar URLs curtinhas sem precisar acessar o site. Como é baseado em XML, sites desenvolvidos em qualquer linguagem poderiam se integrar sem maiores dificuldades.</p>
<p>8. Fidelizar os usuários também é importante, penso que uma forma de fazer isso, é fazendo que algumas funcionalidades só estejam disponiveis quando o usuário estiver logado, por exemplo: gerenciar as URLs cadastradas, poder visualizar o número que visitas que cada URL já recebeu (sacanagem, mas você passa a URL para 5 amigos e no outro dia você olha no site e só tem 3 visitas, alguém não acessou, mas disse que era legal o site hehe).</p>
<p>9. Ainda é uma coisa para pensar como implementar, mas seria legal uma página para acessar via celular, onde o visitante pudesse criar urls curtas pelo celular. (adicionado em 09/jun)</p>
<p>10. Aceito sugestões!<br />
Espero que gostem da idéia e acompanhem o projeto, para discutir-mos o que poderia ser feito, tanto em funcionalidades, como em utilização do Zend Framework.</p>
<p>Um abraço e até o próximo post!</p>
<p>André</p>
<p><a href="http://sharethis.com/item?&wp=2.5&amp;publisher=c4c521e0-2bae-43b4-aa57-4d57a54aee2b&amp;title=Projeto+de+Estudo+Zend+Framework+-+A+id%C3%A9ia%21&amp;url=http%3A%2F%2Fblog.urlcurta.com%2Fzend-framework-a-ideia%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urlcurta.com/zend-framework-a-ideia/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.841 seconds -->
