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

<channel>
	<title>Blog do Gilberto Albino</title>
	<atom:link href="http://gilbertoalbino.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://gilbertoalbino.com</link>
	<description>Blog sobre desenvolvimento PHP, jQuery, Zend Framework e outros</description>
	<lastBuildDate>Mon, 26 Dec 2011 01:43:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<div id='fb-root'></div>
					<script type='text/javascript'>
						window.fbAsyncInit = function()
						{
							FB.init({appId: null, status: true, cookie: true, xfbml: true});
						};
						(function()
						{
							var e = document.createElement('script'); e.async = true;
							e.src = document.location.protocol + '//connect.facebook.net/pt_BR/all.js';
							document.getElementById('fb-root').appendChild(e);
						}());
					</script>	
						<item>
		<title>[ WordPress ] Como Remover Spam dos contatos</title>
		<link>http://gilbertoalbino.com/wordpress-como-remover-spam-dos-contatos/</link>
		<comments>http://gilbertoalbino.com/wordpress-como-remover-spam-dos-contatos/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 01:32:43 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Dica]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[contact form 7]]></category>
		<category><![CDATA[formulário de contato]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=970</guid>
		<description><![CDATA[Olá, pessoal. Estou com um assunto bem popular para todo mundo SPAM! Quem disser que não sofreu um ataquezinho qualquer que seja de spam está mentindo. Bom, a solução a seguir é destinada a quem utiliza o Contact Form 7. &#8230; <a href="http://gilbertoalbino.com/wordpress-como-remover-spam-dos-contatos/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá, pessoal. Estou com um assunto bem popular para todo mundo SPAM!<br />
Quem disser que não sofreu um ataquezinho qualquer que seja de spam está mentindo.</p>
<p>Bom, a solução a seguir é destinada a quem utiliza o Contact Form 7.<br />
<span id="more-970"></span><br />
Após instalado o plugin, para se criar um formulário você acessa a página através do menu &#8220;Contato&#8221; que é gerado pelo plugin e ao clicar na opção criar novo ele já gera para você o código.</p>
<p>Para evitar spams, instale o plugin &#8216;akismet&#8217;, caso você o tenha removido, pois ele vem instalado no wordpress.</p>
<p>Após instalado e ativado o Akismet, vá no site e crie uma conta gratuita para obter uma chave.</p>
<p>Acesse a página de configuração do Akismet no seu wordpress e insira a chave que foi enviada para o seu email.</p>
<p>Agora vá no Contact Form que você criou e insira as opções:</p>
<p><strong>akismet:author</strong><br />
Adicione esta opção para o campo que aceita o nome do remetente.<br />
Exemplo: [<code>text* your-name akismet:author</code>]</p>
<p><strong>akismet:author_email</strong><br />
 Adicione esta opção para o campo que aceita o email do remetente.<br />
 Exemplo: [<code>email* your-email akismet:author_email</code>]</p>
<p><strong>akismet:author_url</strong><br />
 Adicione esta opção no campo que aceita o URL do remetente.<br />
Exemplo: [<code>text your-url akismet:author_url</code>]</p>
<p>Salve e para testar, no nome do remetente coloque &#8216;viagra-test-123&#8242;.</p>
<p>Preencha todos os demais campos normalmente e envie.</p>
<p>Uma mensagem com a borda laranja vai ser exibida, isto que dizer que o plugin bloqueou o envio pois identificou como SPAM.</p>
<p>Logo, SPAM enviados automaticamente sofrerão o mesmo bloqueio.</p>
<p>É isto ai!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/wordpress-como-remover-spam-dos-contatos/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/wordpress-como-remover-spam-dos-contatos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ Tutorial ] Zend Framework &#8211; Parte 06</title>
		<link>http://gilbertoalbino.com/tutorial-zend-framework-parte-06/</link>
		<comments>http://gilbertoalbino.com/tutorial-zend-framework-parte-06/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 01:03:50 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[db-table]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[fetchrow]]></category>
		<category><![CDATA[INSERT]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[zend_db_table_abstract]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=900</guid>
		<description><![CDATA[Models, CRUD, Zend_Db_Table Sumário Na parte anterior aprendemos como criar Forms e enviar emails utilizando o Zend_Mail. Vamos agora aprender a trabalhar com banco de dados e ver o conceito de Models dentro do Zend Framework utilizando o DbTable e &#8230; <a href="http://gilbertoalbino.com/tutorial-zend-framework-parte-06/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>Models, CRUD, Zend_Db_Table </h4>
<h3>Sumário</h3>
<p>Na parte anterior aprendemos como criar Forms e enviar emails utilizando o Zend_Mail.<br />
Vamos agora aprender a trabalhar com banco de dados e ver o conceito de Models dentro do Zend Framework utilizando o DbTable e as operações básicas com o paradigma CRUD.<br />
<span id="more-900"></span></p>
<div style="border: solid 1px orange; padding: 10px; margin-bottom: 15px">
<a href="/tutorial-zend-framework" title="Todos os tutoriais Zend Framework" target="_blank">Clique aqui para ver todos os tutoriais disponíveis</a> e<br />
<a href="http://gilbertoalbino.com/downloads/tutorial-zend-parte-06.zip" target="_blank">Aqui para baixar os arquivos do projeto usados neste tutorial</a>
</div>
<h3>Models</h3>
<p>Basicamente, quando falamos de Models falamos de Banco de Dados ou uma coleção de Métodos dentro de uma Classe Model que permite agilizar processos relacionados a banco de dados.<br />
O Model é manipulado pelo Controller e os dados retornados ficam disponíveis para você utilizar em qualquer lugar de sua aplicação.<br />
Apesar de Model estar relacionado com banco de dados, na verdade, qualquer operação que modele dados pode ser considerado um model, como por exemplo, uma classe de Manipulação de Imagens.</p>
<h3>CRUD</h3>
<p>Com o sistema de Models do Zend é possível criar um sistema CRUD facilmente, pois ele possui métodos disponíveis através da classe Zend_Db_Table_Abstract. Para quem não conhece o significado de CRUD, o mesmo é um acrônimo para as quatro operações básicas em bancos de dados relacionais:</p>
<ul>
<li><strong>Create </strong>- Criar ou adicionar novas entradas</li>
<li><strong>Read </strong>(Retrived) &#8211; Ler, recuperar ou ver entradas existentes</li>
<li><strong>Update </strong>- Atualizar ou editar entradas existentes</li>
<li><strong>Delete </strong>(Destroy) &#8211; Remover entradas existentes</li>
</ul>
<h4>Criando o Model</h4>
<p>Para criar um Model basta digitar a linha de comando abaixo</p>
<pre class="brush: plain; title: ;">
zf create model NOME_DO_MODEL
</pre>
<p>Isto criará o arquivo <strong>NOME_DO_MODEL.php</strong> dentro da pasta <strong>/application/models</strong>.</p>
<p>Mas para trabalhar com bancos de Dados e utilizar a class Zend_Db_Table_Abstract é preciso adicionar o parametro &#8216;<strong>db-table</strong>&#8216; ao invés de <strong>model</strong>:</p>
<pre class="brush: plain; title: ;">
zf create db-table NOME_DO_MODEL NOME_TABElA_NO_BANCO
</pre>
<p>Isto criará uma pasta dentro de models chamada DbTable e dentro dela o arquivo NOME_DO_MODEL.php.</p>
<p>Vamos ver isto na prática criando o Model &#8220;Usuario&#8221; que vamos utilizar para criar nosso Sistema de Autenticação.</p>
<p>Digite a linha abaixo:</p>
<pre class="brush: plain; title: ;">
zf create db-table Usuario usuarios
</pre>
<p>E acesse o arquivo gerado em /application/models/DbTable/Usuario.php.<br />
Ele deve conter:</p>
<pre class="brush: php; title: ;">
class Application_Model_DbTable_Usuario extends Zend_Db_Table_Abstract
{
    protected $_name = 'usuarios';
}
</pre>
<p>Como você pode ver o ZF Tool criou uma classe <strong>Application_Model_DbTable_Usuario</strong> que é estendida de <strong>Zend_Db_Table_Abstract</strong> e dentro da classe a propriedade <strong>$_name</strong>. Esta propriedade é o nome da tabela no banco de dados que passamos na linha de comando. Você pode alterar manualmente, caso precise futuramente. E também pode chamar <strong>$this->_name</strong> dentro dos métodos para trocar de tabela caso necessário.</p>
<h3>Métodos CRUD</h3>
<p>O Zend_Db_Table_Abstract é uma interface orientada a objetos para as tabelas do banco de dados. Ela oferece métodos para muitas operações comuns em tabelas. A classe é extensível, por isto fica fácil modificar e adaptar conforme nossas necessidades.</p>
<p>Esta interface foi desenvolvida como implementação do Padrão de Projeto &#8220;Table Data Gateway&#8221; e também inclui uma classe que implementa o Padrão &#8220;Row Data Gateway&#8221;.</p>
<p>Os métodos mais comuns são:</p>
<ul>
<li>insert()</li>
<li>update()</li>
<li>delete()</li>
<li>find()</li>
<li>fetchAll()</li>
<li>fetchRow()</li>
</ul>
<p>Nós poderíamos utilizar diretamente estes métodos ou inventar moda e criar métodos do tipo:</p>
<ul>
<li>getUsuario()</li>
<li>addUsuario</li>
<li>updateUsuario</li>
<li>deleteUsuario</li>
</ul>
<p>Mas para mantermos as coisas no lugar, vamos utilizar diretamente os métodos da interface.</p>
<h3>Conexão Com o Banco de Dados</h3>
<p>Pois é! Antes de mais nada precisamos informar ao Zend como se conectar ao banco de dados.<br />
Isto é algo fácil, relativamente.<br />
Para configurar uma conexão utilizaremos o nosso arquivo de configuração <strong>application.ini</strong>.<br />
Abra o arquivo e na seção [production] insira as linhas:</p>
<pre class="brush: plain; title: ;">
[production]
resources.db.adapter = &quot;Pdo_Mysql&quot;
resources.db.params.host = &quot;localhost&quot;
resources.db.params.username = &quot;root&quot;
resources.db.params.password = &quot;&quot;
resources.db.params.dbname = &quot;tutorial-zend&quot;
resources.db.params.charset = utf8
</pre>
<p><strong>NOTA</strong> <em>Creio que não preciso dizer para você colocar as suas configurações ai!</em></p>
<p>As linhas acima são bem intuitivas, mas a mais interessante é a primeira onde informamos ao Zend que vamos utilizar o PDO. Nesta linha está o poder da abstração. Se amanhã ou depois você quiser trocar de banco de dados, basta modificar o valor de resources.db.adapter e você não precisará fazer mais nada, caso você tenha utilizado somente as interfaces do Zend para manipulação de banco de dados.</p>
<h3>Tabela de Usuários</h3>
<p>Antes de prosseguirmos com os experimentos, vamos criar a tabela que o zend irá se comunicar para realizar as operações CRUD que vamos aprender logo abaixo.</p>
<p>Eu utilizei o MySQL, mas se você tem experiencia com outro banco de dados, sinta-se à vontade para utilizar o mesmo. Apenas não modifique os nomes dos campos ainda, para que não haja incompatibilidades com os passos do tutorial.</p>
<pre class="brush: plain; title: ;">
CREATE TABLE IF NOT EXISTS `usuarios` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(120) NOT NULL,
  `login` varchar(120) NOT NULL,
  `senha` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
</pre>
<p><strong>IMPORTANTE:</strong> <em>A tabela acima é simples justamente para facilitar no aprendizado e não tomar tempo desnecessário.</em></p>
<h3>Método insert()</h3>
<p>Para inserir um novo registro utilizamos o método insert() juntamente com um array contendo os campos da tabela e os valores a serem registrados.</p>
<h4>Administração de Usuários</h4>
<p>Vamos então criar agora um controller dentro do módulo <strong>admin</strong> a fim de manipularmos os usuários de nossa aplicação.</p>
<p>Abra o Prompt de Comando do DOS ou o Terminal, acesse a pasta do projeto e digite:</p>
<pre class="brush: plain; title: ;">
zf create controller usuario 1 admin
</pre>
<p>Esta linha de comando irá gerar os arquivos do Controller e View para UsuarioController.<br />
Vale a pena notar que o nome da classe apareceu agora prefixado com &#8216;Admin_&#8217; e para acessar o nosso controller temos que utilizar &#8216;admin&#8217; ao invés de &#8216;default&#8217;.</p>
<pre class="brush: php; title: ;">
class Admin_UsuarioController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
    }
}
</pre>
<p>Você pode testar acessando: http://zend.localhost/admin/usuario. Neste caso, o action será &#8216;<strong>index</strong>&#8216; e o controller &#8216;<strong>usuario</strong>&#8216;.</p>
<p>Note que o layout carregado é o mesmo do módulo default.</p>
<p>Por ora deixe como está, mais adiante veremos como trocar de layout.</p>
<p>Feito isto, vamos informar ao zend que queremos utilizar nosso Model. Para tal, dentro do método init() do Controller Usuario, vamos criar um objeto a partir de nossa classe Model.</p>
<pre class="brush: php; title: ;">
...
    public function init()
    {
        // Não preciso explicar não eh?
        $this-&gt;_db = new Application_Model_DbTable_Usuario();
    }
...
</pre>
<p>E para testar, vamos criar um action dentro do controller Usuario do módulo Admin.</p>
<pre class="brush: plain; title: ;">
zf create action add usuario 1 admin
</pre>
<p>Creio que você já sabe o que a linha acima significa!</p>
<p>Feito isto, vamos criar o código para controlar a criação de um novo usuário.</p>
<pre class="brush: php; title: ;">
...
    public function addAction()
    {
        $dados = array(
	        'id' =&gt; null,
	        'nome' =&gt; 'Zé Ninguém',
	        'email' =&gt; 'zeninguem@teste.com',
	        'login' =&gt; 'zeninguem',
	        'senha' =&gt; md5('123456'),
        );
        $res = $this-&gt;_db-&gt;insert( $dados );
    }
...
</pre>
<p>Fácil, né? Pois é, nós criamos um array e passamos ele como valor para o método insert().<br />
Note que foi utilizado o tipo null para o campo &#8216;id&#8217;.<br />
Isto precisa ser feito assim para que o método <strong>insert()</strong> retorne o último ID inserido CASO você precise.<br />
<strong></strong><em>Como estamos utilizando uma interface, o Zend já se encarregou de fazer a conexão com o banco de dados que configuramos no arquivo de configuração. Para que a conexão aconteça, basta chamar o Model desejado. Por isto que criamos a propriedade $_db em nossa classe controladora de usuários, para deixar a conexão disponível em todo o controller.</em></p>
<p>Acesse agora a página do action que criamos para processar o código que criamos para inserir um novo usuário.</p>
<p>O URL ficou assim: <strong>http://zend.localhost/admin/usuario/add</strong></p>
<p>Verifique no banco de dados que foi inserido um registro contendo as informações passadas no vetor acima.</p>
<h3>O Método update()</h3>
<p>Se você gostaria de atualizar alguma informação, você utilizará o método <strong>update()</strong>. Este método também precisará de um array contendo os campos e valores.</p>
<p>Este método espera que você passe um ID e como estamos trabalhando com CRUD que normalmente somente atualiza um registro por vez, há uma limitação para este método, que é justamente funcionar somente para um registro por vez.<br />
Apesar de ter formas de atualizar mais de um registro utilizando o método update(), é mais interessante utilizar o método query() do Zend_Db, conforme veremos mais adiante.</p>
<p><strong>NOTA: </strong><em>Nós poderíamos utilizar um formulário de cadastro para realizar estas operações CRUD, mas vamos deixar para ver isto mais adiante na autenticação e controle de usuário, pois até lá você vai ter tempo para fuçar e descobrir coisas sozinho.</em></p>
<p>Para atualizar o nosso usuário vamos primeiro criar um novo action:</p>
<pre class="brush: plain; title: ;">
zf create action update usuario 1 admin
</pre>
<p>E no método updateAction():</p>
<pre class="brush: php; title: ;">
...
    public function updateAction()
    {
        $dados = array(
	        'nome' =&gt; 'Seu Nome Aqui',
	        'email' =&gt; 'seu@email.com',
	        'login' =&gt; 'seu_login',
	        'senha' =&gt; md5('sua_senha'),
        );

        $this-&gt;_db-&gt;update( $dados, 'id = 1' );
    }
...
</pre>
<p>Modifique as informações e abra a página: <strong>http://zend.localhost/admin/usuario/update</strong>. Verifique no banco de dados que as informações foram atualizadas!</p>
<p>Simples, né?<br />
O Método update() possui um parâmetro adicional que aceita o que seria as clausulas para filtrar a atualização. Se você não passar nada, ele exibirá uma mensagem de Erro mas fará a alteração em todas as linhas da tabela. </p>
<h3>O Método delete()</h3>
<p>Para excluir um usuário é tão fácil quando as demais operações, e o método delete() aceita um único parametro que deve conter o ID a ser excluido.</p>
<p>Crie outro usuário teste para termos outro ID além do 1 e não perdemos nosso querido usuário criado anteriormente.<br />
Feito isto, vamos criar o action para excluir este usuário.</p>
<pre class="brush: plain; title: ;">
zf create action delete usuario 1 admin
</pre>
<p>e no método deleteAction():</p>
<pre class="brush: php; title: ;">
...
    public function deleteAction()
    {
        $this-&gt;_db-&gt;delete( 'id = 2' );
    }
...
</pre>
<p>Nem vou comentar! Muito fácil de entender!</p>
<h3>O Método fetchRow()</h3>
<p>Para obter um resultado da tabela, nós utilizamos o método fetchRow() e em casos mais específicos vamos chamar o método select() que está disponível dentro de nossa classe DbTable.</p>
<p>Para listar um usuário, vamos criar um action:</p>
<pre class="brush: plain; title: ;">
zf create action list usuario 1 admin
</pre>
<p>E no método listAction():</p>
<pre class="brush: php; title: ;">
...
    public function listAction()
    {
        $usuario = $this-&gt;_db-&gt;fetchRow( 'id = 1' );
        $this-&gt;view-&gt;usuario = $usuario;
    }
...
</pre>
<p>Basicamente, o resultado foi passado para a variável $usuario que vamos passar para o nosso View usuario a fim de recuperar as informações no arquivo view script list.phtml.</p>
<p>Abra o arquivo <strong>/modules/admin/views/scripts/usuario/list.phtml</strong> e insira o código abaixo:</p>
<pre class="brush: php; title: ;">
&lt;h2&gt;Informações do Usuário&lt;/h2&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;th&gt;Nome&lt;/th&gt;
		&lt;td&gt;&lt;?= $this-&gt;usuario-&gt;nome; ?&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Login&lt;/th&gt;
		&lt;td&gt;&lt;?= $this-&gt;usuario-&gt;login; ?&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;E-mail&lt;/th&gt;
		&lt;td&gt;&lt;?= $this-&gt;usuario-&gt;email; ?&gt;
	&lt;/tr&gt;
&lt;/table&gt;
</pre>
<p>Acesse a página http://zend.localhost/admin/usuario/list e você verá as informações do usuário com ID 1 listadas na tela.</p>
<p><strong>NOTA: </strong><em>O método fetchRow() retorna um objeto. Se você desejar utilizar um array, faça a modelagem adicionando toArray(), conforme abaixo:</em></p>
<pre class="brush: php; title: ;">
...
$usuario = $this-&gt;_db-&gt;fetchRow( 'id = 1')-&gt;toArray();
...
</pre>
<h3>Conclusão</h3>
<p>Nesta parte de nosso tutorial você conhece o Zend_Db_Table_Abstract e aprendeu a trabalhar com banco de dados e a criar Models através do ZF Tool. Também aprendeu como realizar as operações básicas de um CRUD.<br />
Nas proximas partes vamos ver como criar um sistema de autenticação e conhecer outros métodos de manipulação de banco de dados.<br />
É isto aí! Abraços do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/tutorial-zend-framework-parte-06/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/tutorial-zend-framework-parte-06/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>[ WordPress ] Adicionar suporte a sidebar em posts e pages no Twenty Eleven</title>
		<link>http://gilbertoalbino.com/wordpress-adicionar-suporte-a-sidebar-em-posts-e-pages/</link>
		<comments>http://gilbertoalbino.com/wordpress-adicionar-suporte-a-sidebar-em-posts-e-pages/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 23:20:43 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Dica]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[get_footer]]></category>
		<category><![CDATA[get_sidebar]]></category>
		<category><![CDATA[sidebar]]></category>
		<category><![CDATA[suporte]]></category>
		<category><![CDATA[twenty eleven]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=909</guid>
		<description><![CDATA[Estava brincando aqui como Twenty Eleven, pois ate o presente momento somente utiliza o Twenty Ten, e deparei-me com algo interessante. Quando eu acessei o post a barra lateral não apareceu e o mesmo com as páginas. Logo fui verificar &#8230; <a href="http://gilbertoalbino.com/wordpress-adicionar-suporte-a-sidebar-em-posts-e-pages/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estava brincando aqui como Twenty Eleven, pois ate o presente momento somente utiliza o Twenty Ten, e deparei-me com algo interessante. Quando eu acessei o post a barra lateral não apareceu e o mesmo com as páginas.<br />
Logo fui verificar os arquivos e descobri de cara o que estava acontecendo com este maledito.<br />
<span id="more-909"></span><br />
Removeram a chamada à função get_sidebar().<br />
Bom para resolver isto é facil.<br />
Basta abrir os arquivos single.php e page.php e inserir a linha de codigo:</p>
<pre class="brush: php; title: ;">
&lt;?php get_sidebar(); ?&gt;
</pre>
<p>Logo acima de get_footer():</p>
<pre class="brush: php; title: ;">
&lt;?php get_sidebar(); ?&gt;
&lt;?php get_footer(); ?&gt;
</pre>
<p>Até ai tudo bem. Agora se você for acessar o post ou página. Vai ver que o CSS tá todo quebrado na página.</p>
<p>Bom, ai isto são outros quinhentos. ( risos )</p>
<p>Abraço do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/wordpress-adicionar-suporte-a-sidebar-em-posts-e-pages/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/wordpress-adicionar-suporte-a-sidebar-em-posts-e-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ Tutorial ] Zend Framework &#8211; Parte 05</title>
		<link>http://gilbertoalbino.com/tutorial-zend-framework-parte-05/</link>
		<comments>http://gilbertoalbino.com/tutorial-zend-framework-parte-05/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 19:22:44 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[formularios]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[validação]]></category>
		<category><![CDATA[zend_mail]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=864</guid>
		<description><![CDATA[Formulários, Zend_Mail Sumário Na parte anterior vimos o Objeto Request e aprender como trabalhar com parametros do URL e fazer redirecionamentos baseados em parametros e fizemos uma revisita no Layout e Views. Vamos aprender agora como criar Forms e enviar &#8230; <a href="http://gilbertoalbino.com/tutorial-zend-framework-parte-05/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>Formulários, Zend_Mail</h4>
<h3>Sumário</h3>
<p>Na parte anterior vimos o Objeto Request e aprender como trabalhar com parametros do URL e fazer redirecionamentos baseados em parametros e fizemos uma revisita no Layout e Views. Vamos aprender agora como criar Forms e enviar emails utilizando o Zend_Mail.<br />
<span id="more-864"></span></p>
<div style="border: solid 1px orange; padding: 10px; margin-bottom: 15px">
<a href="/tutorial-zend-framework" title="Todos os tutoriais Zend Framework" target="_blank">Clique aqui para ver todos os tutoriais disponíveis</a> e<br />
<a href="http://gilbertoalbino.com/downloads/tutorial-zend-parte-05.zip" target="_blank">Aqui para baixar os arquivos do projeto usados neste tutorial</a>
</div>
<h3>Formulários</h3>
<p>Criar formulários com o Zend é relativamente muito fácil.<br />
Você deve estar se questionando o que este assunto tem de importante, pois você melhor do que ninguém sabe como criar formulários em HTML e PHP, ou atém mesmo utiliza alguma classe que gera formulários para você.<br />
Bom, este tema é muito importante em todos os casos, pois além de gerar os formulários você pode integrar os formulários gerados pelo Zend de diversas formas e realizar validações, filtragens de dados, autenticação tudo de uma forma natural sem sobrecarregar a aplicação</p>
<h4>Criando Formulários com o Zend Framework</h4>
<p>Para entender, nada melhor que colocar a mão na massa.<br />
Então vamos lá. Abra o seu prompt de comando ou terminal e acesse a pasta de nosso projeto.</p>
<p>Digite o comando:</p>
<pre class="brush: plain; title: ;">
zf create form contato
</pre>
<p>A linha de comando acima irá criar um arquivo chamado Contato.php contendo uma classe Application_Form_Contato dentro da pasta <strong>/application/forms/</strong></p>
<p><strong>IMPORTANTE: </strong><em>É possível trabalhar com formulários distintos por módulos. Entretanto, como o mesmo envolve muitas configurações, e possui alguns &#8216;bugs&#8217;, vamos criar o formulário da maneira mais simples.</em></p>
<p>O arquivo gerado pelo ZF Tool contem o nome da classe que é extendida de Zend_Form e o método init() que tem a mesma finalidade vista para os Controllers.</p>
<p><em>/application/forms/Contato.php</em></p>
<pre class="brush: php; title: ;">
&lt;?php

class Application_Form_Contato extends Zend_Form
{

    public function init()
    {
        /* Form Elements &amp; Other Definitions Here ... */
    }

}
</pre>
<p>Para testar o formulário gerado pelo ZF Tool, abra o arquivo IndexController.php do módulo default.<br />
Vamos criar um view que disponibilizará o formulário no nosso arquivo script <strong>views/scripts/index/contato.phtml</strong> do módulo default.</p>
<p>Para chamar o objeto instanciamos desta forma no controlador:</p>
<p><em>/application/modules/default/controllers/IndexController.php</em></p>
<pre class="brush: php; title: ;">
...
public function contatoAction
{
    $form = new Application_Form_Contato();
    $this-&gt;view-&gt;form = $form;
}
...
</pre>
<p>e no arquivo view <strong>contato.phtml</strong> coloque em qualquer lugar a sentença:</p>
<pre class="brush: php; title: ;">
&lt;?= $this-&gt;form; ?&gt;
</pre>
<p><strong>IMPORTANTE:</strong><em>Na parte 03 eu não coloquei a rota para a página &#8216;contato&#8217; no arquivo de configuração. Se você está seguindo este tutorial a risca e for testar agora, vai receber um erro, então logo abaixo das linhas onde configuramos as rotas, insira as linhas:</em></p>
<pre class="brush: plain; title: ;">
resources.router.routes.contato.route = /contato
resources.router.routes.contato.defaults.module = default
resources.router.routes.contato.defaults.controller = index
resources.router.routes.contato.defaults.action = contato
</pre>
<p>Agora abra a página http://zend.localhost/contato e você não verá nada ( risos ).<br />
Claro! Não criamos nenhum elemento ainda.<br />
Mas para fins de curiosidade, veja o código-fonte.<br />
Repare que o Zend criou a tag FORM com alguns atributos mais uma tag DL:</p>
<pre class="brush: php; title: ;">
&lt;form enctype=&quot;application/x-www-form-urlencoded&quot; action=&quot;&quot; method=&quot;post&quot;&gt;&lt;dl class=&quot;zend_form&quot;&gt;
&lt;/dl&gt;&lt;/form&gt;
</pre>
<h3>Formulário de Contato</h3>
<p>Vamos então definir atributos para nosso formulário e adicionar elementos.<br />
Como o objetivo deste tutorial é ser didático, vamos criar um formulário contendo um exemplo dos elementos HTML que  mais utilizamos em formulários.</p>
<ul>
<li><strong>radio </strong>[tratamento]</li>
<li><strong>input </strong>[nome, email]</li>
<li><strong>select </strong>[assunto]</li>
<li><strong>textarea </strong>[mensagem]</li>
<li><strong>checkbox </strong>[newsletter]</li>
<li><strong>submit </strong>[enviar]</li>
</ul>
<p>Para criar os elementos do formulário, é claro, teremos que digitar (risos).</p>
<h4>Atributos da tag FORM</h4>
<p>Antes de criamos os elementos, precisamos definir os atributos do formulário em si, tais como:</p>
<ul>
<li><strong>method</strong></li>
<li><strong>action</strong></li>
<li><strong>name</strong></li>
<li><strong>id</strong></li>
<li><strong>enctype </strong>- embora não vamos fazer uploads e podemos utilizar o gerado pelo Zend, vou deixar a dica</li>
</ul>
<p>Vou deixar os comentários dentro do código abaixo para não saturar o texto do tutorial, então analise o código abaixo.</p>
<pre class="brush: php; title: ;">
&lt;?php
class Default_Form_Contato extends Zend_Form
{
    public function init()
    {

        /*******************************************
         * As definições abaixo são obrigatórias
         * todo formulário deve conter
         *******************************************/
        /**
         * Vai gerar o atributo/valor name=&quot;contato&quot;
         */
        $this-&gt;setName( 'contato' );
        /**
         * Vai gerar o atributo/valor action=&quot;/contato&quot;
         */
        $this-&gt;setAction( '/contato' );
        /**
         * Vai gerar o atributo/valor method=&quot;post&quot;
         */
        $this-&gt;setMethod( 'post' );

        /**********************************************
         * As definições abaixo são opcionais
         * e dependem de peculiaridades de seu FORM
         *********************************************/
        $this-&gt;setAttrib('enctype', 'multipart/form-data');
        /**
         * Vai gerar o atributo/valor id=&quot;form-contato&quot;
         */
        $this-&gt;setAttribute( 'id', 'form-contato' );
    }
}
</pre>
<p><strong>NOTA:</strong> Como você deve ter notado todas as definições foram feitas dentro do método init().</p>
<p>Vamos criar os elementos agora. Analise o código abaixo, creio que ele seja bem intuitivo em relação ao qual campo do formulário estamos criando:</p>
<pre class="brush: php; title: ;">
class Application_Form_Contato extends Zend_Form
{
    public function init()
    {
        /**
         * Definições para o FORM
         */
        $this-&gt;setName( 'contato' );
        $this-&gt;setAction( '/contato' );
        $this-&gt;setMethod( 'post' );
        $this-&gt;setAttrib( 'enctype', 'multipart/form-data' );
        $this-&gt;setAttrib( 'id', 'form-contato' );

        /**
         * Elementos do formulário
         */
        $tratamento = new Zend_Form_Element_Radio('tratamento');
        $tratamento-&gt;setLabel('Como gostaria de ser atendido?')
            -&gt;addMultiOptions(
                array(
                    'Você' =&gt; 'Você',
                    'Sr(a).' =&gt; 'Sr(a)',
                    'Pelo Nome' =&gt; 'Pelo Nome',
                )
            )
            -&gt;setValue('Pelo Nome');   

        $nome = new Zend_Form_Element_Text( 'nome' );
        $nome-&gt;setLabel( 'Nome' );

        $email = new Zend_Form_Element_Text( 'email' );
        $email-&gt;setLabel( 'E-mail' );

        $assunto = new Zend_Form_Element_Select( 'assunto' );
        $assunto-&gt;setLabel('Assunto')
            -&gt;addMultiOptions(
                array(
                    '' =&gt; ' - - Escolha um assunto - - ', // em branco
                    'Dúvidas' =&gt; 'Dúvidas',
                    'Elogios' =&gt; 'Elogios',
                    'Reclamações' =&gt; 'Reclamações',
                    'Outros' =&gt; 'Outros',
                )
            );

        $mensagem = new Zend_Form_Element_Textarea( 'mensagem' );
        $mensagem-&gt;setLabel( 'Mensagem' );

        $newsletter = new Zend_Form_Element_MultiCheckbox( 'newsletter' );
        $newsletter-&gt;setLabel('Gostaria de Assinar Nosso Newsletter?')
            -&gt;addMultiOptions(
                array(
                    'Tecnologia' =&gt; 'Tecnologia',
                    'Entretenimento' =&gt; 'Entretenimentos',
                    'Curiosidades' =&gt; 'Curiosidades',
                    'Produtos' =&gt; 'Produtos',
                    'Nenhum' =&gt; 'Não quero receber'
                )
            )
            -&gt;setValue( 'Nenhum' );

        $submit = new Zend_Form_Element_Submit( 'submit' );
        $submit-&gt;setLabel( 'Enviar' );
        $this-&gt;addElements(
            array(
                $tratamento,
                $nome,
                $email,
                $assunto,
                $mensagem,
                $newsletter,
                $submit
            )
        );

    }
}
</pre>
<p>Salve o arquivo e abra novamente a página de contato. Veja que o formulário apareceu.</p>
<h3>Entendendo o código</h3>
<p>Como você pode ter notado, para cada elemento existe uma classe correspondente que chamamos através de</p>
<pre class="brush: php; title: ;">
$nome_do_elemento = new Zend_Form_Element_&lt;TIPO_DO_ELEMENTO&gt;( VALOR_DO_ATRIB_NAME );
</pre>
<p>O protótipo acima deixa bem claro o que cada coisa significa.<br />
Para cada elemento existem disponíveis vários métodos.<br />
Em todos elementos utilizamos <strong>setLabel()</strong> que define o texto que o usuário verá na tela a fim de identificar o campo em questão.<br />
<strong>[IMPORTANTE]</strong><em>Para elementos do tipo Submit e Button, o <strong>setLabel()</strong> funciona como o atributo value do elemento, como é o caso do botão Enviar que não possui Label, mas utilizamos <strong>setLabel(&#8216;Enviar&#8217;)</strong>.</em></p>
<p>No caso de campos como Radio, Checkbox e Select utilizamos o método <strong>addMultiOptions()</strong> para definir os valores desejados. Este método espera que um array seja passado contendo CHAVE => VALOR, conforme definimos para os campos <strong>tratamento|assunto|newsletter</strong>.</p>
<p>Para os elementos que precisam de um valor default quando o formulário é carregado, utilizamos <strong>setValue( VALOR )</strong>. Quando utilizado em elementos que o valor é parte de um addMultiOptions(), ele é sensível ao caso, ou seja você precisa passar EXATAMENTE o mesmo valor da chave, veja o caso do campo tratamento. Se colocassemos &#8216;<strong>pelo nome</strong>&#8216; ao invés de &#8216;<strong>Pelo Nome</strong>&#8216;, ele não definiria nada. Ele funciona como <strong>checked </strong>para checkboxes e radios e <strong>selected </strong>para selects. Para outros campos de valor único funciona como value=&#8221;ALGUM VALOR&#8221;.</p>
<p>E por fim, temos o método <strong>addElements()</strong> do Zend_Form, que vai esperar um array contendo os objetos criados para cada elemento(campo) de nosso formulário. Os valores passados são as próximas variáveis, já que elas são os objetos.</p>
<p><strong>CURIOSIDADE</strong> Abra o código-fonte da página contado e veja que o Zend adicionou algumas Marcações HTML utilizando listas de definição.</p>
<h4>Outros elementos</h4>
<p>Além dos elementos que criamos em nosso formulário, também estão disponíveis criar elementos:</p>
<ul>
<li><strong>button</strong></li>
<li><strong>reset</strong></li>
<li><strong>password</strong></li>
<li><strong>hidden</strong></li>
<li><strong>image</strong></li>
<li><strong>captcha</strong> [captcha] &#8211; apesar de não ser um elemento, atualmente utiliza-se muito e é algo bem elaborado no Zend</li>
</ul>
<h4>Qual a Vantagem de se criar Formulários com o Zend</h4>
<p>No momento você pode estar pensando nisto, entretanto, apenas criamos o formulário.<br />
Vamos ver agora como aplicar validação e filtros para entender o poder de se criar formulários com o Zend.</p>
<h3>Validando o Formulário</h3>
<p>Supondo que os campos nome|email|assunto|mensagem são obrigatórios e que os usuários poderiam passar código malicioso aos nossos códigos ou banco de dados através de nosso formulário, é interessante aplicar filtros e no caso de algum campo não ser enviado em branco, vamos informar que estes campos são obrigatórios.</p>
<p>Modifique o código:</p>
<pre class="brush: php; title: ;">
...
        $nome = new Zend_Form_Element_Text( 'nome' );
        $nome-&gt;setLabel( 'Nome' )
            -&gt;setRequired( true )
            -&gt;addValidator( 'NotEmpty' )
            -&gt;addFilter( 'StripTags' )
            -&gt;addFilter( 'StringTrim' )
            -&gt;addErrorMessage('Informe o seu nome');

        $email = new Zend_Form_Element_Text( 'email' );
        $email-&gt;setLabel( 'E-mail' )
            -&gt;setRequired( true )
            -&gt;addValidator( 'NotEmpty' )
            -&gt;addFilter( 'StripTags' )
            -&gt;addFilter( 'StringTrim' )
            -&gt;addErrorMessage('Informe o seu email');                

        $assunto = new Zend_Form_Element_Select( 'assunto' );
        $assunto-&gt;setLabel('Assunto')
            -&gt;addMultiOptions(
                array(
                    '' =&gt; ' - - Escolha um assunto - - ', // em branco
                    'Dúvidas' =&gt; 'Dúvidas',
                    'Elogios' =&gt; 'Elogios',
                    'Reclamações' =&gt; 'Reclamações',
                    'Outros' =&gt; 'Outros',
                )
            )
            -&gt;setRequired( true )
            -&gt;addErrorMessage('Escolha o assunto');

        $mensagem = new Zend_Form_Element_Textarea( 'mensagem' );
        $mensagem-&gt;setLabel( 'Mensagem' )
            -&gt;setRequired( true )
            -&gt;addValidator( 'NotEmpty' )
            -&gt;addFilter( 'StripTags' )
            -&gt;addFilter( 'StringTrim' )
            -&gt;addErrorMessage('Escreva uma mensagem');
...
</pre>
<p>Se você executar o código agora, não vai acontecer nada!</p>
<p>Antes de fazer a coisa funcionar vamos explicar as linhas adicionadas aos elementos nome|email|assunto|mensagem.</p>
<p>Preste atenção nos comentários:</p>
<pre class="brush: php; title: ;">
        $nome = new Zend_Form_Element_Text( 'nome' );
        $nome-&gt;setLabel( 'Nome' )
            // Marca o campo como obrigatório
            -&gt;setRequired( true )
            // Não pode estar vazio
            -&gt;addValidator( 'NotEmpty' )
            // Remove TAGS HTML
            -&gt;addFilter( 'StripTags' )
            // Remove espaços brancos no inicio e fim
            -&gt;addFilter( 'StringTrim' )
            // Define uma mensagem de erro personalizada
            -&gt;addErrorMessage('Informe o seu nome');
</pre>
<p>Existem vários validadores e filtros entre os mais usados são os que você viu acima, mas ainda existem vários outros disponíveis. </p>
<p>No caso do email, além dos que utilizamos para os outros campos, utilizamos:</p>
<pre class="brush: php; title: ;">
addValidator('EmailAddress', true);
</pre>
<h4>Obtendo os dados enviados</h4>
<p>Para que a validação ocorra de verdade é preciso que o Zend envie o formulário e faça algumas verificações. Caso ele identifique o valor de um dos elementos não corresponde com a validação solicitada, ele volta para a página do formulário e popula novamente o mesmo com os dados.</p>
<p>Para fazer isto, abra o arquivo IndexController.php e dentro do método contatoAction() insira o código abaixo:</p>
<pre class="brush: php; title: ;">
...
    public function contatoAction()
    {

        $form = new Application_Form_Contato();
        $this-&gt;view-&gt;form = $form;

        $dadosFormulario = $this-&gt;getRequest()-&gt;getPost();

        if( $this-&gt;getRequest()-&gt;isPost() ) {

            if( $form-&gt;isValid( $dadosFormulario ) ) {
            } else {
                $form-&gt;populate( $dadosFormulario );
            }
        }
    }
...
</pre>
<h4>Entendendo o Código &#8211; Solicitação POST</h4>
<p>Tem bastante informação nova disponível agora, mas creio ser fácil de entender. Todo o código gira em torno de uma solicitação POST. Ao invés de utilizar $_POST o Zend oferece métodos exclusivos para tal.</p>
<p>Para obter os dados do Formulário utilizamos o Objeto Request que já conhecemos junto com o método <strong>getPost()</strong>.</p>
<p>Este método pega a solicitação POST realizada e guarda todos os valores passados pelo formulário.</p>
<p>Isto é feito na linha:</p>
<pre class="brush: php; title: ;">
$dadosFormulario = $this-&gt;getRequest()-&gt;getPost();
</pre>
<p>Para verificar se uma solicitação POST foi realizada o Objeto Request utiliza o método <strong>isPost()</strong>.</p>
<p>Na estrutura de controle onde verificamos se há uma solicitação POST há uma condição que verifica se os dados do formulário correspondem com o que solicitamos ao Zend validar. Isto é feito através do método <strong>isValid()</strong>.</p>
<p>1 &#8211; Se isValid() for verdadeiro, não acontece nada<br />
2 &#8211; Se for falso popula o formulário novamente incluindo as mensagens de erros passadas pela validação.</p>
<pre class="brush: php; title: ;">
...
        if( $this-&gt;getRequest()-&gt;isPost() ) {

            if( $form-&gt;isValid( $dadosFormulario ) ) {
            } else {
                $form-&gt;populate( $dadosFormulario );
            }
        }
...
</pre>
<p>Tente enviar o formulário vazio e veja o resultado.<br />
As mensagens de erro apareceram logo abaixo do campo solicitado validação.</p>
<p>Agora se você preencher corretamente os dados ele vai mostrar o formulário com todos os dados carregados novamente.<br />
Como boa prática de programação web, sempre que você enviar um formulário e os dados estiverem preenchidos corretamente, você deve redirecionar o usuário para outra página com alguma mensagem ou para a mesma página.<br />
Podemos redirecionar o usuário para outra página ou para a mesma utilizando:</p>
<pre class="brush: php; title: ;">
 if( $form-&gt;isValid( $dadosFormulario ) ) {
     $this-&gt;_redirect( '/contato' );
     // ou
     // $this-&gt;_redirect( '/qualquer-pagina-com-mensagem' );
 } 
</pre>
<p>Seria interessante se fossemos notificados do contato ou salvássemos os dados no banco de Dados.<br />
Como este tutorial se estendeu demais sobre o assunto, vou terminar por aqui e vou pular para a parte de envio de emails com Zend_mail, deixando ai como dica e curiosidade para os mais &#8216;metidos&#8217; e ensinar como criar Models na próxima parte.</p>
<h3>Conclusão</h3>
<p>Nesta parte de nosso tutorial você aprendeu a criar Forms e enviar email utilizando o Zend_Mail.<br />
Na próxima parte de nosso tutorial vamos aprender como criar criar um sistema de autenticação utilizando Zend_Auth.</p>
<h3>BONUS E-Mails com Zend_mail</h3>
<p><strong style="color:red">IMPORTANTE</strong><em>Este procedimento somente é disponível em servidores locais configurados para enviar emails ou em servidores remotos. Você não conseguirá enviar email do localhost.<br />
Então se você dispõe de um servidor dedicado, VPS, cloud, revenda, hospedagem, etc&#8230; Crie um subdominio no seu site chamado &#8220;zend&#8221; e envie os arquivos por FTP e faça o teste abaixo.</em></p>
<p>O Zend Dispõe de uma ferramenta muito legal para envio de Emails.<br />
Ainda com o arquivo IndexController aberto no método contatoAction(), adicione as linhas abaixo:</p>
<pre class="brush: php; title: ;">
...
    public function contatoAction()
    {

        $form = new Application_Form_Contato();
        $this-&gt;view-&gt;form = $form;

        $dadosFormulario = $this-&gt;getRequest()-&gt;getPost();

        if( $this-&gt;getRequest()-&gt;isPost() ) {

            if( $form-&gt;isValid( $dadosFormulario ) ) {  

                $tratamento = $form-&gt;getValue('tratamento');
                $nome = $form-&gt;getValue('nome');
                $email = $form-&gt;getValue('email');
                $assunto = $form-&gt;getValue('assunto');
                $mensagem = $form-&gt;getValue('mensagem');
                $newsletter = $form-&gt;getValue('newsletter');

                $conteudo = sprintf('
                        Assunto: &lt;STRONG&gt;%s&lt;/STRONG&gt;&lt;BR&gt;
                        &lt;HR&gt;
                        Tratamento: &lt;STRONG&gt;%s&lt;/STRONG&gt;&lt;BR&gt;
                        Nome: &lt;STRONG&gt;%s&lt;/STRONG&gt;&lt;BR&gt;
                        E-mail: &lt;STRONG&gt;%s&lt;/STRONG&gt;&lt;BR&gt;
                        Mensagem: &lt;STRONG&gt;%s&lt;/STRONG&gt;&lt;BR&gt;
                        Newsletter: &lt;STRONG&gt;%s&lt;/STRONG&gt;&lt;BR&gt;
                    '
                    , $assunto
                    , $tratamento
                    , $nome
                    , $email
                    , nl2br( $mensagem )
                    , implode(', ', $newsletter )
                );

                $to = 'contato@seusite.com';

                $subject = utf8_decode( &quot;Contato pelo site por: &quot; . $nome );
                $html = &quot;
                    &lt;html&gt;
                    &lt;body&gt;
                        &quot;.$conteudo.&quot;
                    &lt;/body&gt;
                    &lt;/html&gt;
                &quot;;

                $mail = new Zend_Mail('utf-8');
                $mail-&gt;setBodyHtml( $html );
                // poderia ser somente texto
                //$mail-&gt;setBodyText( $text );
                $mail-&gt;setFrom( $email, $nome );
                $mail-&gt;addTo( $to, 'Contato Site');
                $mail-&gt;setSubject( $subject );
                $mail-&gt;send();

                $this-&gt;_redirect( '/contato' );
                // ou
                // $this-&gt;_redirect( '/qualquer-pagina-com-mensagem' );
            } else {
                $form-&gt;populate( $dadosFormulario );
            }
        }

    }
...
</pre>
<p>Creio que o código acima é bem intuitivo.<br />
Abraços do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/tutorial-zend-framework-parte-05/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/tutorial-zend-framework-parte-05/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>[ Tutorial ] Zend Framework &#8211; Parte 04</title>
		<link>http://gilbertoalbino.com/tutorial-zend-framework-parte-04/</link>
		<comments>http://gilbertoalbino.com/tutorial-zend-framework-parte-04/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 21:26:14 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[application.ini]]></category>
		<category><![CDATA[getParam]]></category>
		<category><![CDATA[getRequest]]></category>
		<category><![CDATA[router]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=842</guid>
		<description><![CDATA[getRequest, getParam, Routes, Views Sumário No a parte anterior de nosso tutorial vimos como criar Rotas, Layouts e aprendemos sobre Views. Vamos conhecer agora o Objeto Request e aprender como trabalhar com parametros do URL e fazer redirecionamentos baseados em &#8230; <a href="http://gilbertoalbino.com/tutorial-zend-framework-parte-04/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>getRequest, getParam, Routes, Views</h4>
<h3>Sumário</h3>
<p>No a parte anterior de nosso tutorial vimos como criar Rotas, Layouts e aprendemos sobre Views.<br />
Vamos conhecer agora o Objeto Request e aprender como trabalhar com parametros do URL e fazer redirecionamentos baseados em parametros e rever o Layout e Views.<br />
<span id="more-842"></span></p>
<div style="border: solid 1px orange; padding: 10px; margin-bottom: 15px">
<a href="/tutorial-zend-framework" title="Todos os tutoriais Zend Framework" target="_blank">Clique aqui para ver todos os tutoriais disponíveis</a>
</div>
<h3>Objeto Request</h3>
<p>Antes de prosseguirmos, vamos analisar brevemente um dos objetos mais utilizados pelo Zend, o <strong>Request</strong>.<br />
Este objeto é um objeto de solicitação muito simples que é passado entre as classes de roteamento, dispatchers e controladoras. Ele empacota os nomes dos modules, controllers, actions e parametros opcionais, assim como o resto das solicitações do ambiente, quer seja HTTP, que é o que nos interessa, e para os mais avançados e curiosos, CLI ou PHP-GTK.</p>
<p>O objeto é passado através de Zend_Controller_Front e está disponível em toda aplicação através da chamada $this->getRequest() e pode ser usado da seguinte forma dentro de nossa aplicação:</p>
<pre class="brush: php; title: ;">
// Como citado anteriormente, o método init é o melhor lugar
// para guardarmos configurações e outras variáveis globais
// aos nossos actions dentro de um controller
// por isto vamos testar nosso controller aqui
public function init()
{
    $this-&gt;request = $this-&gt;getRequest();
}
</pre>
<p>A partir desta declaração podemos então acessar vários recursos, tais como Nome do Module, Nome do Controller, Nome do Action e obter os Parametros a partir do URL</p>
<p>Vamos testar algumas funcionalidades básicas e já aproveitar para relembrar o Views:</p>
<pre class="brush: php; title: ;">
public function init()
{
    $this-&gt;request = $this-&gt;getRequest();

    // passamos alguns valores para o view
    $this-&gt;view-&gt;module = $this-&gt;request-&gt;getModuleName();
    $this-&gt;view-&gt;controller = $this-&gt;request-&gt;getControllerName();
    $this-&gt;view-&gt;action = $this-&gt;request-&gt;getActionName();
}
</pre>
<p>Abra o arquivo <strong>/modules/default/view/scripts/<span style="color:red">index.phtml</span></strong> e adicione as linhas:</p>
<pre class="brush: php; title: ;">
...
&lt;h2&gt;Teste de Objeto Request&lt;/h2&gt;
&lt;strong&gt;Modulo: &lt;/strong&gt; &lt;?= $this-&gt;module; ?&gt;
&lt;br /&gt;
&lt;strong&gt;Controller: &lt;/strong&gt; &lt;?= $this-&gt;controller; ?&gt;
&lt;br /&gt;
&lt;strong&gt;Action: &lt;/strong&gt; &lt;?= $this-&gt;action; ?&gt;
</pre>
<p>Acesse o url do projeto e veja que apareceram as informações que o Objeto Request definiu no View de nossa Aplicação.<br />
Agora você começa a entender melhor o funcionamento do VC do M<strong>VC</strong>.<br />
O que aconteceu aqui foi uma lógica de negócio processada pelo Controller e passada ao View no arquivo de apresentação.</p>
<p>E para verificar que o método init() está disponível em todos actions de sua aplicação faça o mesmo com o action servicos.</p>
<p>Abra o arquivo <strong>/modules/default/view/scripts/<span style="color:red">servicos.phtml</span></strong> e adicione as linhas:</p>
<pre class="brush: php; title: ;">
...
&lt;h2&gt;Teste de Objeto Request&lt;/h2&gt;
&lt;strong&gt;Modulo: &lt;/strong&gt; &lt;?= $this-&gt;module; ?&gt;
&lt;br /&gt;
&lt;strong&gt;Controller: &lt;/strong&gt; &lt;?= $this-&gt;controller; ?&gt;
&lt;br /&gt;
&lt;strong&gt;Action: &lt;/strong&gt; &lt;?= $this-&gt;action; ?&gt;
</pre>
<p>Acesso o url do action http://zend.localhost/servicos<br />
Como você pode ver, os valores passados no método init() para o View permaneceram disponíveis e somente houve uma alteração no valor de action, pois o module e o controller continuam os mesmos.</p>
<h3>Obtendo Parâmetros do URL</h3>
<p>Como estamos utilizando MVC seria interessante obtermos valores diretamente do URL para operações básicas.<br />
Vamos fazer uma simulação aqui.<br />
Suponhamos que você tenha produtos na página produto que gostaria de acessar pelo ID, que tradicionalmente seria algo do tipo:</p>
<p><strong>http://zend.localhost/produtos?id=1</strong></p>
<p>No nosso caso, para algo mais interessante, queremos aproveitar a deixa dos famosos URL&#8217;s limpos e MVC, então gostaríamos de algo assim:</p>
<p><strong>http://zend.localhost/produtos/id/1</strong></p>
<p>Para fazer isto basta construir o URL deste tipo e obter os parâmetros através do objeto Request pelo método getParam(CHAVE).</p>
<p>Como já vimos anteriormente, o zend entende o URL da seguinte maneira:</p>
<p>URL/MODULE/CONTROLLER/ACTION/PARAMETRO1/VALOR1/PARAMETRO2/VALOR2/etc&#8230;</p>
<p>Então, no URL <strong>http://zend.localhost/produtos/id/1</strong> ID é um parametro com a chave &#8216;id&#8217;.</p>
<p>Vamos utilizar o action produtos para tal simulação e, como não estamos trabalhando com banco de dados ainda, vamos criar um vetor simples contendo alguns produtos:</p>
<pre class="brush: php; title: ;">

public function produtosAction()
{
    $produtos = array(
	1 =&gt; array(
            'nome' =&gt; 'TV',
	    'descricao' =&gt; 'Descrição da TV aqui'
	),
	2 =&gt; array(
	    'nome' =&gt; 'Celular',
	    'descricao' =&gt; 'Descrição do Celular aqui'
	),
	3 =&gt; array(
	    'nome' =&gt; 'Notebook',
	    'descricao' =&gt; 'Descrição do Notebook aqui'
	),
	4 =&gt; array(
	    'nome' =&gt; 'Aparelho de Som',
	    'descricao' =&gt; 'Descrição do Aparelho de Som aqui'
	),
    );

    $id = $this-&gt;request-&gt;getParam( 'id' );

    if( $id != false ) :
    // vamos definir os valore encontrados nas chaves do vetor
    // e passar os mesmos para o View a fim de obter
    // estes valores no arquivo produtos.phtml
    $this-&gt;view-&gt;nome = $produtos[$id]['nome'];
    $this-&gt;view-&gt;descricao = $produtos[$id]['descricao'];
    endif;

}
</pre>
<p>Abra o aquivo produtos.phtml dentro da pasta dos views e insira o código abaixo:</p>
<pre class="brush: php; title: ;">
&lt;h1&gt;&lt;?= $this-&gt;contentTitle; ?&gt;
&lt;?php if( $this-&gt;id != '' ) : ?&gt;
&lt;h2&gt;&lt;?= $this-&gt;nome; ?&gt;&lt;/h2&gt;
&lt;div&gt;
	&lt;?= $this-&gt;descricao; ?&gt;
&lt;/div&gt;
&lt;?php endif; ?&gt;
</pre>
<p>Se você acessar o URL <strong>http://zend.localhost/produtos?id=1</strong>, você vai receber uma bela mensagem de erro informando que a página não existe e que o controlador &#8216;produtos&#8217; não existe.</p>
<p>Neste caso, como vimos o Zend irá entender o URL da seguinte forma:</p>
<pre class="brush: plain; title: ;">
array (
  'controller' =&gt; 'produtos',
  'action' =&gt; 'id',
  'module' =&gt; 'default',
)
</pre>
<p>Para resolver isto teríamos que chamar:</p>
<p><strong>http://zend.localhost/index/produtos/id/1</strong></p>
<p>O que nos fez voltar ao maldito &#8216;index&#8217; no URL novamente.</p>
<p><strong>Então a solução seria criar um Route para este padrão de URL.</strong></p>
<p>No arquivo application.ini no final do bloco de Routes que criamos anteriormente adicione as linhas:</p>
<pre class="brush: plain; title: ;">
;produtos/id/
resources.router.routes.produtosId.route = /produtos/id/:id
resources.router.routes.produtosId.defaults.module = default
resources.router.routes.produtosId.defaults.controller = index
resources.router.routes.produtosId.defaults.action = produtos
</pre>
<p><s><strong>Atualizado em 16/12/2011:</strong> <em>produtosId deve ser o nome do novo roteamento.</em></s><br />
<s><strong>Atualizado em 16/12/2011:</strong> <em>Código-fonte para download nas partes 5 e 6.</em></s></p>
<p>Acesse o URL <strong>http://zend.localhost/produtos/id/1</strong> e veja que está acessando agora!<br />
<strong>NOTA</strong>: Você precisa passar um novo nome para o roteamento de produtos através do ID, no caso, eu nomeei <strong>produtosId</strong> mas poderia ser qualquer coisa. Lembre-se de sempre dar nomes ÚNICOS para cada roteamento, mesmo que sejam 100 roteamos envolvendo o mesmo controller, todos precisarão ter um nome único.</p>
<p><strong>IMPORTANTE</strong> <em><br />
O que você passar para<br />
<strong>resources.router.routes.produtosId.route</strong><br />
Será o que o Zend irá aceitar no URL e o <strong>:id</strong> é o nome do parametro que queremos passar para o controller. Poderia ser qualquer coisa, e esta seria a chave que obteríamos em :<br />
<strong> $this->request->getParam( CHAVE );</strong><br />
</em></p>
<p>Então, se quisermos podemos eliminar totalmente a chave do URL e ficarmos com algo do tipo:<br />
<strong>http://zend.localhost/index/produtos/1</strong><br />
Bastaria modificar o roteamento para:</p>
<pre class="brush: plain; title: ;">
;produtos/:id
resources.router.routes.produtos.route = /produtos/:id
resources.router.routes.produtos.defaults.module = default
resources.router.routes.produtos.defaults.controller = index
resources.router.routes.produtos.defaults.action = produtos
</pre>
<p>Mas para fins didáticos, vamos ficar com o /produtos/id/:id e não /produtos/:id</p>
<p>Você pode colocar inúmeros parametros num redirecionamento tal como:</p>
<pre class="brush: plain; title: ;">
;/produtos/fab/:fabricante/cat/:categoria/marcar/:marca/mod/:modelo/cor/:cor/
resources.router.routes.produtos.route = /produtos/fab/:fabricante/cat/:categoria/marcar/:marca/mod/:modelo/cor/:cor/
...
</pre>
<p>Ou simplesmente:</p>
<pre class="brush: plain; title: ;">
;/produtos/:fabricante/cat/:categoria/marcar/:marca/mod/:modelo/cor/:cor/
resources.router.routes.produtosEx.route = /produtos/:fabricante/:categoria/:marca/:modelo/:cor/
...
</pre>
<h3>Conclusão</h3>
<p>Nesta parte de nosso tutorial conheceu o Objeto Request e aprendeu como obter parametros a partir do URL e como criar um redirecionamento baseado nestes parametros. Na próxima parte veremos como criar Forms e enviar emails com o Zend_Mail.<br />
Abraços do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/tutorial-zend-framework-parte-04/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/tutorial-zend-framework-parte-04/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Tutorial Zend Framework em Português</title>
		<link>http://gilbertoalbino.com/tutorial-zend-framework-em-portugues/</link>
		<comments>http://gilbertoalbino.com/tutorial-zend-framework-em-portugues/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 14:43:22 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[tutoria em português]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=843</guid>
		<description><![CDATA[Para os amigos que desejam aprender o Zend Framework em Português acesse minha página Zend Framework. Assine o meu blog para sempre receber novidades e atualizações. Aceito sugestões e críticas. Tudo é bem vindo. Abraço do Giba!]]></description>
			<content:encoded><![CDATA[<p>Para os amigos que desejam aprender o Zend Framework em Português acesse minha página <a href="http://gilbertoalbino.com/zend-framework" title="Tutorial Zend Framework em Português">Zend Framework</a>.<br />
Assine o meu blog para sempre receber novidades e atualizações.</p>
<p>Aceito sugestões e críticas. Tudo é bem vindo. </p>
<p>Abraço do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/tutorial-zend-framework-em-portugues/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/tutorial-zend-framework-em-portugues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ wordpress ] Desabilitar Rascunhos e Revisões Automáticas</title>
		<link>http://gilbertoalbino.com/wordpress-desabilitar-rascunhos-e-revisoes-automaticas/</link>
		<comments>http://gilbertoalbino.com/wordpress-desabilitar-rascunhos-e-revisoes-automaticas/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 23:29:47 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Dica]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[autosave]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-config]]></category>
		<category><![CDATA[WP_POST_REVISIONS]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=834</guid>
		<description><![CDATA[De repente, você não precise de rascunhos e revisões automáticas, o mesmo esteja trabalhando com a tabela wp_posts e precisa desabilitar temporária ou definitivamente o recurso de auto salvamento de rascunhos e revisões do wordpress. CURIOSIDADE Estes dias deixei o &#8230; <a href="http://gilbertoalbino.com/wordpress-desabilitar-rascunhos-e-revisoes-automaticas/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>De repente, você não precise de rascunhos e revisões automáticas, o mesmo esteja trabalhando com a tabela wp_posts e precisa desabilitar temporária ou definitivamente o recurso de auto salvamento de rascunhos e revisões do wordpress.<br />
<strong>CURIOSIDADE</strong> <em>Estes dias deixei o navegador aberto com um POST e o wordpress criou mais de 1000 registros de rascunho. Imagina a quantidade desnecessária de registros dentro da tabela wp_posts.</em></p>
<p>Bom, para resolver isto é bem fácil.<br />
<span id="more-834"></span></p>
<h4>Desabilitando Rascunhos e auto salvamento</h4>
<p>Abra o arquivo wp-admin/post-new.php e procure pela linha:</p>
<pre class="brush: php; title: ; toolbar: true;">
wp_enqueue_script('autosave');
</pre>
<p>e comente a mesma:</p>
<pre class="brush: php; title: ;">
//wp_enqueue_script('autosave');
</pre>
<h4>Desabilitando Revisões Automáticas</h4>
<p>Abra o arquivo wp-config.php e no final adicione a linha:</p>
<pre class="brush: php; title: ;">
define( 'WP_POST_REVISIONS', false );
</pre>
<p>E pronto! WordPress vai ficar quieto e não vai superpopular a tabela ( risos ).</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/wordpress-desabilitar-rascunhos-e-revisoes-automaticas/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/wordpress-desabilitar-rascunhos-e-revisoes-automaticas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[ Tutorial ] Zend Framework &#8211; Parte 03</title>
		<link>http://gilbertoalbino.com/tutorial-zend-framework-parte-03/</link>
		<comments>http://gilbertoalbino.com/tutorial-zend-framework-parte-03/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 21:17:41 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[application.ini. layout]]></category>
		<category><![CDATA[route]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[view]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=816</guid>
		<description><![CDATA[Routes, Layout, View Sumário Continuando com o nosso projeto disponível nas partes anteriores deste tutorial em minha página Zend Framework, nesta parte do tutorial vamos aprender como criar Routes, uma forma prática de redirecionar sua aplicação para as mais diversas &#8230; <a href="http://gilbertoalbino.com/tutorial-zend-framework-parte-03/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>Routes, Layout, View</h4>
<h3>Sumário</h3>
<p>Continuando com o nosso projeto disponível nas partes anteriores deste tutorial em minha página <a title="Zend Framework" href="http://gilbertoalbino.com/zend-framework/">Zend Framework</a>, nesta parte do tutorial vamos aprender como criar Routes, uma forma prática de redirecionar sua aplicação para as mais diversas situações, entre elas, quando alguma página mudou de lugar na sua aplicação. E seguindo a solicitação de alguns leitores, como criar trabalhar com Layouts e aprender o conceito básico de View.<br />
<span id="more-816"></span></p>
<div style="border: solid 1px orange; padding: 10px; margin-bottom: 15px">
<a href="/tutorial-zend-framework" title="Todos os tutoriais Zend Framework" target="_blank">Clique aqui para ver todos os tutoriais disponíveis</a>
</div>
<p>Agora que você já sabe como trabalhar com módulos, actions e controllers e respondendo a uma pergunta dos amigos que utilizaram meus tutoriais como fonte de aprendizado, ai vai a resposta:</p>
<p><strong>Pergunta:</strong> A maioria dos tutoriais na internet não utiliza ou cita Módulos, preciso mesmo utilizar Módulos?<br />
<strong>Resposta:</strong> Não. Não precisa! Mas seria uma perca de tempo e recursos. O objetivo deste tutorial é fornecer algo mais sólido e próximo de um projeto real para o desenvolvedor que deseja realizar projetos ousados.</p>
<p>A pergunta acima foi feita por vários desenvolvedores que entraram em contato nas últimas 2 semanas depois que atualizei os tutoriais e achei interessante citá-la.</p>
<h3>Routes</h3>
<p>O que são Routes? Rotas, do inglês! O Leitor deve estar perguntando se eu estou tirando da cara dele. Mas não! Normalmente, as palavras bem definidas fazem com que fixemos o objetivo e não criemos confusão antecipada.<br />
Uma rota é um ponto de acesso ou trajeto definido e delimitado após uma experiência ou análise prévia.<br />
No Zend, é o processo de pegar o ponto final de URI, decompor o mesmo, e definindo qual módulo, controller, action deverá servexecutado na solicitação ( request ).</p>
<p>O Roteamento ocorre somente uma vez quando uma solicitação é feita; antes do controller ser chamado.</p>
<h4>Utilizando Routers</h4>
<p>Existem duas formas fundamentais de se criar Routes com o Zend.<br />
A primeira é através do arquivo application.ini e outra através de um dos 6 tipos:</p>
<ul>
<li>Zend_Controller_Router_Route</li>
<li>Zend_Controller_Router_Route_Static</li>
<li>Zend_Controller_Router_Route_Regex</li>
<li>Zend_Controller_Router_Route_Hostname</li>
<li>Zend_Controller_Router_Route_Chain</li>
<li>Zend_Controller_Router_Rewrite</li>
</ul>
<p>Por questões de praticidade, eu sempre utilizo a primeira, pois a equipe do Zend criou uma interface que faz todo o trabalho para você direto no arquivo de configuração. &#8216;Routes&#8217; não são o tipo de coisa que você deve se preocupar demais num projeto, sem desprezar sua importância, é claro, por isto a sacada foi boa! E seria perca de tempo se matar digitando um monte de código PHP quando você pode fazer o mesmo com algumas linhas no arquivo de configuração, e se isto existe é para isto que foi criado. Mais adiante, veremos como programar Routes, utilizando o batalhão de classes acima, mas por hora vamos entender como as coisas funcionam no arquivo de configuração.</p>
<h4>Anteriormente na Parte 02</h4>
<p>Nós criamos o controlador &#8216;index&#8217; automaticamente anteriormente no momento da criação do projeto, e depois alguns actions que resultaram nos URLs:</p>
<ul>
<li>http://zend.localhost/index/index</li>
<li>http://zend.localhost/index/quem-somos</li>
<li>http://zend.localhost/index/servicos</li>
<li>http://zend.localhost/index/produtos</li>
<li>http://zend.localhost/index/contato</li>
</ul>
<p>Mas estas URLs com &#8216;index&#8217; não ficaram legal.</p>
<p>Nós poderíamos ter criado um controlador para cada caso:</p>
<p>QuemSomos, Servicos, Produtos e Contato</p>
<p>Mas necessariamente, não faria sentido, a menos que cada página do site tivesse sub-páginas, algo do tipo.</p>
<p>Produtos -&gt; Categorias<br />
Produtos -&gt; Resultados<br />
PRodutos -&gt; Ver</p>
<p>Etc&#8230;</p>
<p>Por questões de aprendizagem de Refatoração do Projeto, mais adiante nós modificaremos a funcionalidade da seção &#8216;Produtos&#8217; de nosso site a fim de corresponder com nossas necessidades, mas por ora, ele é apenas uma página que lista os tipos de produtos, ou uma ação dentro do controlador index.</p>
<p>O que nós atualmente queremos é algo do tipo:</p>
<ul>
<li>http://zend.localhost/home</li>
<li>http://zend.localhost/quem-somos</li>
<li>http://zend.localhost/servicos</li>
<li>http://zend.localhost/produtos</li>
<li>http://zend.localhost/contato</li>
</ul>
<p>Que é o que vamos fazer agora!</p>
<p>Abra o seu arquivo /application/configs/application.ini e procure pela seção <strong>[production]</strong>.</p>
<p>Cole as linhas abaixo:</p>
<pre class="brush: sql; title: ;">;
[production]
resources.router.routes.home.route = /home
resources.router.routes.home.defaults.module = default
resources.router.routes.home.defaults.controller = index
resources.router.routes.home.defaults.action = index
</pre>
<p>Vamos entender o que aconteceu.</p>
<p>A primeira linha define o que deverá ser chamado, no nosso caso &#8216;<strong>home</strong>&#8216;:</p>
<pre class="brush: sql; title: ;">
resources.router.routes.home.route = /home
</pre>
<p>A segunda linha define o <strong>module</strong>, no nosso caso &#8216;<strong>default</strong>&#8216; que é o modulo padrão:</p>
<pre class="brush: sql; title: ;">
resources.router.routes.home.defaults.module = default
</pre>
<p>A terceira linha define o <strong>controller </strong>(<strong>index</strong>) :</p>
<pre class="brush: sql; title: ;">
resources.router.routes.home.defaults.controller = index
</pre>
<p>E a quarta define o <strong>action</strong> (<strong>index</strong>) :</p>
<pre class="brush: sql; title: ;">
resources.router.routes.home.defaults.action = index
</pre>
<p>Repare na estrutura e veja que somente foi modificada a última parte de cada linha (<strong>module|controller|action</strong>). A lógica é esta:</p>
<p>resources.router.routes.NOME_DA_ROTA.MODULO.CHAVE = VALOR</p>
<p>O NOME_DA_ROTA deverá ser único para cada rota, como veremos mais abaixo.<br />
O MODULO, apesar de ser &#8216;<strong>default</strong>&#8216; em nossa aplicação, para este caso deverá ser passado como &#8216;<strong>defaults</strong>&#8216;.</p>
<p>Agora você pode testar:</p>
<p><strong>http://zend.localhost/home</strong></p>
<p>Que seria o mesmo que:</p>
<p>http://zend.localhost/ ou http://zend.localhost/index/index</p>
<p>Se você não entendeu, releia. Se entendeu vamos fazer o mesmo para as próximas páginas de nosso projeto:</p>
<pre class="brush: sql; title: ;">;
[production]
; home
resources.router.routes.home.route = /home
resources.router.routes.home.defaults.module = default
resources.router.routes.home.defaults.controller = index
resources.router.routes.home.defaults.action = index

;quemsomos
resources.router.routes.quemsomos.route = /quem-somos
resources.router.routes.quemsomos.defaults.module = default
resources.router.routes.quemsomos.defaults.controller = index
resources.router.routes.quemsomos.defaults.action = quem-somos

;servicos
resources.router.routes.servicos.route = /servicos
resources.router.routes.servicos.defaults.module = default
resources.router.routes.servicos.defaults.controller = index
resources.router.routes.servicos.defaults.action = servicos

;produtos
resources.router.routes.produtos.route = /produtos
resources.router.routes.produtos.defaults.module = default
resources.router.routes.produtos.defaults.controller = index
resources.router.routes.produtos.defaults.action = produtos

; contato
resources.router.routes.contato.route = /contato
resources.router.routes.contato.defaults.module = default
resources.router.routes.contato.defaults.controller = index
resources.router.routes.contato.defaults.action = contato
</pre>
<p><strong>IMPORTANTE</strong>: <em>Note que nomeamos cada rota e alteramos as primeiras e quartas linhas de cada bloco.</em></p>
<p>Agora você pode acessar cada página:</p>
<ul>
<li>http://zend.localhost/home</li>
<li>http://zend.localhost/quem-somos</li>
<li>http://zend.localhost/servicos</li>
<li>http://zend.localhost/produtos</li>
<li>http://zend.localhost/contato</li>
</ul>
<p>Fácil não?</p>
<p>Mais adiante veremos como passar parametros e como recuperá-los.</p>
<h3>Layouts</h3>
<p>Conforme solicitado pelos amigos leitores, vou ensinar nesta terceira parte sobre Layouts.</p>
<h4>O que é um Layout?</h4>
<p>De repente você esteja acostuma com o termo &#8216;tema&#8217;, &#8216;template&#8217;, &#8216;design&#8217;, etc mas não tenha intimidade com &#8216;layout&#8217;.<br />
Um Layout é basicamente uma estrutura hierárquica em sua aplicação que mantém partes de código que se repetirão em todas ou algumas páginas da aplicação.<br />
Toda aplicação web é composta por uma estrutura HTML padrão que precisa ser mantida e normalmente o que muda de uma pagina para outra é o conteúdo, e se mantém sempre o cabeçalho, rodapé, laterais.<br />
Um Layout no Zend Framework é parte do MVC e utiliza-se do ViewRenderer que oferece uma vasta gama de recursos que são carregados automaticamente para o objeto $view.</p>
<h3>Enable Layout</h3>
<p>No Zend Framework o Layout é habilitado pelo ZF Tool, digitando a linha abaixo:</p>
<pre class="brush: sql; title: ;">
zf enable layout
</pre>
<p>Este comando criará uma pasta e um arquivo em &#8216;/application/layouts/scripts/layout.phtml&#8217; com a linha:</p>
<pre class="brush: php; title: ;">
&lt;?php echo $this-&gt;layout()-&gt;content; ?&gt;
</pre>
<p>Esta linha carregará o conteudo do arquivo view script do action sendo chamado.</p>
<p>Dentro do arquivo de configuração application.ini foi adicionada a linha:</p>
<pre class="brush: sql; title: ;">
resources.layout.layoutPath = APPLICATION_PATH &quot;/layouts/scripts/&quot;
</pre>
<p>Acesse sua aplicação e veja que nada mudou.</p>
<p>Agora modifique o arquivo layout.phtml para que o mesmo fique assim:</p>
<pre class="brush: php; title: ;">
&lt;html&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; /&gt;
    &lt;title&gt;Meu Projeto Zend Framework&lt;/title&gt;
    &lt;body&gt;
	&lt;div id=&quot;header&quot;&gt;{Meu Cabeçalho aqui}&lt;/div&gt;
	&lt;div id=&quot;content&quot;&gt;
	&lt;?php echo $this-&gt;layout()-&gt;content; ?&gt;
	&lt;/div&gt;
	&lt;div id=&quot;footer&quot;&gt;{Meu rodapé aqui}&lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Acesse todas as páginas de nosso projeto e verifique que a estrutura se manteve a mesma.</p>
<p>Então se você deseja criar alguma navegação no topo, lateral, rodapé ou outros blocos de HTML você poderá fazê-los neste arquivo.</p>
<p><strong>NOTA:</strong> Não remova a declaração $this->layout()->content:</p>
<pre class="brush: php; title: ;">
&lt;?php echo $this-&gt;layout()-&gt;content; ?&gt;
</pre>
<p>Do contrário o conteúdo dos arquivos view não serão exibidos.</p>
<p>Mais adiante veremos como adicionar Scripts e CSS e como criar uma esquema de temas.</p>
<h3>Views e Templates</h3>
<p>Outra coisa interessante no desenvolvimento web, além de Layouts são as ferramentas de template. Existem várias por ai tais como Smarty, PHP Template, etc&#8230; eu mesmo até já fiz uma (risos).<br />
No Zend não há necessidade de se utilizar uma ferramenta de templates, pois o View faz isto.</p>
<h3>O que é o View?</h3>
<p>O View é uma classe que trabalha com a parte View que já aprendemos anteriormente ( não estou tirando de novo &#8211; risos ), ou seja, ele existe para auxiliar a manter o view script (arquivos dos actions) separado dos arquivos Model e Controller. Ele oferece um sistema de Helpers, Filters e variáveis escapadas.</p>
<h4>Um Exemplo para entender</h4>
<p><strong>CASO</strong>: Você deseja que determinados valores sejam carregados automaticamente em cada página, variando de acordo com o controlador e o action, no caso o valor da tag &#8216;TITLE&#8217; de cada página e o &#8216;Titulo da página&#8217; para identificar onde o usuário está.<br />
No nosso projeto, precisamos identificar cada página com títulos distintos:</p>
<pre class="brush: php; title: ;">
// pagina home
...
&lt;title&gt;Seja Bem Vindo - Tutorial Zend&lt;/title&gt;
...
&lt;h1&gt;Seja Bem vindo&lt;/h1&gt;

...

// pagina quem-somos
...
&lt;title&gt;Quem Somos - Tutorial Zend&lt;/title&gt;
...
&lt;h1&gt;Quem Somos&lt;/h1&gt;

...

/**
 * E ASSIM POR DIANTE!!!!
 */
</pre>
<p>Para fazermos isto, precisamos utilizar o View da seguinte forma:</p>
<p>Abra o arquivo IndexController.php</p>
<p>E insira as linhas dentro do método indexAction():</p>
<pre class="brush: php; title: ;">
...
public function indexAction()
{
    $this-&gt;view-&gt;pageTitle = 'Seja Bem-vindo - Tutorial Zend';
    $this-&gt;view-&gt;contentTitle = 'Seja Bem-vindo';
}
...
</pre>
<p>No arquivo view/scripts/index/index.phtml remova todo o conteúdo gerado automaticamente e coloque:</p>
<pre class="brush: php; title: ;">
&lt;h1&gt;&lt;?=$this-&gt;contentTitle;?&gt;&lt;/h1&gt;
</pre>
<p>Acesse a página home de nosso projeto e veja que o título apareceu lá.</p>
<p>No entanto, ainda falta definir o TITLE de cada página, isto será feito no arquivo layouts.phtml:</p>
<pre class="brush: php; title: ;">
...
&lt;title&gt;&lt;?= $this-&gt;pageTitle;?&gt;&lt;/title&gt;
...
</pre>
<p>Atualize a página e veja que agora o TITLE possui a string que definimos.</p>
<p>[NOTA] : <em>Faça o mesmo dentro de cada método action de nosso controlador para cada página modifique o arquivo view correspondente (quem-somos, servicos, produtos, contato).</em></p>
<p>Em resumo é isto:</p>
<p>No action você usa:</p>
<pre class="brush: php; title: ;">
$this-&gt;view-&gt;CHAVE = VALOR;
</pre>
<p>E no view script (arquivo .html do action):</p>
<pre class="brush: php; title: ;">
$this-&gt;CHAVE; // NOTE QUE NÃO HÁ O view
</pre>
<p>Bom, vamos ficar por aqui. Mais adiante veremos muita coisa boa.</p>
<h3>Resumo</h3>
<p>Nesta terceira parte de nosso tutorial você aprendeu o conceito fundamental de Routes e aprendeu como definir facilmente rotas no arquivo de configuração. Também aprendeu como habilitar Layout no Zend framework e modificou o arquivo gerado. Vimos como utilizar o View para trabalharmos com o paradigma de Templates.<br />
Nas próximas partes continuaremos e veremos pegar os parametros do URL e como obter valores via GET e POST através de Forms criados pelo Zend.<br />
Abraço do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/tutorial-zend-framework-parte-03/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/tutorial-zend-framework-parte-03/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Impedir o WordPress de Inserir parágrafos &#8211; p tag</title>
		<link>http://gilbertoalbino.com/impedir-o-wordpress-de-inserir-paragrafos-p-tag/</link>
		<comments>http://gilbertoalbino.com/impedir-o-wordpress-de-inserir-paragrafos-p-tag/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 00:13:57 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[Dica]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[p]]></category>
		<category><![CDATA[remove_filter]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wpautop]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=812</guid>
		<description><![CDATA[Oh, coisa chata! Estes dias estava criando um site para um amigo corretor de imóveis e criei uma página estática que continha código PHP e HTML puro. Fui fazer os testes padrões e apareceu um zilhão de espaços em branco &#8230; <a href="http://gilbertoalbino.com/impedir-o-wordpress-de-inserir-paragrafos-p-tag/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Oh, coisa chata!<br />
Estes dias estava criando um site para um amigo corretor de imóveis e criei uma página estática que continha código PHP e HTML puro.<br />
Fui fazer os testes padrões e apareceu um zilhão de espaços em branco no final de Divs, H1s, etc.</p>
<p>A primeira vista achei que fosse paddings e margins exagerados que eu houvesse definido, foi quando utilizando a ferramenta para inspeção de DOM do Chrome que vi umas tag &#8216;P&#8217; não autorizadas em meu HTML (risos)</p>
<p><span id="more-812"></span></p>
<p>Bom, a solução é bem pratica e não precisa mais do que uma linha de código.</p>
<p>Abra o arquivo function.php de seu tema e insira a linha:</p>
<pre class="brush: php; title: ;">
remove_filter (&quot;the_content&quot;, &quot;wpautop&quot;);
</pre>
<p>O que estas linha de código faz é remover o filtro wpautop. Este filtro adiciona paragrafos automaticamente ao wordpress quando a função &#8216;the_content&#8217; é executada na exibição do POST.</p>
<p>Bom, é isto ai. Abraço do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/impedir-o-wordpress-de-inserir-paragrafos-p-tag/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/impedir-o-wordpress-de-inserir-paragrafos-p-tag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ WordPress ] Erro 404 para Custom Post Types</title>
		<link>http://gilbertoalbino.com/wordpress-erro-404-para-custom-post-types/</link>
		<comments>http://gilbertoalbino.com/wordpress-erro-404-para-custom-post-types/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 12:37:00 +0000</pubDate>
		<dc:creator>Giba</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Dica]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[custom post type]]></category>
		<category><![CDATA[erro 404]]></category>
		<category><![CDATA[links permanentes]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://gilbertoalbino.com/?p=803</guid>
		<description><![CDATA[Os Custom Post Types do WordPress são a maravilha do universo CMS. Não vi algo tão pratico e bem estruturado em um CMS como os Custom Post Types do WordPress. Eu estava desenvolvendo um Plugin para uma imobiliária e me &#8230; <a href="http://gilbertoalbino.com/wordpress-erro-404-para-custom-post-types/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Os Custom Post Types do WordPress são a maravilha do universo CMS.<br />
Não vi algo tão pratico e bem estruturado em um CMS como os Custom Post Types do WordPress.</p>
<p>Eu estava desenvolvendo um Plugin para uma imobiliária e me deparei com um problema:</p>
<p>Na Visualização do Rascunho o conteúdo estava sendo exibido corretamente, porém, após publicado aparecia o Erro 404 ( Page not found ).</p>
<p><span id="more-803"></span></p>
<p>Para resolver isto não precisa de muita coisa.</p>
<p>Basta simplesmente Ir em Configurações -> Links Permanentes e Pronto!</p>
<p>O wordpress atualiza alguma coisa que não tive tempo para analisar.</p>
<p>Quando eu descobrir eu posto aqui.</p>
<p>Descobri &#8211; ( suspense )</p>
<p>Eu fiz uma análise e achei o que acontece.<br />
Toda vez que um post é criado o WordPress faz um Flush ( limpeza, descarrega o que já existe e recria de novo ) nas regras de Rewrite executando este método:</p>
<pre class="brush: php; title: ;">
$wp_rewrite-&gt;flush_rules();
</pre>
<p>Então se você quiser que seus tipos de conteúdo asseguradamente apareçam quando forem criados, insira estas linhas em algum lugar do seu plugin relativos a criação do custom post type:</p>
<pre class="brush: php; title: ;">
global $wp_rewrite;
$wp_rewrite-&gt;flush_rules();
</pre>
<p>Abraço do Giba!</p>
<div class='wpfblike' ><fb:like href='http://gilbertoalbino.com/wordpress-erro-404-para-custom-post-types/' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://gilbertoalbino.com/wordpress-erro-404-para-custom-post-types/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

