<?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>Paulo Eduardo &#187; Tecnologia</title>
	<atom:link href="http://www.pauloeduardo.com/category/tecnologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pauloeduardo.com</link>
	<description>Tecnologia, Negócios e o Mundo</description>
	<lastBuildDate>Tue, 17 Jan 2012 16:26:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Obtendo Informações de Aplicações Externas com Zend_Http</title>
		<link>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/</link>
		<comments>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 16:15:36 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Http]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1082</guid>
		<description><![CDATA[A algum tempo atras escrevi um artigo sobre Conexão com Servidores XML-RPC, essa é uma das formas de se obter informações de uma aplicação externa, mas em algumas ocasiões as informações que se deseja buscar estão disponíveis publicamente e não é não existe um servidor XML-RPC para fornecer essas informações, nesse caso podemos realizar requisições HTTP simples no plano de fundo da aplicação para obter o conteúdo de outros sites ou aplicações. Iniciando uma Requisição HTTP Remota. Para iniciar uma requisição HTTP remota tudo o que precisa ser feito é abrir uma conexão com o servidor externo através do protocolo [...]]]></description>
			<content:encoded><![CDATA[<p>A algum tempo atras escrevi um artigo sobre <a title="Requisições XML-RPC com Zend Framework" href="http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/">Conexão com Servidores XML-RPC</a>, essa é uma das formas de se obter informações de uma aplicação externa, mas em algumas ocasiões as informações que se deseja buscar estão disponíveis publicamente e não é não existe um servidor XML-RPC para fornecer essas informações, nesse caso podemos realizar requisições HTTP simples no plano de fundo da aplicação para obter o conteúdo de outros sites ou aplicações.</p>
<h3>Iniciando uma Requisição HTTP Remota.</h3>
<p>Para iniciar uma requisição HTTP remota tudo o que precisa ser feito é abrir uma conexão com o servidor externo através do protocolo HTTP usando para isso a classe Zend_Http da seguinte forma:</p>
<pre>$client = new Zend_Http_Client($recipient);</pre>
<p>Você ainda poderá passar alguma configurações para essa requisição, como por exemplo limitar o número de redirecionamentos para 0, ou seja, não permitir que o servidor redirecione para outro site ou aplicação, e limitar o tempo de resposta do servidor, para evitar problemas caso o servidor esteja indisponível, essas configurações podem ser feitas da seguinte forma.</p>
<pre>$client-&gt;setConfig(array(
	'maxredirects' =&gt; 0,
	'timeout'      =&gt; 30));</pre>
<h3>Passando Parâmetro para a Requisição.</h3>
<p>Além de ajustar as configurações de conexão ainda é possível passar parâmetros para essa requisição, um exemplo dessa utilização e caso seja necessário passar dados pelo método POST, usado frequentemente em formulários, o exemplo a seguir mostra a passagem de alguns dados usando esse método:</p>
<pre>$client-&gt;setParameterPost(array(
	'search'  =&gt; 'Psyco',
	'limit'   =&gt; 10,
));

$client-&gt;setMethod(Zend_Http_Client::POST);</pre>
<p>No exemplo acima estamos passando dois parâmetros através do método POST, o primeiro deles seria um termo de busca e o segundo um limite de respostas que seriam exibidas, esses dados poderiam ser passados para um mecanismo de busca para obter seus resultados.</p>
<h3>Obtendo a Reposta</h3>
<p>Depois de realizar todas as configurações e passar os parâmetros necessários é hora de receber as resposta desse servidor, a instrução a seguir demonstra como isso deve ser feito:</p>
<pre>$response = $client-&gt;request();</pre>
<p>Essa instrução irá obter a resposta completa do servidor, o que incluíra o cabeçalho do arquivo e da requisição assim como todo o conteúdo da página, você pode filtrar essa requisição e obter somente o cabeçalho ou somente o conteúdo através das instruções abaixo:</p>
<pre>$response = $response-&gt;getHeader(); //Recebe o cabeçalho
$response = $response-&gt;getBody(); //Recebe o conteúdo</pre>
<h3>Conclusão</h3>
<p>Existem diversas formas de comunicação entre diferentes sites ou aplicações, anteriormente falei um pouco sobre as requisições XML-RPC, essa foi a vez de exemplificar um pouco conexões externas utilizando o próprio protocolo HTTP, cada cenário poderá exigir uma solução diferente, cabe ao programador da aplicação definir qual das soluções melhor se adapta as necessidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tags Multimídia HTML5</title>
		<link>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/</link>
		<comments>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 06:02:51 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1074</guid>
		<description><![CDATA[No artigo anterior falei um pouco sobre as novas tags de conteúdo da versão 5 da HTML, agora chegou a hora de falar um pouco sobre as tags multimídia, que permitem a incorporação de conteúdo em áudio ou vídeo sem a necessidade de instalação de nenhum plugin extra para isso. Incorporando Áudio com HTML 5 Incorporar áudio com HTML5 é muito simples, tudo o que precisa ser feito é inserir o seguinte código na sua marcação: &#60;audio controls="controls"&#62; &#60;source src="audio.ogg" type="audio/ogg" /&#62; &#60;source src="audio.mp3" type="audio/mp3" /&#62; Seu Navegador Não Suporta Áudio em HTML5 &#60;/audio&#62; No código acima vemos a tag [...]]]></description>
			<content:encoded><![CDATA[<p>No artigo anterior falei um pouco sobre as novas tags de conteúdo da versão 5 da HTML, agora chegou a hora de falar um pouco sobre as tags multimídia, que permitem a incorporação de conteúdo em áudio ou vídeo sem a necessidade de instalação de nenhum plugin extra para isso.</p>
<h3>Incorporando Áudio com HTML 5</h3>
<p>Incorporar áudio com HTML5 é muito simples, tudo o que precisa ser feito é inserir o seguinte código na sua marcação:</p>
<pre>&lt;audio controls="controls"&gt;
	&lt;source src="audio.ogg" type="audio/ogg" /&gt;
	&lt;source src="audio.mp3" type="audio/mp3" /&gt;
	Seu Navegador Não Suporta Áudio em HTML5
&lt;/audio&gt;</pre>
<p>No código acima vemos a tag &lt;audio&gt; que indica a presença de um elemento de áudio na página, nesse caso a tag só contém um atributo controls, que quando incluído instrui o navegador a exibir os controlers desse vídeo, caso esse atributo seja omitido os controles não serão mostrados, além disso essa tag ainda pode receber outros atributos que não estão presentes nesse exemplo, são eles, &#8220;autoplay&#8221;, que caso incluído fará com que o áudio toque automaticamente com o carregamento da página (use com moderação), &#8220;loop&#8221; que indicará que ao final do áudio ele deve ser tocado novamente, e &#8220;preload&#8221; que indica que o arquivo de áudio deve ser carregado (apenas carregado, não tocado) juntamente com a página.</p>
<p>Dentro dessa tag &lt;audio&gt; existem duas tags &lt;source&gt;aonde são informados os caminhos para dois arquivos de áudio, um em .mp3 e um e .ogg, isso é necessário pois alguns navegadores só possuem suporte a um desses tipos de áudio, então para que sua aplicação funcione corretamente nos navegadore modernos é fundamental que você forneça o arquivo em pelo menos esses dois formados, cada um deles contém também o atributo type que indica o mime type desse arquivo.</p>
<p>Por fim, um texto informativo que será exibido somente caso o navegador não possui suporte a tag &lt;audio&gt; do HTML5 é utilizado para informar o visitante dessa limitação do seu navegador.</p>
<h3>Incorporando Vídeo com HTML5</h3>
<p>Incorporar vídeos em HTMl5 é bastante similar à incorporação de áudio, abaixo um exemplo de código para inserção de vídeo que será dvidamente explicado a seguir:</p>
<pre>&lt;video width="400" height="300" controls="controls"&gt;
	&lt;source src="video.mp4" type="video/mp4" /&gt;
	&lt;source src="video.ogg" type="video/ogg" /&gt;
	Seu Navegador Não Suporta Vídeo em HTML5
&lt;/video&gt;</pre>
<p>A diferença básica entre aúdio e vídeo, e que além dos atributos explicados anteriormente o vídeo deve conter os atributos que determinam a largura e a altura desse componente de vídeo (atributos width e height respectivamente), além disso existem dois outros atributos opcionais que podem ser utilizados, o atributo &#8220;poster&#8221; que deve receber como valor o endereço de uma imagem que será usada com demonstração do vídeo antes de seu início e o atributo &#8220;muted&#8221; que caso seja usado fará com que o vídeo toque sem o seu áudio.</p>
<h3>Conclusão</h3>
<p>A inclusão de áudio e vídeo em HTML5 é bastante simples, porém existem usuários que ainda utilizam navegadores sem suporte a essa tecnologia, por isso é sempre bom fornecer uma alternativa a utilização de HTML5 caso o áudio ou vídeo seja de muita importância para o conteúdo da página, com o tempo e a evolução dos navegadores será possível abondonar as tecnicas antigas e explorar ao máximo as capacidades da nova tecnologia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tags de Conteúdo HTML</title>
		<link>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/</link>
		<comments>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 03:08:17 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Marcação]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1068</guid>
		<description><![CDATA[A algum tempo eu não escrevo aqui no blog sobre front-end development, mas essa também é uma área fundamental para o desenvolvimento de boas aplicações que sejam ao mesmo tempo completas, proporcionem uma facilidade de uso para o utilizador da mesma, apesar das novas tags HTML5 já terem sido amplamente tratadas em sites especializados acredito que agora que a maioria dos navegadores já possui suporte completo para elas seja a hora de relembrar um pouco. Nesse artigo vou falar apenas das tags de conteúdo da nova versão da linguagem, deixando de lado um pouco as tags multimídia. Introdução sobre Semântica [...]]]></description>
			<content:encoded><![CDATA[<p>A algum tempo eu não escrevo aqui no blog sobre front-end development, mas essa também é uma área fundamental para o desenvolvimento de boas aplicações que sejam ao mesmo tempo completas, proporcionem uma facilidade de uso para o utilizador da mesma, apesar das novas tags HTML5 já terem sido amplamente tratadas em sites especializados acredito que agora que a maioria dos navegadores já possui suporte completo para elas seja a hora de relembrar um pouco. Nesse artigo vou falar apenas das tags de conteúdo da nova versão da linguagem, deixando de lado um pouco as tags multimídia.</p>
<p><strong>Introdução sobre Semântica</strong></p>
<p>A versão 5 da linguagem HTML tem grandes melhorias no que diz respeito a semântica de uso das tags, mas antes de explicar cada uma dessas tags é preciso saber melhor o que de fato é semântica, a semântica aplicada a marcação de páginas HTML é a correta relação entre as tags existentes na linguagem e o conteúdo inserido nelas, ou seja, utilizar semântica corretamente no HTML é marcar um parágrafo com a tag &lt;p&gt; e um link com a tag &lt;a&gt;, porém, esses são exemplos mais óbvios de semântica, a versão 5 da linguagem HTML vem resolver o problema da ausência de semântica da tag &lt;div&gt;, essa tag por natureza é ausente de significado, e seu objetivo é apenas demarcar uma divisão na página, na maioria das vezes apenas por critérios de apresentação.</p>
<p>As novas tags de conteúdo da linguagem tem como objetivo incorporar significado a algumas das áreas mais comuns de uma página HTML, dessa forma são criadas as tags &lt;header&gt;, &lt;section&gt;, &lt;article&gt;, &lt;nav&gt;, &lt;aside&gt; e &lt;footer&gt; das quais vou tratar abaixo.</p>
<h3>As Novas Tags</h3>
<p>A tag &lt;header&gt; é responsável por marcar a porção do código que se refere ao cabeçalho da página ou seção, esse cabeçalho pode conter por exemplo o titulo do site, uma imagem de cabeçalho e até mesmo um menu principal delimitado pela tag &lt;nav&gt; tratada abaixo. Da mesma forma a tag &lt;footer&gt; é responsável por marcar o rodapé do mesma página ou seção, podendo conter os mesmo elementos da tag anterior.</p>
<p>A tag &lt;section&gt; delimita uma seção do site ou uma seção do site ou do conteúdo, dependendo de onde essa tag está presente na hierarquia do código, delimitados por essa tag podem estar os títulos do conteúdo ou da seção do site. Já tag &lt;article&gt; pode ser literalmente traduzida para artigo, e é dentro dessa tag que deve estar o conteúdo de fato do site ou aplicação. A tag &lt;aside&gt; representaria então o conteúdo relacionado ao conteúdo principal do site, porém, que tem um grau de importância menor que o conteúdo principal delimitado pela tag &lt;article&gt;. Além disso pode representar algum conteúdo relacionado ao uma seção do site e portanto ser utilizado juntamente com a tag &lt;section&gt;.</p>
<p>Por fim tag &lt;nav&gt; é responsável pela navegação do site, portanto é recomendável que os menus do site estejam delimitados pela mesma.</p>
<h3>Estrutura dos Elementos na Página</h3>
<p>Esse é o principal ponto que desejo tratar nesse artigo, não existe um consenso nem uma regra explicita sobre a estruturação dos elementos na página, o que permite algumas interpretações de significados diferentes para cada um das tags de acordo com a hierarquia dos elementos no site, por exemplo, uma tag &lt;header&gt; ou &lt;footer&gt; um nível imediatamente abaixo da tag &lt;body&gt; representaria o cabeçalho ou rodapé da página, porém, caso essas mesma tags fossem utilizadas dentro de uma tag &lt;section&gt; elas passariam a representar o cabeçalho e o rodapé dessa seção individualmente, dessa forma uma página inteira poderia conter vários cabeçalhos e rodapés, cada um deles se referindo a seções distintas da página.</p>
<p>Da mesa forma isso pode acontecer com a tag &lt;nav&gt;, que caso inserida um nível diretamente abaixo da tag &lt;body&gt; ou dentro da tag &lt;header&gt; ou &lt;footer&gt; da página, representaria o menu de navegação principal do site, a mesma tag inserida dentro da tag &lt;section&gt; poderia representar uma navegação secundária ou específica para aquela seção.</p>
<p>Agora o ponto que mais permite diferentes utilizações das tags é aquele que se refere ao relacionamento entre as tags &lt;section&gt;, &lt;article&gt; e &lt;aside&gt;. Para começar as tags &lt;section&gt; e &lt;article&gt; poderia ser aninhadas infinitamente, nesse caso uma &lt;section&gt; imediatamente após a declaração de &lt;body&gt; poderia representar uma seção do site, que por sua vez poderia delimitar uma tag &lt;article&gt; que delimitaria uma nova tag &lt;section&gt; representando uma seção específica do conteúdo e não mais da página. Além disso a tag &lt;section&gt; poderia ser diretamente aninhada representando uma seção principal e outras sub-se</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Requisições XML-RPC com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 16:36:25 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[XML-RPC]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_XmlRpc]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1050</guid>
		<description><![CDATA[Muitas vezes durante o desenvolvimento de algumas aplicações precisamos realizar conexões entre dois servidores para enviar ou buscar informações, existem diferentes protocolos para realizar esse tipo de atividade, mas nesse artigo vou tratar um pouco sobre o protocolo RPC, mais especificamente sobre a variante desse protocolo que transporta mensagens no formato XML, o XML-RPC. Realizando Conexão com um Servidor XML-RPC Antes de se conectar a um servidor é preciso saber se esse servidor suporta o protocolo XML-RPC, se esse servidor realmente suportar o protocolo muito provavelmente haverá uma documentação da interface de conexão com esse servidor, você irá precisar dela [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes durante o desenvolvimento de algumas aplicações precisamos realizar conexões entre dois servidores para enviar ou buscar informações, existem diferentes protocolos para realizar esse tipo de atividade, mas nesse artigo vou tratar um pouco sobre o protocolo RPC, mais especificamente sobre a variante desse protocolo que transporta mensagens no formato XML, o XML-RPC.</p>
<h3>Realizando Conexão com um Servidor XML-RPC</h3>
<p>Antes de se conectar a um servidor é preciso saber se esse servidor suporta o protocolo XML-RPC, se esse servidor realmente suportar o protocolo muito provavelmente haverá uma documentação da interface de conexão com esse servidor, você irá precisar dela para saber os nomes dos métodos que poderá chamar para realizar as consultas ou enviar informações.</p>
<p>Como exemplo vou assumir que está sendo feita uma conexão com um servidor, que suporta o protocolo XML-RPC e que está localizado no endereço &#8220;http://servidor.xmlrpc.com/xmlrpc.php&#8221;, e que implementa apenas um método &#8220;toEnglish&#8221; da classe &#8220;translate&#8221; responsável por receber palavras ou frases em português e retornar sua tradução em inglês.</p>
<p>Para se conectar a esse servidor tudo que precisa ser feito é o seguinte:</p>
<pre>$client = new Zend_XmlRpc_Client('http://servidor.xmlrpc.com/xmlrpc.php');</pre>
<p>Essa instrução está criando uma instância da classe Zend_XmlRpc_Client, passando como parâmetro o endereço do servidor e armazenando essa instância na variável <em>$client</em></p>
<h3>Realizando Chamadas aos Métodos</h3>
<p>Para chamar o método previamente descrito tudo o que precisa ser feito é o seguinte:</p>
<pre>$result = $client-&gt;call('translate.toEnglish', array('Olá Mundo'));
echo $result; //Hello World</pre>
<p>Está sendo chamado o método call da instância de classe armazenada anteriormente na variável <em>$client</em> passando como primeiro parâmetro o nome da classe e método a serem chamados separados por &#8220;.&#8221; e em seguida um array com os parâmetros requisitados por esse método, nesse exemplo apenas a frase em português que deve ser traduzida, caso o método do servidor tenha sido corretamente implementado ele deverá retornar a String &#8220;Hello World&#8221;.</p>
<h3>Verificando Erros e Faltas</h3>
<p>Quando estamos trabalhando com conexões com servidores diferentes muitos fatores podem ocasionar falhar nessa comunicação e muitos deles não estão sob o controle do desenvolvedor, nesse caso tudo o que se pode fazer é verificar se algum erro ocorreu e informar essa falha, isso pode ser feito através de um bloco try-catch da seguinte forma:</p>
<pre>try{
	echo $client-&gt;call('translate.toEnglish', array('Olá Mundo'));
}catch (Zend_XmlRpc_Client_FaultException $e) {
	echo 'XmlRpc Fault ['.$e-&gt;getCode().']: '.$e-&gt;getMessage();
}catch (Zend_XmlRpc_Client_HttpException $e) {
	echo 'Erro de HTTP ['.$e-&gt;getCode().']: '.$e-&gt;getMessage();
}</pre>
<p>Nesse caso a requisição XmlRpc está inserida dentro de um bloco try-catch, caso a mesma seja bem sucedida será impresso na tela a tradução da String enviada como parâmetro, caso contrário existem duas possibilidades de erros, a primeira quando a conexão foi realizada com sucesso mas o servidor remoto retornou uma falta, isso pode acontecer caso a string enviada tenha algum caractere inválido ou caso alguma verificação do servidor não tenha sido bem sucedida, nesse caso é impresso na tela o código e mensagem de erro retornados pelo servidor.</p>
<p>Outra possibilidade é que ocorra uma falha na comunicação com o servidor, o servidor pode estar fora do ar temporariamente ou não ser encontrado, nesse caso a classe Zend_XmlRpc retorna um erro de HTTP, esse erro é impresso na tela juntamente com seu código da mesma forma que o anterior. Dessa forma é possível controlar melhor a comunicação entre as duas aplicações.</p>
<h3>Conclusão</h3>
<p>Com Zend_XmlRpc a comunicação entre duas aplicações se torna muita mais fácil do que caso fosse feita manualmente, com isso é possível acessar API públicas ou proprietárias que forneçam suporte ao esse protocolo e melhorar significamente a sua aplicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Autenticação Através de Banco de Dados com Zend_Auth</title>
		<link>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/</link>
		<comments>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 13:00:25 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Autenticação]]></category>
		<category><![CDATA[Auth]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Auth]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1018</guid>
		<description><![CDATA[Boa parte das aplicações desenvolvidas para a web tem pelo menos uma pequena área de acesso restrito, essa área pode restringir o acesso a determinado conteúdo somente para usuários cadastrados ou pode até mesmo ser uma área de administração dessa aplicação, onde o acesso não autorizado poderia trazer mais prejuízos, por isso, é sempre importante desenvolver uma forma segura de verificar as credencias do usuário e isso fica ainda melhor se além de segura essa forma puder ser tão simples como a solução disponível no Zend Framework que será apresentada nesse artigo. A Classe Zend_Auth A classe Zend_Auth do Zend [...]]]></description>
			<content:encoded><![CDATA[<p>Boa parte das aplicações desenvolvidas para a web tem pelo menos uma pequena área de acesso restrito, essa área pode restringir o acesso a determinado conteúdo somente para usuários cadastrados ou pode até mesmo ser uma área de administração dessa aplicação, onde o acesso não autorizado poderia trazer mais prejuízos, por isso, é sempre importante desenvolver uma forma segura de verificar as credencias do usuário e isso fica ainda melhor se além de segura essa forma puder ser tão simples como a solução disponível no Zend Framework que será apresentada nesse artigo.</p>
<h3>A Classe Zend_Auth</h3>
<p>A classe Zend_Auth do Zend Framework é responsável por cuidar de todo o processo de autenticação e armazenamento da seção de login do usuário, deixando muito mais simples o trabalho de verificação das credenciais de acesso e permitindo a utilização de diversos modo de verificação, incluindo verificação de identidade através do banco de dados, através do protocolo HTTP e até mesmo através de serviços como OpenID. Além disso ela pode ser extendida para realizar a verificação por qualquer outro modo que não esteja disponível nativamente. Nesse artigo apenas o método de autenticação através do banco de dados será apresentado, mas você pode conferir a <a href="http://framework.zend.com/manual/en/zend.auth.html">Documentação Oficial da Classe Zend_Auth</a> caso precise realizar a autenticação através de outro método.</p>
<h3>Autenticação Através de Banco de Dados</h3>
<div id="attachment_1033" class="wp-caption alignleft" style="width: 110px"><a href="http://www.pauloeduardo.com/wp-content/uploads/2011/10/UserTable.png"><img class="size-full wp-image-1033 " title="Tabela de Usuários" src="http://www.pauloeduardo.com/wp-content/uploads/2011/10/UserTable.png" alt="Tabela de Usuários" width="100" height="86" /></a><p class="wp-caption-text">Tabela de Usuários</p></div>
<p>Para realizar a autenticação de usuário através do banco de dados é preciso ter uma tabela nesse banco com pelo menos duas colunas, o login e a senha, para critério de exemplo nesse artigo vou adicionar também o nome completo do usuário, seu e-mail, além disso o campo de senha será criptografado usando MD5 (lembrando que o uso de Md5 para armazenar senhas não é recomendado pois é um algorítimo com grande facilidade de quebra, nesse caso usarei apenas como exemplo). O diagrama ao lado ilustra o banco de dados que deverá ser criado para esse exemplo e abaixo transcrevo o código SQL desse banco:</p>
<pre>CREATE TABLE `User` (
	id    int(11) NOT NULL AUTO_INCREMENT,
	nome  varchar(255) NOT NULL,
	mail  varchar(255) NOT NULL,
	login varchar(255) NOT NULL,
	pass  varchar(255) NOT NULL,
	PRIMARY KEY (id)
);</pre>
<h4>O Formulário</h4>
<p>Para criar uma ferramenta de login precisamos criar um formulário por onde o usuário irá informar seus dados para que esses sejam verificados.</p>
<pre>&lt;?php

class Form_Login extends Zend_Form
{
	public function init()
	{
		$login = new Zend_Form_Element_Text('login');
		$login-&gt;setLabel('Login do Usuario')
			-&gt;setRequired(true)
			-&gt;addFilter('StripTags')
			-&gt;addFilter('StringTrim');

		$senha = new Zend_Form_Element_Password('senha');
		$senha-&gt;setLabel('Senha do Usuario')
			-&gt;setRequired(true)
			-&gt;addFilter('StripTags')
			-&gt;addFilter('StringTrim');

		$submit = new Zend_Form_Element_Submit('Entrar');
		$this-&gt;addElements(array($login, $senha, $submit));
	}
}</pre>
<p>O formulário acima contem apenas dois campos, o campo de login e o campo de senha, além é claro do botão que enviará esse formulário para que seus dados sejam processados, as informações sobre método de envio (GET ou POST) foram omitidas, mas é sempre bom lembrar que é altamente recomendável passar dados de login apenas por POST e nunca por GET já que no segundo caso eles ficam visíveis na URL.</p>
<h4>O Controller</h4>
<p>Praticamente toda a verificação de login nesse exemplo será realizada no Controller, por isso essa parte necessita de um pouco mais de atenção, abaixo segue o código desse controller que será devidamente explicado abaixo.</p>
<pre>public function loginAction(){
	if(Zend_Auth::getInstance()-&gt;hasIdentity()){
		$this-&gt;_redirect('index');
	}else{
		$this-&gt;view-&gt;form = new Form_Login();

		if($this-&gt;getRequest()-&gt;isPost() and $this-&gt;view-&gt;form-&gt;isValid($_POST)){
			$values = $this-&gt;view-&gt;form-&gt;getValues();

			$dbAdapter = Zend_Db_Table::getDefaultAdapter();
			$adapter = new Zend_Auth_Adapter_DbTable($dbAdapter);

			$adapter-&gt;setTableName('User')
				-&gt;setIdentityColumn('login')
				-&gt;setCredentialColumn('pass')
				-&gt;setIdentity($values['usuario'])
				-&gt;setCredential($values['senha'])
				-&gt;setCredentialTreatment('MD5(?)');;

			$auth = Zend_Auth::getInstance();
			$result = $auth-&gt;authenticate($adapter);

			if ($result-&gt;isValid()) {
				$this-&gt;_redirect('index');
			}else{
				$this-&gt;view-&gt;form-&gt;setDescription('Usuário ou Senha Inválidos');
			}
		}
	}
}</pre>
<p>Uma Action de Login (loginAction) está sendo criada e logo no início dessa Action está sendo chamado um método estático da classe Zend_Auth para verificar se o usuário já está logado, caso ele já esteja ele é direcionado para a página inicial, caso não esteja o formulário criado anteriormente é instanciado e armazenado na variável <em>$this-&gt;view-&gt;form</em>, ou seja está sendo armazenado em uma variável e passado a visão ao mesmo tempo.</p>
<p>Logo em seguida verificamos se existe uma requisição POST a essa ação e caso exista se o valores passados por essa requisição são válidos de acordo com os parâmetros de validação do formulário, nesse ponto cabe uma observação, caso a requisição não seja do tipo POST ou os valores não forem válidos o formulário será exibido na tela, ou seja, se o visitante ainda não envio nenhum dado para o formulário ou se esses dados estão errados (apenas do ponto de vista de validação de dados, não de login) ele será encaminhado ao formulário para enviar essas informações ou corrigir as informadas anteriormente.</p>
<p>Caso a requisição seja do tipo POST e os valores válidos chegou a hora de verificar se as credenciais estão corretas. A primeira coisa a ser feita é requisitar o adaptador padrão do banco de dados através do método <em>Zend_Db_Table::getDefaultAdapter()</em> e armazená-lo em uma variável, já que vamos precisar dele mais tarde, caso não exista um adaptador padrão previamente configurado será necessário iniciar uma conexão ao banco de dados. Em seguida é criada uma instancia da classe Zend_Auth_Adapter_DbTable passando como parâmetro o adaptador do banco citado anteriormente, e essa instância é armazenada em uma variável.</p>
<p>O próximo passo e passar as informações sobre os dados que serão usados por essa classe através dos métodos chamados logo em seguida. O método setTableName() recebe o nome da tabela de usuários no banco de dados, o método setIdentityColumn() recebe o nome da coluna do banco de dados onde está armazenada a informação de nome de usuário, setCredentialColumm por sua vez recebe o nome da coluna onde está armazenada a senha, os métodos setIdentity e setCredential recebem respectivamente os valores de login e senha passados pelo usuário e por fim o método setCredentialTreatment() recebe a informação sobre o tratamento que será fornecido a senha, nesse caso estamos utilizando a função md5() para criptografar essa senha.</p>
<p>Por fim requisitamos a instância da classe Zend_Auth e chamamos o método authenticate passando como parâmetro a instancia da classe Zend_Auth_Adapter_DbTable já com as informações armazenadas, se o retorno desse método for TRUE redirecionamos o usuário a página inicial se for FALSE incluimos uma descrição ao formulário com as informações de que o login e senha estão incorretos e enviamos o visitante de volta ao formulário para que ele preencha corretamente as informações.</p>
<h4>A View</h4>
<p>A View nesse caso só tem mesmo que exibir o formulário da seguinte fora:</p>
<pre>&lt;h2&gt;Acesso Restrito a Usuários Cadastrados&lt;/h2&gt;
&lt;?php echo $this-&gt;form; ?&gt;</pre>
<h3>Armazenando Informações na Seção de Login</h3>
<p>Através do método apresentado anteriormente foi possível verificar as credenciais do usuário que estava realizando o login e criar a seção de login do mesmo, porém nessa seção o único dado que foi armazenado foi o nome do usuário, porém as vezes é preciso que mais dados que estejam disponíveis na tabela do banco de dados também sejam armazenados, para isso basta realizar apenas uma pequena alteração no controller que ficará da seguinte forma:</p>
<pre>public function loginAction(){
	if(Zend_Auth::getInstance()-&gt;hasIdentity()){
		$this-&gt;_redirect('index');
	}else{
		$this-&gt;view-&gt;form = new Form_Login();

		if($this-&gt;getRequest()-&gt;isPost() and $this-&gt;view-&gt;form-&gt;isValid($_POST)){
			$values = $this-&gt;view-&gt;form-&gt;getValues();

			$dbAdapter = Zend_Db_Table::getDefaultAdapter();
			$adapter = new Zend_Auth_Adapter_DbTable($dbAdapter);

			$adapter-&gt;setTableName('User')
				-&gt;setIdentityColumn('login')
				-&gt;setCredentialColumn('pass')
				-&gt;setIdentity($values['usuario'])
				-&gt;setCredential($values['senha'])
				-&gt;setCredentialTreatment('MD5(?)');;

			$auth = Zend_Auth::getInstance();
			$result = $auth-&gt;authenticate($adapter);

			if ($result-&gt;isValid()) {
				$storage = $auth-&gt;getStorage();
				$storage-&gt;write($adapter-&gt;getResultRowObject(null,'pass'));

				$this-&gt;_redirect('index');
			}else{
				$this-&gt;view-&gt;form-&gt;setDescription('Usuário ou Senha Inválidos');
			}
		}
	}
}</pre>
<p>Logo antes de redirecionar o usuário para a página inicial foi chamado o método getStorage() da classe Zend_Auth e em seguida chamado o método write que recebe como parâmetro o retorno do método getResultRowObjet() que por sua vez pode receber como primeiro parâmetro uma lista de colunas do banco de dados que serão armazenadas (nesse caso foi passado null, que fará com que todas as colunas sejam armazenadas) e como segundo parâmetro uma lista das colunas que não serão armazenadas (nesse caso passamos o nome da coluna que contem a senha), ou seja, todas as colunas exceto a que contém a senha serão armazenadas, depois de ter realizado esse processo basta realizar o seguinte procedimento para exibir as informações da seção de login:</p>
<pre>echo Zend_Auth::getInstance()-&gt;getIdentity(); //Retorna o Login do Usuário mesmo que um Storage não tenha sido criado
echo Zend_Auth::getInstance()-&gt;getIdentity()-&gt;nome; //Retorna o Nome do Usuário
echo Zend_Auth::getInstance()-&gt;getIdentity()-&gt;email; //Retorna o E-mail do Usuário</pre>
<h3>Conclusão</h3>
<p>Através da classe apresentada nesse artigo é possível realizar de forma fácil e segura a autenticação do usuário através de diversos meios, aqui apenas um desses meios foi mostrado mas tenha certeza de que com pouca mudança no que foi apresentado é possível se adaptar a qualquer que seja a sua necessidade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Adcionando Paginadores à Paginas com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 13:00:25 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Paginação]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Paginator]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1028</guid>
		<description><![CDATA[Quando não é possível determinar o número exato de resultados que podem aparecer em uma página ou quando esse número de resultados é muito grande, uma prática excelente é usar um paginador para limitar o número de resultados que serão exibidos em cada um das páginas, dessa forma evita-se que uma página se torne muito extensa e que seu tamanho interfira no tempo de carregamento da mesma, além de deixá-la muito mais agradável visualmente. Paginadores no Zend Framework O Zend Framework possui uma classe de paginação própria, que facilita muito esse trabalho e ainda possibilita um excelente controle do modo [...]]]></description>
			<content:encoded><![CDATA[<p>Quando não é possível determinar o número exato de resultados que podem aparecer em uma página ou quando esse número de resultados é muito grande, uma prática excelente é usar um paginador para limitar o número de resultados que serão exibidos em cada um das páginas, dessa forma evita-se que uma página se torne muito extensa e que seu tamanho interfira no tempo de carregamento da mesma, além de deixá-la muito mais agradável visualmente.</p>
<h3>Paginadores no Zend Framework</h3>
<p>O Zend Framework possui uma classe de paginação própria, que facilita muito esse trabalho e ainda possibilita um excelente controle do modo como esse paginador será exibido em página, a classe Zend_Paginator permite ainda que vários tipos de dados sejam paginados, os tipos mais comuns são dados contidos em um array e dados provenientes de um banco de dados, nesse artigo iremos abordar apenas o último desses tipos, mas a implementação em cada um deles é bastante semelhante.</p>
<h3>Paginando Resultados do Banco de Dados</h3>
<p>Para realizar a paginação de dados provenientes de um banco de dados obviamente é preciso ter um banco de dados, e pelo menos alguns dados inseridos nele, não vou entrar no mérito de criação desse banco de dados, pois muitos artigos anteriores já usaram diferentes bancos de dados com diferentes informações e o processo de criação de cada um desses bancos já foi detalhado anteriormente, nesse exemplo vou apenas assumir que existe um banco de dados, cuja conexão já está devidamente configurada no Zend Framework, com pelo menos uma tabela de usuários cujo Model também já foi criado.</p>
<h4>Controller</h4>
<p>O Paginador de banco de dados do Zend_Framework recebe como parâmetro um conjunto de dados provenientes do banco (rowset) e a partir desse conjunto de dados exibe apenas os resultados definidos pela configuração desse paginador, o código a seguir ilustra a parte dessa ação que é realizada no Controller:</p>
<pre>public function indexAction(){
	$pagina = $this-&gt;_getParam('pagina', 1);

	$userModel = new User();
	$rowsetUser = $userModel-&gt;fetchAll();

	$paginador = Zend_Paginator::factory($rowsetUser);
	$paginador-&gt;setItemCountPerPage(20);
	$paginador-&gt;setPageRange(9);
	$paginador-&gt;setCurrentPageNumber($pagina);

	$this-&gt;view-&gt;paginador = $paginador;
}</pre>
<p>Nesse exemplo todos os registros da tabela de usuário estão sendo buscados pelo método <em>fetchAll()</em> do Model de Usuários (<em>$userModel</em>) e então esses dados estão sendo passados para o método estático <em>factory()</em> da classe Zend_Paginator, esse método irá interpretar qual o tipo de dados está sendo passado para o paginador e realizar as ações necessárias para o tipo em questão.</p>
<p>Em seguida são feitas algumas configurações no paginador, a primeira delas e configurar o número máximo de itens por página para 20, seguido do número de páginas que será exibido nos controles de página e por último informando ao paginador qual página deverá ser exibida, a variável <em>$pagina</em> usada nesse caso armazena o número de página que está sendo passado pela URL e caso isso não tenha ocorrido assume que o número da página é 1 (Linha 1 do Código). Por último o paginador e passado para a view na variável <em>$this-&gt;view-&gt;paginador</em>.</p>
<h4>Partial View</h4>
<p>Depois de criar as ações no seu controller é preciso criar uma a estrutura dos controles de paginação, o código abaixo é um exemplo desse tipo de estrutura, é uma alteração do exemplo contido na documentação oficial do framework traduzido para o português:</p>
<pre>&lt;?php if ($this-&gt;pageCount): ?&gt;
	&lt;div&gt;
		&lt;!-- Controle de Página Anterior --&gt;
		&lt;?php if (isset($this-&gt;previous)): ?&gt;
			&lt;a href="&lt;?php echo $this-&gt;url(array('pagina' =&gt; $this-&gt;previous)); ?&gt;"&gt;&amp;lt; Anterior&lt;/a&gt; |
		&lt;?php else: ?&gt;
			&lt;span&gt;&amp;lt; Anterior&lt;/span&gt; |
		&lt;?php endif; ?&gt;

		&lt;!-- Controle Numérico de Página --&gt;
		&lt;?php foreach ($this-&gt;pagesInRange as $page): ?&gt;
			&lt;?php if ($page != $this-&gt;current): ?&gt;
				&lt;a href="&lt;?php echo $this-&gt;url(array('pagina' =&gt; $page)); ?&gt;"&gt;&lt;?php echo $page; ?&gt;&lt;/a&gt; |
			&lt;?php else: ?&gt;
				&lt;?php echo $page; ?&gt; |
			&lt;?php endif; ?&gt;
		&lt;?php endforeach; ?&gt;

		&lt;!-- Controle de Próxima Página --&gt;
		&lt;?php if (isset($this-&gt;next)): ?&gt;
			&lt;a href="&lt;?php echo $this-&gt;url(array('pagina' =&gt; $this-&gt;next)); ?&gt;"&gt;Próxima &amp;gt;&lt;/a&gt;
		&lt;?php else: ?&gt;
			&lt;span&gt;Próxima &amp;gt;&lt;/span&gt;
		&lt;?php endif; ?&gt;
	&lt;/div&gt;
&lt;?php endif; ?&gt;</pre>
<p>Esse código deve ser inserido dentro de um arquivo .phtml nesse exemplo vou assumir que esse arquivo está dentro do diretório views/scripts/layout/paginador.phtml mas você pode armazená-lo no lugar que achar melhor, o código acima também é apenas um exemplo de estrutura possível que pode ser alterado para atender as necessidades específicas de cada aplicação.</p>
<h4>Action View</h4>
<p>No arquivo de view da Action em questão tudo que precisa ser feito é o seguinte:</p>
<pre>&lt;?php if (count($this-&gt;paginador)): ?&gt;
	&lt;ul&gt;
		&lt;?php foreach ($this-&gt;paginador as $user): ?&gt;
			&lt;li&gt;&lt;?php echo $user-&gt;name; ?&gt;&lt;/li&gt;
		&lt;?php endforeach; ?&gt;
	&lt;/ul&gt;
&lt;?php endif; ?&gt;
&lt;?php echo $this-&gt;paginationControl($this-&gt;paginador, 'Sliding', 'layout/paginador.phtml'); ?&gt;</pre>
<p>Como é possível ver o dados estão sendo exibidos normalmente como se viessem diretamente do banco de dados, a única diferença é que ao final está sendo incluída a instrução para exibir o paginador, o método paginationControl() recebe três parâmetros, o primeiro deles é a instância do paginador que está sendo utilizado, o segundo é o estilo do paginador, para uma lista completa dos estilos disponível você pode acessar a Documentação da Classe Zend_Paginator, e o último parâmetro e o caminho para o arquivo com a estrutura dos controles que foi criado anteriormente.</p>
<p>Para simplificar ainda mais esse processo você pode configurar os padrões desse paginador incluindo no seu arquivo de Bootstrap a seguinte instrução:</p>
<pre>public function _initPaginator(){
	Zend_Paginator::setDefaultScrollingStyle('Sliding');
	Zend_View_Helper_PaginationControl::setDefaultViewPartial('layout/paginador.phtml');
}</pre>
<p>Feito isso você pode alterar a chamada para os controles de paginação (última linha do código da view Action no início do tópico) para apenas a seguinte instrução:</p>
<pre>&lt;?php echo $this-&gt;paginador; ?&gt;</pre>
<h3>Conclusão</h3>
<p>Com Zend_Paginator e alguns passos simples é possível melhorar significativamente a experiência do usuário na página e ainda reduzir o tempo de carregamento da mesma e o consumo de trafego do servidor de hospedagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Traduzindo Mensagens dos Formulários do Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 13:00:23 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tradução]]></category>
		<category><![CDATA[Translate]]></category>
		<category><![CDATA[Validação]]></category>
		<category><![CDATA[Validate]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Translate]]></category>
		<category><![CDATA[Zend_Validate]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1025</guid>
		<description><![CDATA[Artigo rápido sobre como configurar a tradução das mensagens de erro de validação dos formulários criados com Zend_Form a partir dos arquivos de linguagem disponíveis com a versão completa do framework. Baixando os Arquivos com as Traduções Os arquivos com as traduções do Zend Framework estão disponíveis somente com a versão completa do framework que pode ser baixada no Site Oficial, esses arquivos não estão disponíveis nem na versão mínima do framework, nem mesmo são importados para o projeto quando se realiza a criação da estrutura de diretórios a partir do Zend_Tool ou Zend Studio, por isso é fundamental que [...]]]></description>
			<content:encoded><![CDATA[<p>Artigo rápido sobre como configurar a tradução das mensagens de erro de validação dos formulários criados com Zend_Form a partir dos arquivos de linguagem disponíveis com a versão completa do framework.</p>
<h3>Baixando os Arquivos com as Traduções</h3>
<p>Os arquivos com as traduções do Zend Framework estão disponíveis somente com a versão completa do framework que pode ser baixada no Site Oficial, esses arquivos não estão disponíveis nem na versão mínima do framework, nem mesmo são importados para o projeto quando se realiza a criação da estrutura de diretórios a partir do Zend_Tool ou Zend Studio, por isso é fundamental que o download da biblioteca completa seja realizado. Após realizar esses download descompacte os arquivos e  copie a pasta &#8220;resources&#8221; que vem junto com o framework para a raiz do diretório do seu projeto.</p>
<h3>Configurando o Bootstrap</h3>
<p>Basicamente tudo que é preciso fazer para traduzir as mensagens de erro é configurar o seu arquivo de Bootstrap para incluir a linguagem desejada no tradutor padrão da seguinte forma:</p>
<pre>public function _initTranslate() {
	$translator = new Zend_Translate ( array ('adapter' =&gt; 'array', 'content' =&gt; '../resources/languages', 'locale' =&gt; 'pt_BR', 'scan' =&gt; Zend_Translate::LOCALE_DIRECTORY ) );
	Zend_Validate_Abstract::setDefaultTranslator ( $translator );
}</pre>
<p>Tudo que está sendo feito e criar uma instância da classe Zend_Translate e passar um array com os parâmetros de tipo de tradução, caminho para os arquivos de tradução e linguagem desejada, em seguida chamar o método estático <em>setDefaultTranslator()</em> da classe Zend_Validate_Abstract, passando a instância da classe Zend_Translate criada anteriormente.</p>
<h3>Traduzindo Mensagens de Seus Próprios Validadores</h3>
<p>Se você mesmo criou um validador personalizado e deseja que esse validador também esteja disponível em mais de uma linguagem, o processo é igualmente simples, deixa a mensagem de validação do corpo da sua classe de validação em inglês, assim esse validador seguirá o padrão do Zend Framework, em seguida insira mais um item no array cuja chave deve ser a sua mensagem de validação personalizada e o valor dessa variável a tradução para a linguagem desejada, como no exemplo a seguir:</p>
<pre>"My Personal Message" =&gt; "Minha Mensagem Personalizada",
"'%value%' is not a valid CEP" =&gt; "'%value%' não é um CEP válido",</pre>
<p>Se você usou termos coringa na sua mensagem de erro, como &#8216;%value%&#8217;, por exemplo, você também pode incluir esses valores coringa na sua mensagem de erro, como no segundo exemplo acima.</p>
<h3>Conclusão</h3>
<p>Com isso você pode deixar as mensagens da sua aplicação na mesma linguagem do restante da aplicação sem ter que alterar todas as classes de validação do framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerenciando Configurações com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/10/27/gerenciando-configuracoes-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/10/27/gerenciando-configuracoes-com-zend-framework/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 14:45:12 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Config]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Config]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1006</guid>
		<description><![CDATA[Arquivos de configurações são muito comuns em Zend Framework, quando um projeto com base no Zend Tool é criado o próprio framework já armazana automaticamente algumas configurações em arquivos, mas o uso de configurações com Zend Framework vai muito além disso, nesse artigo pretendo mostrar um pouco seu funcionamento. Aprendendo a Usar Configurações com Zend Framework As informações de configurações no Zend Framework são armazanadas no formato chave-valor e o uso mais básico de Zend_Config se da ao passar um array de configurações para o construtor da classe que irá interpreta-lo, permitindo que essas informações sejam utilizadas como informações de [...]]]></description>
			<content:encoded><![CDATA[<p>Arquivos de configurações são muito comuns em Zend Framework, quando um projeto com base no Zend Tool é criado o próprio framework já armazana automaticamente algumas configurações em arquivos, mas o uso de configurações com Zend Framework vai muito além disso, nesse artigo pretendo mostrar um pouco seu funcionamento.</p>
<h3>Aprendendo a Usar Configurações com Zend Framework</h3>
<p>As informações de configurações no Zend Framework são armazanadas no formato chave-valor e o uso mais básico de Zend_Config se da ao passar um array de configurações para o construtor da classe que irá interpreta-lo, permitindo que essas informações sejam utilizadas como informações de configurações da seguinte forma:</p>
<pre>$informacoes = array(
	'applicationName'  =&gt; 'Nome da Aplicação',
	'applicationInfo' =&gt; array(
		'version' =&gt; '1.0',
		'description' =&gt; 'Descrição da Aplicação'
	)
);</pre>
<pre>O array acima possui algumas informações básicas da aplicação, para que essas informações sejam utilizadas atraves do Zend_Config basta passas esse array como parametro ao instanciar a classe da seguinte forma:</pre>
<pre>$config = new Zend_Config($informacoes);</pre>
<p>Após essa inicialização é possível recuperar cada uma dessas informações da seguinte forma:</p>
<pre>$name = $config-&gt;applicationName;
$version = $config-&gt;applicationInfo-&gt;version</pre>
<h3>Armazenando as Configurações em Arquivos</h3>
<p>Armazenar configurações em arquivos e quase tão simples quanto o uso do Zend_Config com um array, nesse artigo vamos utilizar como exemplo arquivos .ini, porem o Zend permite ainda que sejam utilizados arquivos .json .xml e .yaml você poderá usar qualquer um de sua preferencia e todos funcionarão praticamente da mesma forma. Para critério de exemplo vamos utilizar as mesmas informações que forma utilizadas anteriormente e armazena-las em um arquivo config.ini dentro do diretório application/configs com o seguinte conteúdo:</p>
<pre>[production]
applicatioName                = Nome da Aplicação
applicatioInfo.version        = 1.0
applicatioInfo.description    = Descrição da Aplicação

[development : production]
applicatioInfo.version        = 0.5</pre>
<p>Note que além de armazenar as mesmas informações que o exemplo anterior nesse caso também foi criada uma herança de configurações onde a versão da aplicação do servidor de produção é alterada quando estamos trabalhando em um servidor de desenvolvimento, agora podemos recuperar essas informações e exibi-las na rela da seguinte forma da seguinte forma:</p>
<pre>$config = new Zend_Config_Ini('../application/configs/config.ini', 'development');

echo $config-&gt;applicationName; // imprime "Nome da Aplicação" na tela
echo $config-&gt;applicationInfo-&gt;version; // imprime "0.5" na tela</pre>
<h3>Alterando os Arquivos de Configurações</h3>
<p>O Zend Framework permite ainda que as informações contidas nos arquivos de configuração sejam dinamicamente alteradas pela aplicação, porem antes de trabalhar com escrita em arquivos é preciso se certificar que os arquivos de configuração tenham as permissões corretas permitindo que eles sejam alterados, após se certificar dessas permissões basta realizar as alterações conforme o exemplo abaixo:</p>
<pre>//Inicializa o Zend_Config e Cria os Ambientes
$config = new Zend_Config(array(), true);
$config-&gt;production = array();
$config-&gt;staging    = array();

//Define as Heranças
$config-&gt;setExtend('development', 'production');

//Cria as Variáveis de Configuração
$config-&gt;production-&gt;applicationName = 'Nome da Aplicação';
$config-&gt;production-&gt;applicationInfo = array();
$config-&gt;production-&gt;applicationInfo-&gt;version = '1.0';
$config-&gt;production-&gt;applicationInfo-&gt;description = 'Descrição da Aplicação';

$config-&gt;development-&gt;applicationInfo = array();
$config-&gt;development-&gt;applicationInfo-&gt;version = '0.5';

//Escreve as informações no arquivo writer.ini
$writer = new Zend_Config_Writer_Ini();
$writer-&gt;write('../application/configs/write.ini', $config);</pre>
<p>O código acima irá criar um arquivo de configuração exatamente igual ao exemplo anterior porém irá armazena-lo no arquivo write.ini do mesmo diretório.</p>
<h3>Modificando Informações de Arquivos de Configurações</h3>
<p>Além de poder inserir novas configurações em um arquivo de configuração você ainda pode alterar as já existentes da seguinte forma:</p>
<pre>//Le o arquivo de configuração e habilita as alterações
$config = new Zend_Config_Ini('../application/configs/write.ini',
null,
array('skipExtends' =&gt; true,
allowModifications' =&gt; true));

//Altera os Valores Desejados
$config-&gt;development-&gt;applicationInfo-&gt;version = '0.6';

//Altera as novas informações no arquivo writer.ini
$writer = new Zend_Config_Writer_Ini();
$writer-&gt;write('../application/configs/write.ini', $config);</pre>
<p>Dessa forma você estará alterando a configuração de versão do sistema no ambiente de desenvolvimento armazenada no arquivo writer.ini de 0.5 para 0.6.</p>
<h3>Conclusão</h3>
<p>O uso mais comun dos arquivos de configuração é o armazenamento das informaçõe de banco de dados, porém são inumeras as possibilidade de utilização desse tipo de arquivo, cada aplicação poderá ter uma gama diferente de informações de configuração necessárias e por isso é muito importate saber utilizar o Zend_Config para usufruir de todo o poder do Zend Framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/10/27/gerenciando-configuracoes-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criação de Layouts com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/10/25/criacao-de-layouts-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/10/25/criacao-de-layouts-com-zend-framework/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 13:00:25 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Layout]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Layout]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=994</guid>
		<description><![CDATA[Em boa parte das aplicações e dos sites é muito comum que a interface visual do mesmo se mantenha ao longo das páginas e somente seu conteúdo e alguns elementos visuais variem de uma página para outra, por isso é bastante desnecessário que toda essa interface visual seja totalmente recriada a cada nova página que for criada, mesmo que isso se resuma a copiar e colar o código em um novo arquivo. Para resolver esse problema o Zend Framework possui a classe Zend Layout que será demonstrada nesse artigo. Habilitando o Zend Layout Para que o framework interprete que sua [...]]]></description>
			<content:encoded><![CDATA[<p>Em boa parte das aplicações e dos sites é muito comum que a interface visual do mesmo se mantenha ao longo das páginas e somente seu conteúdo e alguns elementos visuais variem de uma página para outra, por isso é bastante desnecessário que toda essa interface visual seja totalmente recriada a cada nova página que for criada, mesmo que isso se resuma a copiar e colar o código em um novo arquivo. Para resolver esse problema o Zend Framework possui a classe Zend Layout que será demonstrada nesse artigo.</p>
<h3>Habilitando o Zend Layout</h3>
<p>Para que o framework interprete que sua aplicação está utilizando a classe Zend_Layout para renderizar a interface visual você primeiro precisa habilitar seu funcionamento, o que é feito inserindo no seu arquivo Bootstrap.php a seguinte instrução:</p>
<pre>public function _initLayout(){
	Zend_Layout::startMvc(array(
		'layout'=&gt; 'default',
		'layoutPath' =&gt; '../application/views/scripts/layout'
	));
}</pre>
<p>No código acima está sendo criado um método <em>_initLayout()</em> que será executado no início da aplicação (assim como qualquer outro método iniciado por &#8220;_init&#8221; criado na classe de Bootstrap) e nele está sendo chamado o método estático <em>startMVC()</em> da classe Zend_Layout para esse método está sendo passado um array com dois elementos, o primeiro, cuja chave é &#8220;layout&#8221; informa o nome do arquivo do layout que será usado pela aplicação (nesse caso &#8220;default&#8221;) e o segundo &#8220;layoutPath&#8221; informa o caminho para esse arquivo, nesse caso ele será armazenado no diretório application/views/scripts/layout.</p>
<h3>Criando o Layout</h3>
<p>Agora que já o uso de Zend_Layout já foi habilitado é preciso criar o arquivo default.phtml dentro do diretório application/views/scripts/layout, nesses exemplos vamos inserir a seguinte marcação HTML nele:</p>
<pre>&lt;!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
        &lt;title&gt;Minha Aplicação com Layout&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;?php echo $this-&gt;layout()-&gt;content;?&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Tudo o que foi feito foi criar um arquivo HTML simples com apenas uma instrução em PHP &#8220;<em>echo $this-&gt;layout()-&gt;content;</em>&#8221; essa instrução irá inserir nesse local do código o conteúdo da sua Action.</p>
<h3>Inserção de Conteúdo</h3>
<p>Após o layout ter sido habilitado e criado você pode dar prosseguimento ao desenvolvimento da sua aplicação normalmente, para esse exemplo vamos criar a página inicial da sua aplicação, dessa forma criaremos o arquivo IndexController no sue diretório de controllers da seguinte forma:</p>
<pre>&lt;?php
class Admin_IndexController extends Zend_Controller_Action
{
    public function init(){}

    public function indexAction(){
        $this-&gt;view-&gt;tituloPagina = 'Titulo da Página';
    }
}</pre>
<p>No código acima foi criado o método indexAction que recebe apenas uma instrução criando a variável <em>tituloPagina</em> para ser passada para a view que ficará da seguinte forma:</p>
<pre>&lt;h1&gt;&lt;?php echo $this-&gt;tituloPagina; ?&gt;&lt;/h1&gt;</pre>
<p>Sim, isso mesmo, já que já criamos todo o arquivo com o layout anteriormente a view só precisa ter o conteúdo da página mesmo, que no nosso exemplo é só uma tag h1 com o titulo da página, obviamente em um caso real haveria mais conteúdo do que esse, mas isso não muda o fato de torna o trabalho com layout muito mais simples.</p>
<h3>Realizando Chamadas a Outros Arquivos no Layout</h3>
<p>É muito provável que sua aplicação não tenha somente um titulo como conteúdo, muito provavelmente ela terá um menu, o código desse menu pode ser inserido juntamente com o arquivo default.phtml, mas também pode ser que você queira deixa-lo em um arquivo separado para facilitar a manutenção, isso é muito simples, basta criar dentro da mesma pasta do arquivo default.phtml um outro arquivo (que chamaremos de nav.phtml) e inserir a marcação do seu menu nele, algo similar ao apresentado abaixo:</p>
<pre>&lt;ul&gt;
	&lt;li&gt;&lt;a href="index/index"&gt;&lt;/a&gt;Home&lt;/li&gt;
	&lt;li&gt;&lt;a href="index/news"&gt;&lt;/a&gt;News&lt;/li&gt;
	&lt;li&gt;&lt;a href="index/contato"&gt;&lt;/a&gt;Contato&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>O menu do exemplo é composto de somente uma lista não ordenada de três itens com links para suas respectivas páginas. Agora é preciso alterar o arquivo de Layout para incluir a chamada para o arquivo do menu, ele ficará da seguinte forma:</p>
<pre>&lt;!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
        &lt;title&gt;Minha Aplicação com Layout&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;?php echo $this-&gt;render('nav.phtml');?&gt;
        &lt;?php echo $this-&gt;layout()-&gt;content;?&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>O que foi feito foi somente incluir a referência ao arquivo do menu logo antes do conteúdo, nesse caso o menu será apresentado juntamente com sua página.</p>
<h3>Trocando e Desabilitando o Layout</h3>
<p>Em alguns caso pode ser que uma determinada ação dentro da sua aplicação utilize um layout diferente então será necessário trocar esse layout, também é possível que outra ação não utilize layout algum, nos dois casos a solução é simples e é apresentada abaixo:</p>
<pre>class Admin_IndexController extends Zend_Controller_Action
{
	public function init(){}

	public function indexAction(){
		$this-&gt;view-&gt;tituloPagina = 'Titulo da Página';
	}

	public function newsAction(){
		Zend_Layout::getMvcInstance()-&gt;setLayout('novolayout.phtml');
		Zend_Layout::getMvcInstance()-&gt;setLayoutPath('../application/views/scripts/novolayout');

	}

	public function contatoAction(){
		Zend_Layout::getMvcInstance()-&gt;disableLayout();
	}
}</pre>
<p>No exemplo acima foram criadas mais duas Actions, a primeira para a página de notícias que utiliza um layout diferente, esse layout está disponível em um arquivo novolayout.phtml na pasta application/views/scripts/novolayout conforme definido pelos métodos <em>setLayout()</em> e <em>setLayoutPath()</em> respectivamente, já a outra Action é responsável pela página de contato que não utiliza layout, nesse caso o layout foi desabilitado pelo método <em>disableLayout()</em> conforme mostrado acima.</p>
<h3>Conclusão</h3>
<p>Esse é apenas o básico sobre Layout com Zend Framework, você pode fazer muitas outras coisas com essa classe, mas só com isso já é possível perceber que o Zend_Layout poupa muito do trabalho que seria gasto caso a mesma marcação HTML tivesse que ser reproduzida em todas as páginas onde ela fosse usada. Para uma visão melhor das outras possibilidade da classe consulte a <a href="http://framework.zend.com/manual/en/zend.layout.html">documentação oficial da classe Zend_Layout</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/10/25/criacao-de-layouts-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Action Helpers com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/10/20/action-helpers-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/10/20/action-helpers-com-zend-framework/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 13:00:23 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Action Helpers]]></category>
		<category><![CDATA[Helpers]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=983</guid>
		<description><![CDATA[No artigo anterior falei um pouco sobre as view helper, que são funções ou métodos criados para serem acessados diretamente na camada de visão da sua aplicação, hoje vou falar um pouco sobre as Action Helpers do Zend Framework. O que São Action Helper Action Helpers são similares as View Helpers, criados para auxiliar nas funções corriqueiras de sua aplicação porém seu objetivo e que sejam acessadas diretamente através da sua camada de Controle, além disso os Action Helpers podem ser instanciados como classes normais podendo assim ser manipulados de forma mais completa. Action Helpers Nativas O Zend Framework possui [...]]]></description>
			<content:encoded><![CDATA[<p>No artigo anterior falei um pouco sobre as view helper, que são funções ou métodos criados para serem acessados diretamente na camada de visão da sua aplicação, hoje vou falar um pouco sobre as Action Helpers do Zend Framework.</p>
<h3>O que São Action Helper</h3>
<p>Action Helpers são similares as View Helpers, criados para auxiliar nas funções corriqueiras de sua aplicação porém seu objetivo e que sejam acessadas diretamente através da sua camada de Controle, além disso os Action Helpers podem ser instanciados como classes normais podendo assim ser manipulados de forma mais completa.</p>
<h3>Action Helpers Nativas</h3>
<p>O Zend Framework possui uma lista de Action helpers que são implementadas nativamente, para consultar essa lista basta verificar a <a href="http://framework.zend.com/manual/en/zend.controller.actionhelpers.html">Documentação Oficial dos Action Helpers</a> apenas para demonstar seu funcionamento irei utilizar de exemplo a Action Helper <em>FlashMessage() </em>que tem como objetivo implementar um modo de passar mensagens entre um controlador e outro. A seguir uma demonstração de seu funcionamento:</p>
<pre>$this-&gt;_helper-&gt;flashMessenger-&gt;addMessage('Mensagem a Ser Passada');</pre>
<p>O código acima mostra como adicionar uma mensagem para que essa seja passada a outro Controller, esse método pode ser acessado diretamente do seu Controller da forma exata como apresentado acima. Após adicionar todas as mensagens necessárias e em outros Controller o procedimento para recuperar essas mensagens é o seguinte:</p>
<pre>$this-&gt;view-&gt;messages = $this-&gt;_helper-&gt;flashMessenger-&gt;getMessages();</pre>
<p>O código acima chama o método getMessages do Action Helper em questão que retorna um array com as mensagens que foram adicionadas anteriormente, esse array é então armazenado na variável <em>$this-&gt;view-&gt;message </em>para que possa ser impresso na tela na camada de visão da seguinte forma:</p>
<pre>&lt;?php foreach ($this-&gt;messages as $message) : ?&gt;
	&lt;p&gt;&lt;?php echo $this-&gt;escape($message); ?&gt;&lt;/p&gt;
&lt;?php endforeach; ?&gt;</pre>
<p>Portanto através desse Action Helper é possível passar mensagens necessárias a sua aplicação de um Controller para outro de forma super simples.</p>
<h3>Criando Seu Próprio Action Helper</h3>
<p>Antes de criar um Action Helper é preciso preparar a estrutura da aplicação para que possamos armazenar os arquivos de cada um desses Action Helpers no lugar correto para isso crie dentro de seu diretório library uma pasta nomeada de Helpers e em seguida altere seu arquivo Bootstrap.php para incluir a seguinte instrução:</p>
<pre>protected function _initHelpers()
{
	Zend_Controller_Action_HelperBroker::addPath(‘Helper’);
}</pre>
<p>Agora é possível armazenar os helpers na pasta criada que o Zend Framework irá localiza-los corretamente. Para exemplificar como são criados os Action Helper vamos criar a mesma função que criamos no artigo sobre Views Helpers porem agora para que essa seja acessada pelo controller:</p>
<pre>&lt;?php
class Zend_Controller_Action_Helper_ApplicationName extends Zend_Controller_Action_Helper_Abstract
{
	/**
	 * @var Zend_Loader_PluginLoader
	 */
	public $pluginLoader;
	/**
	 * Constructor: initialize plugin loader
	 *
	 * @return void
	 */    

	public function __construct ()
	{
		// TODO Auto-generated Constructor
		$this-&gt;pluginLoader = new Zend_Loader_PluginLoader();
	}

	public function getApplicationName(){
		return "Nome da Aplicação";
	}

	/**
	 * Strategy pattern: call helper as broker method
	 */
	public function direct ()
	{
		return $this-&gt;getApplicationName();
	}
}</pre>
<p>Boa parte da classe acima foi gerada automaticamente pelo Zend_Tool caso você também esteja utilizando o Zend_Tool ou o Zend Studio pode usufruir das suas facilidades para tornar o processo mais simples, tudo que foi feito foi criar um método <em>applicationName()</em> que retorna o nome da aplicação e alterar o método <em>direct() </em>para chamar esse mesmo método. O método <em>direct() </em>é chamado quando Action Helper é utilizado diretamente no Controller, dessa froma existem duas formas de chamar esse método no seu Controller:</p>
<pre>$nomeAplicação = $this-&gt;_helper-&gt;applicationName();

$helper = $this-&gt;_helper-&gt;getHelper(applicationName);
$nomeAplicação = $helper-&gt;getApplicationName();</pre>
<p>A primeira linha do código acima chama o helper diretamente o que fará com que ele acesso o método <em>direct().</em> As duas linhas seguintes criam um instância do helper e chamam o método <em>getApplicationName()</em> respectivamente. Nesse caso os dois modos irão produzir o mesmo efeito mas caso seu helper possua mais de um método você poderá chama-los individualmente.</p>
<h3>Conclusão</h3>
<p>Tanto Views Helpers quanto Action Helpers podem ajudar bastante a realizar atividades corriqueiras dentro de sua aplicação visto que permitem criar métodos que fiquem acessíveis na camada de Visão ou na camada de Controle da toda a aplicação, dessa forma não existe a necessidade de se repetir a criação da função sempre que necessário nem a necessidade de criar um classe completa para ser incorporada ao Framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/10/20/action-helpers-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

