<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Paulo Eduardo</title>
	
	<link>http://www.pauloeduardo.com</link>
	<description>Tecnologia, Negócios e o Mundo</description>
	<lastBuildDate>Wed, 12 Dec 2012 01:26:51 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/pauloeduardo" /><feedburner:info uri="pauloeduardo" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Tecnologia, Negócios e o Mundo</itunes:subtitle><item>
		<title>Natal, Ano Novo, Resumo e Planos</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/pkPlLnOHFAI/</link>
		<comments>http://www.pauloeduardo.com/2011/12/14/natal-ano-novo-resumo-e-planos/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 16:50:23 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Mundo]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1089</guid>
		<description><![CDATA[Como eu já venho, desde que retomei as atividades do blog no início desse ano, a cada semestre escrevo um artigo com um resumo de tudo que aconteceu nos últimos seis meses e com o planejamento para os próximos meses, esse artigo serve tanto de guia para minhas atividades do semestre, quanto para manter os leitores atualizados sobre as novidades do blog e da Psyco. Resumo do Semestre No início do ano tinha como meta para o blog realizar a publicação de pelo menos um artigo por semana, esse planejamento foi mais do que cumprido, durante o segundo semestre, mas [...]]]></description>
				<content:encoded><![CDATA[<p>Como eu já venho, desde que retomei as atividades do blog no início desse ano, a cada semestre escrevo um artigo com um resumo de tudo que aconteceu nos últimos seis meses e com o planejamento para os próximos meses, esse artigo serve tanto de guia para minhas atividades do semestre, quanto para manter os leitores atualizados sobre as novidades do blog e da Psyco.</p>
<h3>Resumo do Semestre</h3>
<p>No início do ano tinha como meta para o blog realizar a publicação de pelo menos um artigo por semana, esse planejamento foi mais do que cumprido, durante o segundo semestre, mas especificamente no meio da série sobre Gerenciamento de Projetos esse número de artigos passou a ser de dois por semana, isso aconteceu em consequência do grande conteúdo referente a gerenciamento de projetos com o qual eu queria trabalhar e graças a aceitação que a série teve com os leitores, estando até hoje entre os artigos mais lidos do blog, com o fim da série, o volume de publicações do blog voltou a ser novamente de 1 artigo por semana, foram 68 artigos publicados ao todo no blog esse ano, fazendo com que a meta tenha sido cumprida.</p>
<p>Além disso no início desse semestre estabeleci com metas, algumas mudanças no blog, incluindo mudanças na plataforma utilizada e mudanças nas áreas de comentários, essas mudanças começaram a ser realizadas mas ainda não foram concluídas, mas em breve essas novidades vão estar presentes no blog.</p>
<p>No que diz respeito ao desenvolvimento do Psyco Content Manager, o sistema de gerenciamento de conteúdo da Psyco, os sistema foi implantado inicialmente em alguns clientes que já o estão utilizando e como retorno dessas implantações foram obtidas muitas sugestões de melhorias para o sistema, essas melhorias estão sendo realizadas em paralelo ao desenvolvimento de novos módulos para o sistema, alguns que já estavam previstos anteriormente e outros que foram incorporados ao longo do semestre.</p>
<h3>Planos para o Próximo Semestre</h3>
<p>Com relação ao blog o plano para o próximo semestre é de concluir as alterações nas áreas de comentário e realizar a migração total do blog para o Psyco Content Manager (O site da Psyco já está sendo desenvolvido com a plataforma própria e com a mudança do blog deverá haver uma maior integração entre eles).</p>
<p>Os outros planos para o próximo semestre estão mais relacionados ao Psyco Content Manager, no começo desse semestre haviam três linhas de desenvolvimento, uma delas voltada às atualizações do módulo principal do sistema, de gerenciamento de conteúdo e outros duas voltadas para o desenvolvimento de mais dois módulos, com o aumento no número de módulos em desenvolvimento esse semestre mais três linhas de desenvolvimento foram criadas, com isso são agora seis linhas de desenvolvimento do sistema andando em paralelo, o principal plano para esse novo semestre e concluir essas seis linhas de desenvolvimento e com isso apresentar as mudanças e evoluções do modulo de gerenciamento de conteúdo e os novos cinco módulos ainda nesse próximo semestre. Se for levado em consideração que todas essas linhas de desenvolvimento já estão em fase avançada isso não será nada impossível.</p>
<h3>Natal, Ano Novo e Ferias</h3>
<p>Para concluir esse ano bastante produtivo, quero desejar aos leitores, amigos e clientes um feliz natal e um excelente ano novo, que no ano de 2012 todos os planos possam ser concluídos e todos os desejos alcançados e que ainda sobrem idéias para novos desejos para muitos e muitos anos, pois só se pode seguir em frente com motivação e novos desejos para nos guiar. O Blog entra hoje em recesso de final de ano, mas logo mais estarei de volta com novidades e um pouco mais de Tecnologia, Negócios e o Mundo.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=pkPlLnOHFAI:-K07H8XjTUo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=pkPlLnOHFAI:-K07H8XjTUo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=pkPlLnOHFAI:-K07H8XjTUo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=pkPlLnOHFAI:-K07H8XjTUo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/pkPlLnOHFAI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/12/14/natal-ano-novo-resumo-e-planos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/12/14/natal-ano-novo-resumo-e-planos/</feedburner:origLink></item>
		<item>
		<title>Obtendo Informações de Aplicações Externas com Zend_Http</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/7xzu_c26N1E/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=7xzu_c26N1E:r9MKkpkUvmA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=7xzu_c26N1E:r9MKkpkUvmA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=7xzu_c26N1E:r9MKkpkUvmA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=7xzu_c26N1E:r9MKkpkUvmA:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/7xzu_c26N1E" height="1" width="1"/>]]></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>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/</feedburner:origLink></item>
		<item>
		<title>Tags Multimídia HTML5</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/z2rf6O7UmZk/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=z2rf6O7UmZk:h3-tXj4srCY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=z2rf6O7UmZk:h3-tXj4srCY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=z2rf6O7UmZk:h3-tXj4srCY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=z2rf6O7UmZk:h3-tXj4srCY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/z2rf6O7UmZk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/</feedburner:origLink></item>
		<item>
		<title>Tags de Conteúdo HTML</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/mvVQiYWdcFs/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=mvVQiYWdcFs:pOE-MNA2_jc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=mvVQiYWdcFs:pOE-MNA2_jc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=mvVQiYWdcFs:pOE-MNA2_jc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=mvVQiYWdcFs:pOE-MNA2_jc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/mvVQiYWdcFs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/</feedburner:origLink></item>
		<item>
		<title>Requisições XML-RPC com Zend Framework</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/TMkwY2ebQ_s/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=TMkwY2ebQ_s:Vu_0wgd5kEQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=TMkwY2ebQ_s:Vu_0wgd5kEQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=TMkwY2ebQ_s:Vu_0wgd5kEQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=TMkwY2ebQ_s:Vu_0wgd5kEQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/TMkwY2ebQ_s" height="1" width="1"/>]]></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>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/</feedburner:origLink></item>
		<item>
		<title>Nota Sobre a Publicação de Artigos</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/QaGHdKUV6o0/</link>
		<comments>http://www.pauloeduardo.com/2011/11/15/nota-sobre-a-publicacao-de-artigos-2/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 16:56:10 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Mundo]]></category>
		<category><![CDATA[Novidades]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1055</guid>
		<description><![CDATA[Durante a série sobre Gerenciamento de Projetos publicado no blog tomei a decisão de alterar a periodicidade dos artigos de uma para duas vezes por semana, essa periodicidade se manteve até agora, porém, com a proximidade com o final do ano e o consequente aumento nas atividades nesse período do ano voltarei a publicar artigos apenas uma vez por semana, sempre as quartas feiras. Essa mudança a principio não é definitiva, o blog deverá voltar a receber conteúdo duas vezes por semana assim que esse período terminar e as atividades voltarem a seu ritmo normal, porém, isso também servirá para [...]]]></description>
				<content:encoded><![CDATA[<p>Durante a série sobre Gerenciamento de Projetos publicado no blog tomei a decisão de alterar a periodicidade dos artigos de uma para duas vezes por semana, essa periodicidade se manteve até agora, porém, com a proximidade com o final do ano e o consequente aumento nas atividades nesse período do ano voltarei a publicar artigos apenas uma vez por semana, sempre as quartas feiras. Essa mudança a principio não é definitiva, o blog deverá voltar a receber conteúdo duas vezes por semana assim que esse período terminar e as atividades voltarem a seu ritmo normal, porém, isso também servirá para analisar melhor o impacto das mudanças de periodicidade nas visitas do blog, o que pode acabar resultando numa futura manutenção da publicação dos artigos semanalmente ou até mesmo resultar em um aumento no número de artigos publicados semanalmente.</p>
<p>Dessa forma o artigo que deveria ser publicado hoje (terça-feira), será publicado amanhã (quarta-feira) dando início assim a esse novo ciclo de publicações. Além disso, como de costume, o espaço para comentários do blog está sempre aberto para sugestões de novas pautas, ou de mudanças na periodicidade do blog, além de qualquer outros assunto pertinente aos temas abordados nesse blog. Espero que continuem lendo e comentando os artigos aqui publicados e assim que tiver mais novidades com relação ao blog volto a informar.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=QaGHdKUV6o0:SRBykZCkufo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=QaGHdKUV6o0:SRBykZCkufo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=QaGHdKUV6o0:SRBykZCkufo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=QaGHdKUV6o0:SRBykZCkufo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/QaGHdKUV6o0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/15/nota-sobre-a-publicacao-de-artigos-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/15/nota-sobre-a-publicacao-de-artigos-2/</feedburner:origLink></item>
		<item>
		<title>Ativos de Processos Organizacionais e Fatores Ambientais</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/61XNchRQAwA/</link>
		<comments>http://www.pauloeduardo.com/2011/11/10/ativos-de-processos-organizacionais-e-fatores-ambientais/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 13:00:28 +0000</pubDate>
		<dc:creator>Paulo Eduardo</dc:creator>
				<category><![CDATA[Mundo]]></category>
		<category><![CDATA[Ativos de Processos Organizacionais]]></category>
		<category><![CDATA[Fatores Ambientais da Empresa]]></category>
		<category><![CDATA[Gerenciamento de Projetos]]></category>
		<category><![CDATA[PMBoK]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1036</guid>
		<description><![CDATA[Durante os artigos da série sobre gerenciamento de projetos publicada aqui no blog muitos dos processos tratados falavam sobre Ativos de Processos Organizacionais e Fatores Ambientais da Empresa, muitas das entradas desses processos se referiam a esses dois itens e muitas das saídas desses e de outros processos sugeriam atualizações nos mesmo. Esse artigo pretende elucidar um pouco mais sobre o que são esses dois itens fundamentais no gerenciamento de projetos e sobre quais são as diferenças entre eles. Fatores Ambientais da Empresa O próprio nome desse item já serve para passar uma idéia básico sobre ao que ele se [...]]]></description>
				<content:encoded><![CDATA[<p>Durante os artigos da série sobre gerenciamento de projetos publicada aqui no blog muitos dos processos tratados falavam sobre Ativos de Processos Organizacionais e Fatores Ambientais da Empresa, muitas das entradas desses processos se referiam a esses dois itens e muitas das saídas desses e de outros processos sugeriam atualizações nos mesmo. Esse artigo pretende elucidar um pouco mais sobre o que são esses dois itens fundamentais no gerenciamento de projetos e sobre quais são as diferenças entre eles.</p>
<h3>Fatores Ambientais da Empresa</h3>
<p>O próprio nome desse item já serve para passar uma idéia básico sobre ao que ele se referem, os fatores ambientais da empresa são o grupo de conhecimento, experiências e procedimentos que ambientam tanto internamente como externamente a empresa executora do projeto ou qualquer outra empresa interessada no projeto.</p>
<p>Esses Fatores Ambientais podem ser tangíveis, como, por exemplo, os equipamentos que a empresa possui e quem podem ser usados no decorrer de um ou mais processos, as instalações da empresa que poderão ser usadas para abrigar a equipe executora do projeto ou até mesmo para armazenar os equipamentos próprios e os obtidos de terceiros ou os recursos humanos de cada uma das empresas envolvidas.</p>
<p>Os mesmos também podem ser intangíveis, como a cultura da empresa as padronizações de processos internas ou de mercado, o ambiente político, financeiro, econômico e social no qual estão inseridas as empresas e os projetos, as normas e regulamentações governamentais ou de setor ou até mesmo o relacionamento anterior entre as empresas interessadas no projeto.</p>
<p>Por fim os fatores ambientais da empresa podem ainda ser digitais como sistemas informatizados para gerenciamento do projeto como um todo ou de partes do mesmo ou como canais de comunicação estabelecidos pelas organizações interessadas no projeto.</p>
<h3>Ativos de Processos Organizacionais</h3>
<p>São as informações e conhecimentos obtidos durante o desenvolvimento do próprio projeto ou de outros projetos, simultâneos ou anteriores, esses estão mais relacionados a conhecimentos técnicos relativos a determinadas atividades de um projeto, resultados de experiências com diferentes procedimentos para uma mesma atividade ou atividade semelhante, bases de informações obtidas de terceiros e/ou alimentadas com informações próprias e procedimentos padronizados para realização de algum tipo de tarefa. Pela sua própria natureza ser relacionada a conhecimento e informação são em sua maioria intangíveis apesar de também poder incluir arquivos referentes ao projeto ou até mesmo protótipos ou diagramas que podem ser considerados mais tangíveis.</p>
<p>Diferentemente dos Fatores Ambientais da Empresa que são realmente utilizados e até mesmo consumidos durante o ciclo de vida de um projeto os Ativos de Processos Organizacionais são mais úteis para auxiliar no desenvolvimento de uma atividade dentro do projeto guiando seus procedimentos do que para serem usados durante as essas atividades.</p>
<h3>Conclusão</h3>
<p>Tanto os Fatores Ambientais da Empresa quanto os Ativos de Processos Organizacionais podem ser extremamente úteis para o desenvolvimento do projeto e para reduzir as chances de insucesso dos mesmo, porém vão sendo adquiridos ao longo do processo de crescimento e aprimoramento da empresa, além disso muitos desses Fatores Ambientais ou Ativos de Processos Organizacionais podem ser muito úteis para uma empresa mas não se adequar a realidade de uma outra empresa, por isso se sua empresa está começando a trabalhar com projetos agora ou é realmente uma empresa nova saiba que ao longo do processo de crescimento de sua empresa os mesmos serão formados aos poucos, e tudo que você pode fazer para auxiliar nesse processo e aprender o máximo que puder tanto com os acertos quanto com os erros de sua empresa, além disso é sempre importante documentar todos os acontecimentos dos projetos, pois essas informações podem parecer inúteis na início, mas poderão ser muito úteis no futuro.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=61XNchRQAwA:SEZNjY5l6GU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=61XNchRQAwA:SEZNjY5l6GU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=61XNchRQAwA:SEZNjY5l6GU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=61XNchRQAwA:SEZNjY5l6GU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/61XNchRQAwA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/10/ativos-de-processos-organizacionais-e-fatores-ambientais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/10/ativos-de-processos-organizacionais-e-fatores-ambientais/</feedburner:origLink></item>
		<item>
		<title>Autenticação Através de Banco de Dados com Zend_Auth</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/HjyTLYu-ui0/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=HjyTLYu-ui0:4hjJuTdVBlk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=HjyTLYu-ui0:4hjJuTdVBlk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=HjyTLYu-ui0:4hjJuTdVBlk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=HjyTLYu-ui0:4hjJuTdVBlk:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/HjyTLYu-ui0" height="1" width="1"/>]]></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>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/</feedburner:origLink></item>
		<item>
		<title>Adcionando Paginadores à Paginas com Zend Framework</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/qtYLNNX7hVw/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=qtYLNNX7hVw:CYnjMZpGIlY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=qtYLNNX7hVw:CYnjMZpGIlY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=qtYLNNX7hVw:CYnjMZpGIlY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=qtYLNNX7hVw:CYnjMZpGIlY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/qtYLNNX7hVw" height="1" width="1"/>]]></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>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/</feedburner:origLink></item>
		<item>
		<title>Traduzindo Mensagens dos Formulários do Zend Framework</title>
		<link>http://feedproxy.google.com/~r/pauloeduardo/~3/BVsDCDdvvqA/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=BVsDCDdvvqA:_NP85hxacyc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=BVsDCDdvvqA:_NP85hxacyc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/pauloeduardo?a=BVsDCDdvvqA:_NP85hxacyc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pauloeduardo?i=BVsDCDdvvqA:_NP85hxacyc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pauloeduardo/~4/BVsDCDdvvqA" height="1" width="1"/>]]></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>
		<feedburner:origLink>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/</feedburner:origLink></item>
	<media:rating>nonadult</media:rating></channel>
</rss>
