<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.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" version="2.0">

<channel>
	<title>symfonybr</title>
	
	<link>http://www.symfonybr.com</link>
	<description>um framework bizarro</description>
	<pubDate>Mon, 06 Jul 2009 14:27:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Symfonybr" type="application/rss+xml" /><item>
		<title>Removendo recursivamente diretórios .svn</title>
		<link>http://www.symfonybr.com/2009/07/06/removendo-recursivamente-diretorios-svn/</link>
		<comments>http://www.symfonybr.com/2009/07/06/removendo-recursivamente-diretorios-svn/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 14:27:34 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=55</guid>
		<description><![CDATA[	Comecei a migrar essa semana todos meus projetos para o SVN. Acontece que, se quisermos baixar o arquivo de um SVN e migrar para outro, temos problemas porque é criado um diretório .svn/ dentro de todos subdiretórios. Para resolver este problema, criei um alias que remove recursivamente os diretórios .svn/ da pasta corrente.

	Com o comando [...]]]></description>
			<content:encoded><![CDATA[	<p>Comecei a migrar essa semana todos meus projetos para o <span class="caps">SVN</span>. Acontece que, se quisermos baixar o arquivo de um <span class="caps">SVN</span> e migrar para outro, temos problemas porque é criado um diretório .svn/ dentro de todos subdiretórios. Para resolver este problema, criei um alias que remove recursivamente os diretórios .svn/ da pasta corrente.</p>

	<p>Com o comando find conseguimos achar os diretórios .svn:</p>

<div class="shell">
$ find . -type d -name .svn <br />

<br />
./.svn
<br />
./sourceA/.svn
<br />
./sourceB/.svn
<br />
./sourceB/module/.svn
<br />
./sourceC/.svn
</div>

	<p>Podemos, junto ao find, passar o comando rm -rf:</p>

<div class="shell">
$ rm -rf `find . -type d -name .svn`
</div>

	<p>Podemos agora criar um alias e adicionar ao profile do usuário:</p>

<div class="shell">
$ echo &#8220;alias csvn=&#8216;echo &#8216;removendo pastas .svn/&#8217;; rm -rf `find . -type d -name .svn`&#8217;&#8221; >> ~/.bash_profile <br />

$ . ~/.bash_profile
</div>

<div class="shell">
$ svn checkout svn://server.com/svn/project
<br />
A    project/index.php
<br />
A    project/sourceA/a.php
<br />
A    project/sourceA/a1.php
<br />
A    project/sourceA/a2.php
<br />
A    project/sourceB/b.php
<br />
A    project/sourceB/module/lib.php
<br />
A    project/sourceC/c.php
<br />
Checked out revision 15.
<br />
$ cd project
<br />
$ csvn
<br />
removendo pastas .svn/
</div>

	<p>Agora podemos fazer checkout de um <span class="caps">SVN</span>, jogar para outro e versionar normalmente.</p>

	<p>Observações:</p>

	<p>-> Tomar muito cuidado para não utilizar este comando na raiz ou em algum diretório perigoso.<br />
-> Não é recomendável utilizar este alias como root.</p>

	<p>É isso! Valeu!</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2009/07/06/removendo-recursivamente-diretorios-svn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Manipulando campos BLOB com symfony 1.2 e Propel 1.3</title>
		<link>http://www.symfonybr.com/2009/07/02/manipulando-campos-blob-com-symfony-12-e-propel-13/</link>
		<comments>http://www.symfonybr.com/2009/07/02/manipulando-campos-blob-com-symfony-12-e-propel-13/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 17:01:43 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<category><![CDATA[blob]]></category>

		<category><![CDATA[model]]></category>

		<category><![CDATA[propel]]></category>

		<category><![CDATA[resource]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=53</guid>
		<description><![CDATA[	Estou começando a dar meus primeiros passos com o symfony 1.2. Acabei de perder 1 hora pesquisando sobre como manipular campos BLOB no MySQL.

	Tenho uma tabela que possui uma coluna imagem do tipo BLOB. Quando tento obter o valor desta coluna com o $objeto-&#62;getImagem(), o retorno é um resource (vardump: Resource id #403). Antigamente, no [...]]]></description>
			<content:encoded><![CDATA[	<p>Estou começando a dar meus primeiros passos com o symfony 1.2. Acabei de perder 1 hora pesquisando sobre como manipular campos <strong>BLOB</strong> no MySQL.</p>

	<p>Tenho uma tabela que possui uma coluna imagem do tipo <span class="caps">BLOB</span>. Quando tento obter o valor desta coluna com o <strong>$objeto-&gt;getImagem()</strong>, o retorno é um <strong>resource</strong> (vardump: Resource id #403). Antigamente, no symfony 1.0, o próprio método era responsável por &#8216;converter&#8217; o resource para string.</p>

	<p>Agora, pesquisando na internet, descobri um modo de fazer esta &#8216;conversão&#8217;. Podemos fazer override da função getImagem() ou criar uma nova. No meu caso, resolvi criar uma função nova. Considerando minha tabela noticia:</p>

	<p><em>lib/model/Noticia.class.php</em></p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">class</span> Noticia <span class="kw2">extends</span> BaseNoticia<br />

<span class="br0">&#123;</span> <br />

&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> getPathImg<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$content</span>=<span class="st0">&quot;&quot;</span>;<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/is_resource"><span class="kw3">is_resource</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">getImagem</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>!<a href="http://www.php.net/feof"><span class="kw3">feof</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">getImagem</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$content</span>.= <a href="http://www.php.net/fread"><span class="kw3">fread</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">getImagem</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">1024</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/rewind"><span class="kw3">rewind</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">getImagem</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#8216;/uploads/banners/&#8217;</span>.<span class="re0">$content</span>;<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">return</span> <span class="st0">&#8216;/uploads/banners/&#8217;</span>.<span class="re0">$this</span>-&gt;<span class="me1">getImagem</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; &nbsp;<br />

&nbsp; &nbsp; <span class="br0">&#125;</span><br />

<span class="br0">&#125;</span><br />

&nbsp;</div>

	<p>Achei esta dica no site do propel, em: <a href="http://propel.phpdb.org/trac/ticket/672">http://propel.phpdb.org/trac/ticket/672</a></p>

	<p>Pelo status do ticket, este retorno passou a ser um resource por questão de flexibilidade e performance.</p>

	<p>Gostaria de obter comentários sobre performance e/ou sugestão sobre esta solução que achei.</p>

	<p>Valeu!</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2009/07/02/manipulando-campos-blob-com-symfony-12-e-propel-13/feed/</wfw:commentRss>
		</item>
		<item>
		<title>symfony é um dos finalistas para o 2009 Sourceforge Community Choice Awards</title>
		<link>http://www.symfonybr.com/2009/06/23/symfony-e-um-dos-finalistas-para-o-2009-sourceforge-community-choice-awards/</link>
		<comments>http://www.symfonybr.com/2009/06/23/symfony-e-um-dos-finalistas-para-o-2009-sourceforge-community-choice-awards/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 17:05:11 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<category><![CDATA[community]]></category>

		<category><![CDATA[source forge]]></category>

		<category><![CDATA[vote]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=54</guid>
		<description><![CDATA[	Graças à dedicada comunidade, o symfony foi escolhido como um dos finalistas para o 2009 Sourceforge Community Choice Awards em três categorias!

	Best Project (Melhor projeto)
	Best Tool or Utility for Developers (Melhor ferramenta para desenvolvedores)
	Best Project for the Enterprise (Melhor projeto para empresa)

Alguns outros projetos também são finalistas como: phpMyAdmin, FLOW3, Joomla, TYPO3, and vtiger CRM.

	Se [...]]]></description>
			<content:encoded><![CDATA[	<p>Graças à dedicada comunidade, o symfony foi escolhido como um dos finalistas para o 2009 Sourceforge Community Choice Awards em três categorias!<br />
<ul>
	<li>Best Project (Melhor projeto)</li>
	<li>Best Tool or Utility for Developers (Melhor ferramenta para desenvolvedores)</li>
	<li>Best Project for the Enterprise (Melhor projeto para empresa)</li><br />
</ul><br />
Alguns outros projetos também são finalistas como: phpMyAdmin, FLOW3, Joomla, TYPO3, and vtiger <span class="caps">CRM</span>.</p>

	<p>Se você gosta do symfony, ou se gosta de <span class="caps">PHP</span>, ou se quer estar junto com a gente, vote: <a href="http://sourceforge.net/community/cca09/vote/">http://sourceforge.net/community/cca09/vote/</a></p>

	<p><a href="http://sourceforge.net/community/cca09/vote/"><img style="vertical-align: middle;" src="http://www.symfony-project.org/images/symfony_vote_2009_white.jpg" alt="" width="215" height="215" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2009/06/23/symfony-e-um-dos-finalistas-para-o-2009-sourceforge-community-choice-awards/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tradução do Getting Started with Symfony</title>
		<link>http://www.symfonybr.com/2009/06/17/traducao-do-getting-started-with-symfony/</link>
		<comments>http://www.symfonybr.com/2009/06/17/traducao-do-getting-started-with-symfony/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 01:47:39 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=52</guid>
		<description><![CDATA[	Fala pessoal. Essa semana eu (Pedro Casado) e o Bernardo Dantas traduzimos o &#8220;Getting started with symfony&#8221;. Os arquivos já foram commitados pelo Lucas Stephanou e podem ser vistos em: http://www.symfony-project.org/getting-started/1_2/pt_BR/

	No mais, é só isso.

	Valeu queiroZ!]]></description>
			<content:encoded><![CDATA[	<p>Fala pessoal. Essa semana eu (Pedro Casado) e o Bernardo Dantas traduzimos o &#8220;Getting started with symfony&#8221;. Os arquivos já foram commitados pelo Lucas Stephanou e podem ser vistos em: <a href="http://www.symfony-project.org/getting-started/1_2/pt_BR/">http://www.symfony-project.org/getting-started/1_2/pt_BR/</a></p>

	<p>No mais, é só isso.</p>

	<p>Valeu queiroZ!</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2009/06/17/traducao-do-getting-started-with-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>sfPropelSyncContentPlugin: Plugin para importar/exportar o banco de dados entre ambientes (dev/prod)</title>
		<link>http://www.symfonybr.com/2008/10/24/sfpropelsynccontentplugin-plugin-para-importarexportar-o-banco-de-dados-entre-ambientes-devprod/</link>
		<comments>http://www.symfonybr.com/2008/10/24/sfpropelsynccontentplugin-plugin-para-importarexportar-o-banco-de-dados-entre-ambientes-devprod/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 21:59:49 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[plugins]]></category>

		<category><![CDATA[producao]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=49</guid>
		<description><![CDATA[	Saiu no dia 16/10/2008 um novo plugin chamando sfPropelSyncContentPlugin

	Esse plugin tem a função de tornar mais prático a manipulação do banco de dados. Com ele podemos facilmente importar todo o banco de dados de produção para desenvolvimento e vice-versa. Ele utiliza o mysqldump e alguns outros comandos do mysql.

	Podemos atualizar nossa base de desenvolvimento com os [...]]]></description>
			<content:encoded><![CDATA[	<p>Saiu no dia 16/10/2008 um novo plugin chamando <a href="http://www.symfony-project.org/plugins/sfPropelSyncContentPlugin">sfPropelSyncContentPlugin</a></p>

	<p>Esse plugin tem a função de tornar mais prático a manipulação do banco de dados. Com ele podemos facilmente importar todo o banco de dados de produção para desenvolvimento e vice-versa. Ele utiliza o mysqldump e alguns outros comandos do mysql.</p>

	<p>Podemos atualizar nossa base de desenvolvimento com os dados de produção com o seguinte comando:<br />
<div class="shell">$ symfony propel-sync-content frontend dev from prod@production</div></p>

	<p>Por outro lado, podemos fazer o inverso, ou seja, atualizar a base de produção com os dados de desenvolvimento:</p>

<div class="shell">$ symfony propel-sync-content frontend dev to prod@production</div>

	<p>O plugin também permite atualização de diretórios. Basta configurar o app.yml em: </code>apps/frontend/config/app.yml</p>

<div class="dean_ch" style="white-space: wrap;"><br />

all:<br />

&nbsp; sfPropelSyncContentPlugin:<br />

&nbsp; &nbsp; content:<br />

&nbsp; &nbsp; &nbsp; * <span class="st0">&quot;web/uploads&quot;</span><br />

&nbsp;</div>

	<p>Com a configuração acima, além de atualizarmos a base de dados, vamos atualizar a pasta web/upload também.</p>

	<p>Valeu!</p>

]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/10/24/sfpropelsynccontentplugin-plugin-para-importarexportar-o-banco-de-dados-entre-ambientes-devprod/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dinamizando conteúdo no symfony com slots</title>
		<link>http://www.symfonybr.com/2008/08/05/dinamizando-conteudo-no-symfony-com-slots/</link>
		<comments>http://www.symfonybr.com/2008/08/05/dinamizando-conteudo-no-symfony-com-slots/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 03:59:39 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=36</guid>
		<description><![CDATA[	Em diversos casos precisamos completar nosso layout com mais de uma área dinâmica. Por exemplo, suponha uma situação em que nós precisamos ter as meta-tags diferentes para cada action executada. No nosso caso, nós teremos as meta-tags padrões e estaremos fazendo um override delas no template. A intenção é termos as meta-tags de description e [...]]]></description>
			<content:encoded><![CDATA[	<p>Em diversos casos precisamos completar nosso layout com mais de uma área dinâmica. Por exemplo, suponha uma situação em que nós precisamos ter as meta-tags diferentes para cada action executada. No nosso caso, nós teremos as meta-tags padrões e estaremos fazendo um override delas no template. A intenção é termos as meta-tags de <em>description</em> e <em>keywords</em> (nesse exemplo) dinâmicas. Sendo assim, cada página terá as keywords e descriptions respectivas. Isso é fundamental para motores de busca, <span class="caps">SEO</span>, etc..</p>

	<p>Para essa solução, utilizaremos o <strong>slot</strong>. Basicamente, slot é um lugar que você estará reservando para um conteúdo específico. Esse lugar pode ser definido no layout, template ou até em um partial. Está muito abstrato ainda, não é? Vou mostrar um exemplo.</p>

	<p>Podemos ter por exemplo no <strong>apps/APLICACAO/templates/layout.php</strong> algo assim:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&lt;html&gt;<br />

&lt;head&gt;<br />

&nbsp;<span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">&#40;</span>has_slot<span class="br0">&#40;</span><span class="st0">&#8216;http_metas&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>: <span class="kw2">?&gt;</span><br />

&nbsp; &nbsp;<span class="kw2">&lt;?php</span> include_slot<span class="br0">&#40;</span><span class="st0">&#8216;http_metas&#8217;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp;<span class="kw2">&lt;?php</span> <span class="kw1">endif</span>: <span class="kw2">?&gt;</span><br />

&lt;/head&gt;<br />

&nbsp;</div>

	<p>Dentro de um template, <strong>apps/APLICACAO/modules/faleconosco/indexSuccess.php</strong> poderíamos ter um código como esse:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">&lt;?php</span> slot<span class="br0">&#40;</span><span class="st0">&#8216;http_metas&#8217;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp;&lt;meta name=<span class="st0">&quot;title&quot;</span> content=<span class="st0">&quot;Fale conosco&quot;</span> /&gt;<br />

&nbsp;&lt;meta name=<span class="st0">&quot;description&quot;</span> content=<span class="st0">&quot;Entre em contato conosco pelo formulário abaixo ou fale direto conosco pelo telefone xxxxx&quot;</span> /&gt;<br />

&nbsp;&lt;meta name=<span class="st0">&quot;keywords&quot;</span> content=<span class="st0">&quot;contato, telefone, etc, etc&quot;</span> /&gt;<br />

<span class="kw2">&lt;?php</span> end_slot<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp;</div>

	<p>Ou seja, quando o usuário acessar a action index do módulo faleconosco, as meta-tags dele serão essas citadas acima. É claro que esse é um exemplo muito simples.</p>

	<p>Isso pode ficar mais interessante pegando palavras-chave de um banco de dados, ou a descrição de um produto, artigo, etc.. É bom lembrar que a meta-tag de description tem um ideal de caracteres. Se não me engano é algo em torno de 200~300. Corrijam se estiver errado.</p>

	<p>Vale a pena lembrar que para setar os meta-tags não é obrigatório utilizar os slots. Eles podem ser setados direto na action <strong>apps/APLICACAO/modules/faleconosco/actions/actions.class.php</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="re0">$this</span>&#45;&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">setTitle</span><span class="br0">&#40;</span><span class="st0">&#8216;My Title&#8217;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$this</span>&#45;&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">addMeta</span><span class="br0">&#40;</span><span class="st0">&#8216;description&#8217;</span>,<span class="st0">&#8216;My Description&#8217;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$this</span>&#45;&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">addMeta</span><span class="br0">&#40;</span><span class="st0">&#8216;keywords&#8217;</span>,<span class="st0">&#8216;My Keywords&#8217;</span><span class="br0">&#41;</span>;<br />

&nbsp;</div>

	<p>Esse foi só um exemplo da utilização dos slots. Eles possuem diversas outras utilidades para dinamizar conteúdos.</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/08/05/dinamizando-conteudo-no-symfony-com-slots/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Descompactando arquivos ZIP vindo de um form com symfony</title>
		<link>http://www.symfonybr.com/2008/07/28/descompactando-arquivos-zip-vindo-de-um-form-com-symfony/</link>
		<comments>http://www.symfonybr.com/2008/07/28/descompactando-arquivos-zip-vindo-de-um-form-com-symfony/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 14:23:46 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=47</guid>
		<description><![CDATA[	Nesse post vou mostrar como faço para tratar arquivos ZIP vindo de um formulário.

	Primeiramente, precisamos ter instalado a biblioteca zip. Para isso, podemos utilizar o comando abaixo:

 $ pecl install zip

	Suponhamos um formulário simples:



&#160; &#160; &#60;?php echo form_tag&#40;&#34;upload/do&#34; , &#34;method=post multipart=true&#34;&#41; ?&#62;

&#160; &#160; &#160; &#60;?php echo input_file_tag&#40;&#34;anexos&#34;&#41; ?&#62;

&#160; &#160; &#60;/form&#62;

&#160;

	Na action que irá tratar o [...]]]></description>
			<content:encoded><![CDATA[	<p>Nesse post vou mostrar como faço para tratar arquivos <span class="caps">ZIP</span> vindo de um formulário.</p>

	<p>Primeiramente, precisamos ter instalado a biblioteca zip. Para isso, podemos utilizar o comando abaixo:</p>

<div class="shell"> $ pecl install zip</div>

	<p>Suponhamos um formulário simples:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; <span class="kw2">&lt;?php</span> <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> form_tag<span class="br0">&#40;</span><span class="st0">&quot;upload/do&quot;</span> , <span class="st0">&quot;method=post multipart=true&quot;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> input_file_tag<span class="br0">&#40;</span><span class="st0">&quot;anexos&quot;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp; &nbsp; &lt;/form&gt;<br />

&nbsp;</div>

	<p>Na action que irá tratar o formulário:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; <span class="re0">$phpFile</span> = sfContext::<span class="me2">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">getRequest</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">getFile</span><span class="br0">&#40;</span><span class="st0">&#8216;anexos&#8217;</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; <span class="re0">$zip</span> = <span class="kw2">new</span> ZipArchive<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="re0">$res</span> = <span class="re0">$zip</span>-&gt;<span class="me1">open</span><span class="br0">&#40;</span><span class="re0">$phpFile</span><span class="br0">&#91;</span><span class="st0">&quot;tmp_name&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$res</span> === <span class="kw2">TRUE</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$zip</span>-&gt;<span class="me1">extractTo</span><span class="br0">&#40;</span>sfConfig::<span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#8216;sf_upload_dir&#8217;</span><span class="br0">&#41;</span>.<span class="st0">&#8216;/imagens/&#8217;</span><span class="br0">&#41;</span>; <span class="co1">// web/uploads/imagens</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$zip</span>-&gt;<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// logar o erro onde preferir..</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// echo &#8216;failed, code:&#8217; . $res;</span><br />

&nbsp; &nbsp; <span class="br0">&#125;</span> <br />

&nbsp;</div>

	<p>Neste exemplo não estou considerando validação do tipo de arquivo, etc..</p>

	<p><strong>É obrigatório ter no formulário multipart=true senão não irá funcionar.</strong></p>

	<p>Valeeeeu! =)</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/28/descompactando-arquivos-zip-vindo-de-um-form-com-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Utilizando o rsync do symfony com parâmetros personalizados</title>
		<link>http://www.symfonybr.com/2008/07/22/utilizando-o-rsync-do-symfony-com-parametros-personalizados/</link>
		<comments>http://www.symfonybr.com/2008/07/22/utilizando-o-rsync-do-symfony-com-parametros-personalizados/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 16:47:56 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[producao]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=46</guid>
		<description><![CDATA[	Essa é uma dica legal que descobri a um tempo. Para aqueles que quiserem utilizar outras funçoes que o rsync oferece, segue abaixo um trecho de código.

	Editando o arquivo config/properties.ini:



&#91;producao&#93;

&#160; host=servidor

&#160; port=porta

&#160; user=usuario

&#160; dir=/diretorio

&#160; parameters=&#34;-azC &#8212;copy-links &#8212;exclude-from=config/rsync_exclude.txt &#8212;force &#8212;delete&#34; 

&#160;

	Através do &#8220;parameters&#8221; podemos passar os parâmetros manualmente.. Nesse caso adicionei o &#8212;copy-links

	Agora é mole

	 $ [...]]]></description>
			<content:encoded><![CDATA[	<p>Essa é uma dica legal que descobri a um tempo. Para aqueles que quiserem utilizar outras funçoes que o rsync oferece, segue abaixo um trecho de código.</p>

	<p>Editando o arquivo <strong>config/properties.ini</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="br0">&#91;</span>producao<span class="br0">&#93;</span><br />

&nbsp; host=servidor<br />

&nbsp; port=porta<br />

&nbsp; user=usuario<br />

&nbsp; <a href="http://www.php.net/dir"><span class="kw3">dir</span></a>=/diretorio<br />

&nbsp; parameters=<span class="st0">&quot;-azC &#8212;copy-links &#8212;exclude-from=config/rsync_exclude.txt &#8212;force &#8212;delete&quot;</span> <br />

&nbsp;</div>

	<p>Através do &#8220;parameters&#8221; podemos passar os parâmetros manualmente.. Nesse caso adicionei o &#8212;copy-links</p>

	<p>Agora é mole</p>

	<p><div class="shell"> $ symfony sync producao go </div><br />
Valeu!</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/22/utilizando-o-rsync-do-symfony-com-parametros-personalizados/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Utilizando um CSS específico para cada módulo do symfony</title>
		<link>http://www.symfonybr.com/2008/07/17/utilizando-um-css-especifico-para-cada-modulo-do-symfony/</link>
		<comments>http://www.symfonybr.com/2008/07/17/utilizando-um-css-especifico-para-cada-modulo-do-symfony/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:02:05 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[css]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=48</guid>
		<description><![CDATA[	Essa é uma dica simples. Se você tem alguns módulos e quer ter um CSS para cada módulo, aqui vai uma linha que pode ser bastante útil.



&#160; &#60;?php use_stylesheet&#40;$sf_context-&#62;getModuleName&#40;&#41;&#41; ?&#62; &#160;

&#160;

	ciao! ]]></description>
			<content:encoded><![CDATA[	<p>Essa é uma dica simples. Se você tem alguns módulos e quer ter um <span class="caps">CSS</span> para cada módulo, aqui vai uma linha que pode ser bastante útil.</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; <span class="kw2">&lt;?php</span> use_stylesheet<span class="br0">&#40;</span><span class="re0">$sf_context</span>-&gt;<span class="me1">getModuleName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span> &nbsp;<br />

&nbsp;</div>

	<p>ciao! </p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/17/utilizando-um-css-especifico-para-cada-modulo-do-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Trabalhando com Symfony 1.1 e Doctrine</title>
		<link>http://www.symfonybr.com/2008/07/15/trabalhando-com-symfony-11-e-doctrine/</link>
		<comments>http://www.symfonybr.com/2008/07/15/trabalhando-com-symfony-11-e-doctrine/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 13:37:34 +0000</pubDate>
		<dc:creator>pedro casado</dc:creator>
		
		<category><![CDATA[doctrine]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=44</guid>
		<description><![CDATA[	Quer experimentar o symfony 1.1? Primeiramente vamos ter que configurar um novo projeto e instalar o sfDoctrine para o symfony 1.1. Execute os comandos abaixo e continue lendo:

    $ mkdir symfony1.1Doctrine
    $ cd symfony1.1Doctrine
    $ /path/to/symfony generate:project symfony1.1Doctrine
    $ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin/trunk plugins/sfDoctrinePlugin
 [...]]]></description>
			<content:encoded><![CDATA[	<p>Quer experimentar o symfony 1.1? Primeiramente vamos ter que configurar um novo projeto e instalar o sfDoctrine para o symfony 1.1. Execute os comandos abaixo e continue lendo:</p>

    <div class="shell">$ mkdir symfony1.1Doctrine</div>
    <div class="shell">$ cd symfony1.1Doctrine</div>
    <div class="shell">$ /path/to/symfony generate:project symfony1.1Doctrine</div>
    <div class="shell">$ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin/trunk plugins/sfDoctrinePlugin</div>
    <div class="shell">$ php symfony cc</div>

	<p>
Agora, digite o comando abaixo para listar tudo que o `sfDoctrinePlugin` oferece. Você vai perceber que o comando vai listar os mesmos comandos do `sfPropelPlugin` e muitos outros.</p>

    <div class="shell">$ php symfony list doctrine</div>
    <div class="shell">Available tasks for the &#8220;doctrine&#8221; namespace:</div>
    <div class="shell">  :build-all                   Generates Doctrine model, <span class="caps">SQL</span> and initializes the database (doctrine-build-all)</div>
    <div class="shell">  :build-all-load              Generates Doctrine model, <span class="caps">SQL</span>, initializes database, and load data (doctrine-build-all-load)</div>
    <div class="shell">  :build-all-reload            Generates Doctrine model, <span class="caps">SQL</span>, initializes database, and load data (doctrine-build-all-reload)</div>
    <div class="shell">  :build-all-reload-test-all   Generates Doctrine model, <span class="caps">SQL</span>, initializes database, load data and run all test suites (doctrine-build-all-reload-test-all)</div>
    <div class="shell">  :build-db                    Creates database for current model (doctrine-build-db)</div>
    <div class="shell">  :build-forms                 Creates form classes for the current model (doctrine-build-forms)</div>
    <div class="shell">  :build-model                 Creates classes for the current model (doctrine-build-model)</div>
    <div class="shell">  :build-schema                Creates a schema.xml from an existing database (doctrine-build-schema)</div>
    <div class="shell">  :build-sql                   Creates <span class="caps">SQL</span> for the current model (doctrine-build-sql)</div>
    <div class="shell">  :data-dump                   Dumps data to the fixtures directory (doctrine-dump-data)</div>
    <div class="shell">  :data-load                   Loads data from fixtures directory (doctrine-load-data)</div>
    <div class="shell">  :dql                         Execute a <span class="caps">DQL</span> query and view the results (doctrine-dql)</div>
    <div class="shell">  :drop-db                     Drops database for current model (doctrine-drop-db)</div>
    <div class="shell">  :generate-crud               Generates a Doctrine <span class="caps">CRUD</span> module (doctrine-generate-crud)</div>
    <div class="shell">  :generate-migration          Generate migration class (doctrine-generate-migration)</div>
    <div class="shell">  :generate-migrations-db      Generate migration classes from existing database connections (doctrine-generate-migrations-db, doctrine-gen-migrations-from-db)</div>
    <div class="shell">  :generate-migrations-models  Generate migration classes from an existing set of models (doctrine-generate-migrations-models, doctrine-gen-migrations-from-models)</div>
    <div class="shell">  :init-admin                  Initializes a Doctrine admin module (doctrine-init-admin)</div>
    <div class="shell">  :insert-sql                  Inserts <span class="caps">SQL</span> for current model (doctrine-insert-sql)</div>
    <div class="shell">  :migrate                     Migrates database to current/specified version (doctrine-migrate)</div>
    <div class="shell">  :rebuild-db                  Creates database for current model (doctrine-rebuild-db)</div>

	<p>
O `sfDoctrinePlugin` atualmente necessita de pelo menos uma aplicação configurada, então, vamos instanciar a aplicação `frontend`.</p>

    <div class="shell">$ php symfony generate:app frontend</div>

	<p>Agora vamos configurar nosso banco de dados em `config/databases.yml`. Abra o arquivo no seu editor predileto e utilize o <span class="caps">YAML</span> abaixo. Para esse teste, estamos simplesmente utilizando um banco de dados SQLite. O Doctrine é capaz de criar o banco de dados em `config/doctrine.db`. </p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; all:<br />

&nbsp; &nbsp; &nbsp; doctrine:<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">class</span>: &nbsp; &nbsp;sfDoctrineDatabase<br />

&nbsp; &nbsp; &nbsp; &nbsp; param:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dsn: &nbsp; &nbsp;sqlite:<span class="co1">///&lt;?php echo dirname(__FILE__); ?&gt;/doctrine.db</span><br />

&nbsp; &nbsp;</div>

	<p>Agora que nós temos nosso banco de dados configurado, vamos definir nosso schema em `config/doctrine/schema.yml`. Nesse exemplo nós estamos configurando o modelo `BlogPost` que `hasMany` (possui diversas) , `Tags`.</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; &#8212;-<br />

&nbsp; &nbsp; BlogPost:<br />

&nbsp; &nbsp; &nbsp; actAs:<br />

&nbsp; &nbsp; &nbsp; &nbsp; Sluggable:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields: <span class="br0">&#91;</span>title<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; Timestampable:<br />

&nbsp; &nbsp; &nbsp; columns:<br />

&nbsp; &nbsp; &nbsp; &nbsp; title: string<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; body: clob<br />

&nbsp; &nbsp; &nbsp; &nbsp; author: string<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; &nbsp; relations:<br />

&nbsp; &nbsp; &nbsp; &nbsp; Tags:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">class</span>: Tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refClass: BlogPostTag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreignAlias: BlogPosts<br />

&nbsp; &nbsp; <br />

&nbsp; &nbsp; BlogPostTag:<br />

&nbsp; &nbsp; &nbsp; columns:<br />

&nbsp; &nbsp; &nbsp; &nbsp; blog_post_id:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: integer<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; primary: <span class="kw2">true</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; tag_id:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: integer<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; primary: <span class="kw2">true</span><br />

&nbsp; &nbsp; <br />

&nbsp; &nbsp; Tag:<br />

&nbsp; &nbsp; &nbsp; actAs: <span class="br0">&#91;</span>Timestampable<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; columns:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: string<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp;</div>

	<p>Agora que nos temos nosso schema definido, vamos criar uma massa de teste em `data/fixtures/data.yml`. Abra o arquivo, e cole o <span class="caps">YAML</span> abaixo.</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; &#8212;-<br />

&nbsp; &nbsp; BlogPost:<br />

&nbsp; &nbsp; &nbsp; BlogPost_1:<br />

&nbsp; &nbsp; &nbsp; &nbsp; title: &nbsp;symfony + Doctrine<br />

&nbsp; &nbsp; &nbsp; &nbsp; body: &nbsp; symfony and Doctrine are great!<br />

&nbsp; &nbsp; &nbsp; &nbsp; author: Jonathan H. Wage<br />

&nbsp; &nbsp; &nbsp; &nbsp; Tags: &nbsp; <span class="br0">&#91;</span>symfony, doctrine, php<span class="br0">&#93;</span><br />

&nbsp; &nbsp; <br />

&nbsp; &nbsp; Tag:<br />

&nbsp; &nbsp; &nbsp; symfony:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: symfony<br />

&nbsp; &nbsp; &nbsp; doctrine:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: doctrine<br />

&nbsp; &nbsp; &nbsp; php:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: php<br />

&nbsp; &nbsp;</div>

	<p>Ok, vamos para parte legal. Nós temos nosso schema, e temos também nossa massa, então vamos rodar uma única fez o comando do Doctrine abaixo para criar nosso banco de dados, gerar os modelos, criar as tabelas e carregar a massa de teste.</p>

    <div class="shell">$ php symfony doctrine-build-all-reload frontend</div>
    <div class="shell">>> doctrine  Are you sure you wish to drop your databases? (y/n)</div>
    <div class="shell">y</div>
    <div class="shell">>> doctrine  Successfully dropped database f&#8230;1.1Doctrine/config/doctrine.db&#8221;</div>
    <div class="shell">>> doctrine  Successfully created database f&#8230;1.1Doctrine/config/doctrine.db&#8221;</div>
    <div class="shell">>> doctrine  Generated models successfully</div>
    <div class="shell">>> doctrine  Created tables successfully</div>
    <div class="shell">>> doctrine  Data was successfully loaded</div>

	<p>
Agora nosso banco de dados SQLite `doctrine.db` foi criado, todas as tabelas do nosso schema foram criadas e populadas. Agora vamos começar a brincar com os dados e ver como nós podemos utilizar o Doctrine Query Language para trazer as informações do banco.</p>

    <div class="shell">$ php symfony doctrine:dql frontend &#8220;<span class="caps">FROM</span> BlogPost p, p.Tags t&#8221;</div>
    <div class="shell">>> doctrine  executing: &#8220;<span class="caps">FROM</span> BlogPost p, p.Tags t&#8221; ()</div>
    <div class="shell">>> doctrine  &#8211; </div>
    <div class="shell">>> doctrine    id: 1</div>
    <div class="shell">>> doctrine    title: symfony + Doctrine</div>
    <div class="shell">>> doctrine    body: symfony and Doctrine are great!</div>
    <div class="shell">>> doctrine    author: Jonathan H. Wage</div>
    <div class="shell">>> doctrine    slug: symfony-doctrine</div>
    <div class="shell">>> doctrine    created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine    updated_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine    Tags: </div>
    <div class="shell">>> doctrine      &#8211; </div>
    <div class="shell">>> doctrine        id: 1</div>
    <div class="shell">>> doctrine        name: symfony</div>
    <div class="shell">>> doctrine        created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine        updated_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine      &#8211; </div>
    <div class="shell">>> doctrine        id: 2</div>
    <div class="shell">>> doctrine        name: doctrine</div>
    <div class="shell">>> doctrine        created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine        updated_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine      &#8211; </div>
    <div class="shell">>> doctrine        id: 3</div>
    <div class="shell">>> doctrine        name: php</div>
    <div class="shell">>> doctrine        created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine        updated_at: 2008-06-16 12:28:57</div>
    </div>

	<p>Agora, vamos explicar um pouco os resultados obtidos. Como você pode ver, nos modelos nós temos as colunas created_at, updated_at and slug que não foram definidas no schema. Essas colunas são adicionadas pelo behavior anexado ao schema dentro da configuração actAs. As colunas `created_at` e `updated_at` são automaticamente atualizadas `onInsert` e `onUpdate`, e a coluna do slug é uma string criada baseada na coluna name para ser utilizada na url(url amigável). O Doctrine tem alguns behaviors que são incluídos no core como `Sluggable` e `Timestampable`, mas o sistema de behavior é feito para permitir que qualquer pessoa escreva novos behaviors para os modelos e serem reutilizados.</p>

	<p>Agora que nós temos nossa base configurada e populada, vamos fazer alguns testes utilizando o admin generator para manipular os posts e tags do blog.</p>

    <div class="shell">$ php symfony doctrine:init-admin frontend blog_posts BlogPost</div>
    <div class="shell">$ php symfony doctrine:init-admin frontend tags Tag</div>

	<p><strong>Nota</strong><br />
> Os templates do admin generator para `sfDoctrinePlugin` ainda não foram totalmente atualizados para o symfony 1.1, então vamos precisar ativar a opção `compat_10` em `apps/frontend/config/settings.yml`. Eles vão ser atualizados antes do lançamento da versão estável do symfony 1.1.</p>

	<p>Agora vamos abrir nosso browser e verificar a aplicação `frontend` e os módulos `blog_posts` e `tags`. Eles devem ser localizados numas urls parecida com essas</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; http:<span class="co1">//localhost/symfony1.1Doctrine/web/frontend_dev.php/blog_posts</span><br />

&nbsp; &nbsp; http:<span class="co1">//localhost/symfony1.1Doctrine/web/frontend_dev.php/tags</span><br />

&nbsp; &nbsp;</div>

	<p><img src='http://www.symfony-project.org/uploads/assets/doctrine/blog_posts.gif' alt='' class='alignnone' /></p>

	<p>Agora, com um pouco de configuração no admin generator do blog_post, nós podemos controlar o relacionamento entre blog_post e tags marcando checkboxes quando editando um post. Abra o arquivo `apps/frontend/modules/blog_posts/config/generator.yml` e troque o conteúdo pelo <span class="caps">YAML</span> abaixo:</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; generator:<br />

&nbsp; &nbsp; &nbsp; <span class="kw2">class</span>: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sfDoctrineAdminGenerator<br />

&nbsp; &nbsp; &nbsp; param:<br />

&nbsp; &nbsp; &nbsp; &nbsp; model_class: &nbsp; &nbsp; &nbsp;BlogPost<br />

&nbsp; &nbsp; &nbsp; &nbsp; theme: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">default</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/list"><span class="kw3">list</span></a>:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display: &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>=title, author<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object_actions:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _edit: &nbsp; &nbsp; &nbsp; &nbsp;-<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _delete: &nbsp; &nbsp; &nbsp;-<br />

&nbsp; &nbsp; &nbsp; &nbsp; edit:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display: &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>author, title, body, Tags<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; author:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; input_tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; input_tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; textarea_tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params: &nbsp; &nbsp; size=50&#215;10<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tags:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; doctrine_admin_check_list<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params: &nbsp; &nbsp; through_class=BlogPostTag<br />

<br />

&nbsp; &nbsp;</div>

	<p>Agora atualize (f5) seu browser para listar os posts do blog. Você vai ver tudo de uma maneira mais limpa. Edite um post clicando no ícone ou no título. Veja abaixo como você pode marcar as tags associadas ao post.</p>

	<p><img src='http://www.symfony-project.org/uploads/assets/doctrine/edit_blog_post.gif' alt='' class='alignnone' /></p>

	<p>99% das ferramentas que você vê funcionando no Propel, você pode ver também no Doctrine. Então, é fácil entender e aplicar. O sfDoctrinePlugin implementa todas as funcionalidades que o sfPropelPlugin e algumas mais. Nos links abaixo você pode obter mais informação sobre o que o Doctrine suporta.</p>

<ul>
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=plugins">Behaviors</a> &#8211; Easily create reusable behaviors for your Doctrine models. 
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=migration">Migrations</a> &#8211; Deploy database schema changes to your production environment through a programmatic interface.  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=dql-doctrine-query-language">Doctrine Query Language</a> &#8211; Build your database queries through a fluent OO interface  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=basic-schema-mapping#constraints-and-validators">Validators</a>  &#8211; Turn on column validators for both database and code level validation.  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=hierarchical-data">Hierarchical Data</a> &#8211; Turn your models in to nested sets easily with the flip of a switch.  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=caching">Caching</a> &#8211; Tune performance by caching your <span class="caps">DQL</span> query parsing and the result sets of queries.
</ul>

	<p>Se esse pequeno tutorial despertou seu interesse no Doctrine, você pode encontrar mais informações do Doctrine abaixo e aprender um pouco mais sobre ele:</p>

<ul>
 <li><a href="http://www.phpdoctrine.org/documentation/manual/0_11?one-page">Full User Manual</a> </li>
 <li><a href="http://www.phpdoctrine.org/documentation/api/0_11"><span class="caps">API</span> Documentation</a>           </li>
 <li><a href="http://www.phpdoctrine.org/Doctrine-Cheat-Sheet.pdf">Cheatsheet</a>       </li>      
 <li><a href="http://www.phpdoctrine.org/blog">Blog</a>  </li>
 <li><a href="http://www.phpdoctrine.org/community">Community</a>  </li>
 <li><a href="http://www.phpdoctrine.org/faq">Frequently Asked Questions</a>  </li>
 <li><a href="http://www.phpdoctrine.org/download">Download</a> </li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/15/trabalhando-com-symfony-11-e-doctrine/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
