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

<channel>
	<title>Blog - Matias Rezende</title>
	<atom:link href="http://matiasrezende.com.br/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://matiasrezende.com.br/blog</link>
	<description>Zend Framework, PHP e outras coisinhas mais</description>
	<lastBuildDate>Thu, 10 Nov 2011 17:57:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Colocando o site/aplicação em manutenção com o Zend Framework</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/colocando-o-siteaplicacao-em-manutencao-com-o-zend-framework/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/colocando-o-siteaplicacao-em-manutencao-com-o-zend-framework/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 19:55:43 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[ambientes]]></category>
		<category><![CDATA[manutenção]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=175</guid>
		<description><![CDATA[Olá! Hoje vamos falar sobre algo que é bem simples de fazer, mas ao mesmo tempo é bastante útil. De vez em quando precisamos fazer alguma manutenção em nosso site/aplicação após a mesma estar online, ou seja, em produção. Como fazer para que, durante o período de manutenção, quem visitar o site veja uma tela [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Hoje vamos falar sobre algo que é bem simples de fazer, mas ao mesmo tempo é bastante útil. De vez em quando precisamos fazer alguma manutenção em nosso site/aplicação após a mesma estar online, ou seja, em produção. Como fazer para que, durante o período de manutenção, quem visitar o site veja uma tela de manutenção, mas você (que está logado como admin) possa acessar tanto o site quanto o painel de administração?</p>
<p>Simples. Criaremos um plugin que vai fazer esta verificação. Como o objetivo do artigo não é ensinar a criar plugin, vamos direto ao código. Crie um arquivo de nome Manutencao.php e coloque ele na pasta /library/App/Plugin/, ficando <strong>/library/App/Plugin/Manutencao.php</strong>, com o conteúdo abaixo.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
/**
 * Plugin que deixa o site/aplicação em manutenção.
 *
 * @author Matias Rezende - http://matiasrezende.com.br
 * @version 1.0
 */
class App_Plugin_Manutencao extends Zend_Controller_Plugin_Abstract {
	/**
	 * @see Zend_Controller_Plugin_Abstract::preDispatch()
	 */
	public function preDispatch ( Zend_Controller_Request_Abstract $request ) {
		// assumindo que default é o nome do módulo visível do site
		if ( ! Zend_Auth::getInstance ()-&gt;hasIdentity () &amp;&amp; $request-&gt;getModuleName () == 'default' ) {
			$request-&gt;setControllerName ( 'manutencao' )
				-&gt;setActionName ( 'index' );
		}
	}
}
</pre>
<p>O que ele faz. Se ao acessar não tiver usuário logado e o módulo acessado for o módulo default, ele manda para o controller de manutenção, action index. Caso tenha usuário logado ou caso o módulo a ser acessado não seja o default (para permitir que se faça login, por exemplo), ele não faz nada.</p>
<p>Obs.: Apenas estamos verificando se o usuário está logado, mas isto pode ser (é) um problema. O ideal é que se faça a verificação de permissão (Acl), mas isto fica para um outro artigo.</p>
<h2>Adicionando o plugin</h2>
<p>Para que o plugin seja chamado, precisamos dizer para o ZF fazer isto. Podemos fazer via Boostrap.php ou via application.ini. Para o exemplo aqui, vamos fazer pelo application.ini, adicionando a linha abaixo:</p>
<pre class="brush: php; title: ; notranslate">
resources.frontController.plugins.Manutencao = &quot;App_Plugin_Manutencao&quot;
</pre>
<p>Uhn&#8230; Mas peraí. Desta forma, ele vai fazer esta verificação SEMPRE. Mas não é isto que queremos. Só queremos que ele faça isto QUANDO estivermos em manutenção. Como resolver?</p>
<h2>Usando ambientes no application.ini</h2>
<p>Quem já leu o artigo <a href="http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-ambientes-no-application-ini-do-zend-framework/" title="Trabalhando com ambientes no application.ini do Zend Framework" target="_blank">Trabalhando com ambientes no application.ini do Zend Framework</a> já sacou como fazer para funcionar. Em resumo, vimos que podemos criar ambientes para a aplicação. O que vamos fazer? Incluir este plugin dentro do ambiente manutencao, que vamos criar. Nosso application.ini ficará assim:</p>
<pre class="brush: php; title: ; notranslate">
[production]
// todas as nossas configurações normais
[manutencao : production]
resources.frontController.plugins.Manutencao = &quot;App_Plugin_Manutencao&quot;
</pre>
<p>Agora o plugin só será adicionado quando estivermos no ambiente manutencao. Para trocar o ambiente da aplicação, temos algumas formas (como vimos no artigo). A que eu mais gosto é via arquivo .htaccess.</p>
<pre class="brush: php; title: ; notranslate">
SetEnv APPLICATION_ENV manutencao
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>E pronto!! Com isto, temos uma forma simples de colocar o sistema em manutenção para todos, menos para o usuário logado.</p>
<p>Abraços e até a próxima!!</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/colocando-o-siteaplicacao-em-manutencao-com-o-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabalhando com ambientes no application.ini do Zend Framework</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-ambientes-no-application-ini-do-zend-framework/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-ambientes-no-application-ini-do-zend-framework/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 19:53:50 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[application.ini]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[ambientes]]></category>
		<category><![CDATA[parâmetros]]></category>
		<category><![CDATA[seção]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=182</guid>
		<description><![CDATA[Opa!!! Muito bem, hoje vamos começar a falar sobre o application.ini e algumas configurações que podemos fazer nele. O artigo de hoje é rápido e simples, pois é quase uma introdução. Ao criar um projeto pelo Zend_Tool, temos como padrão o seguinte arquivo application.ini: O que seriam os ambientes? Seriam as seções de configurações. No [...]]]></description>
			<content:encoded><![CDATA[<p>Opa!!!
<p>Muito bem, hoje vamos começar a falar sobre o application.ini e algumas configurações que podemos fazer nele. O artigo de hoje é rápido e simples, pois é quase uma introdução.</p>
<p>Ao criar um projeto pelo Zend_Tool, temos como padrão o seguinte arquivo application.ini:</p>
<pre class="brush: php; title: ; notranslate">
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH &quot;/../library&quot;
bootstrap.path = APPLICATION_PATH &quot;/Bootstrap.php&quot;
bootstrap.class = &quot;Bootstrap&quot;
appnamespace = &quot;Application&quot;
resources.frontController.controllerDirectory = APPLICATION_PATH &quot;/controllers&quot;
resources.frontController.params.displayExceptions = 0

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
</pre>
<p>O que seriam os ambientes? Seriam as seções de configurações. No caso do exemplo acima, temos os ambientes production, staging, testing e development. Como você vai usar cada um deles vai depender bastante de você, mas eu utilizo o ambiente production para as configurações do servidor de produção (maior parte das configurações). O ambiente testing eu utilizo assim que coloco um projeto no ar, mas enquanto estou fazendo alguns ajustes para o ambiente de produção e preciso ver possíveis erros sendo exibidos na tela (e não gravados em log). O ambiente development é o ambiente que eu utilizo enquanto estou desenvolvendo, onde preciso que todos os erros sejam exibidos.</p>
<p>Porque isto é tão interessante? Porque podemos ter configurações únicas para cada ambiente. Por exemplo, a exibição de erros, como citado acima. Outro exemplo clássico de utilização é para dados de acesso ao banco de dados, já que nome do banco, usuário e senha podem ser (normalmente são) diferentes do ambiente de desenvolvimento e em produção.</p>
<h2>Definindo o ambiente atual</h2>
<p>Podemos definir qual o ambiente atual basicamente de 3 formas:</p>
<ul>
<li>index.php (não indico)</li>
<li>Virtual Host (normalmente em desenvolvimento)</li>
<li>.htaccess (o que eu mais gosto)</li>
</ul>
<h3>index.php</h3>
<p>No index.php padrão, criado pelo Zend_Tool, temos as seguintes linhas:</p>
<pre class="brush: php; title: ; notranslate">
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
</pre>
<p>O que ele verifica? Se a constante APPLICATION_ENV está definida. Se ela não está definida, será definida. Aí verifica se está setada uma variável de ambiente (função <a href="http://br.php.net/getenv" title="Link para o manual da função getenv" target="_blank">getenv</a>) com o nome APPLICATION_ENV. Se existir, pega o seu valor e atribui à constante. Se não existir, define como production.</p>
<p>Então, para definir o ambiente no index.php podemos fazer o seguinte:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
define('APPLICATION_ENV', 'development');

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
</pre>
<p>Pronto. Temos o ambiente definido como development para a aplicação. Eu não gosto muito de fazer assim, porque acho que o arquivo index.php não deve ser editado para isto. Além disto, as linhas abaixo do define que foi adicionado ficam sem sentido, mas algum outro programador pode pegar o projeto para dar manutenção e não vai procurar ali para definir o ambiente (normalmente).</p>
<h3>Virtual Host</h3>
<p>No exemplo de criação de Virtual Host do Zend Framework ele mostra como fazer a mesma coisa utilizando Virtual Host.</p>
<pre class="brush: php; title: ; notranslate">
&lt;VirtualHost *:80&gt;
        ServerName quickstart.local
        DocumentRoot /path/to/quickstart/public

        SetEnv APPLICATION_ENV &quot;development&quot;

        &lt;Directory /path/to/quickstart/public&gt;
                DirectoryIndex index.php
                AllowOverride All
                Order allow,deny
                Allow from all
        &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<p>Vejam que definimos uma variável de ambiente <strong>SetEnv APPLICATION_ENV &#8220;development&#8221;</strong> (lembra que o index.php busca por uma variável de ambiente com este nome?) definida com o valor de development. Não gosto desta forma porque, normalmente, não temos acesso à criação de Virtual Host no servidor de produção, mas é uma ótima forma de fazer isto no ambiente de desenvolvimento.</p>
<h3>Via .htaccess</h3>
<p>Utilizamos a mesma ideia do Virtual Host, mas adicionando a linha ao arquivo .htaccess. Assim:</p>
<pre class="brush: php; title: ; notranslate">
SetEnv APPLICATION_ENV &quot;development&quot;
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Vejam que a forma e o efeito é exatamente o mesmo que utilizando o Virtual Host, com uma grande diferença: flexibilidade. No ambiente de produção podemos criar arquivo .htaccess e definir, de forma simples e rápida, uma mudança no ambiente, sem depender de configuração do servidor. Outro motivo é que normalmente você envia o arquivo .htaccess somente uma vez para o servidor e praticamente não modifica ele (isto será útil mais abaixo).</p>
<h2>Herança dos ambientes</h2>
<pre class="brush: php; title: ; notranslate">
[development : production]
</pre>
<p>Olhando o trecho acima de código, percebemos que existe algo que não foi falado ainda. O que é este : production? Herança!!! Ou seja, o ambiente development recebe todas as configurações do ambiente production, podendo sobrescrever qualquer uma delas. Por isto que temos a definição da exibição de erros e exceções na seção production (seção pai) e na seção development (seção filha).</p>
<h2>Criando novos ambientes</h2>
<p>Por padrão o Zend traz os ambientes citados acima, mas nada impede que você crie, modifique ou remova um ou mais ambientes que você não estiver utilizando. Imagine que, por algum motivo bizarro (já passei por isto) você precisa testar uma aplicação em 3 servidores diferentes (!!!). Como fazer, se os dados de acesso ao banco de dados são diferentes em cada um dos servidores? Simples! Defina 2 seções extras e coloque ali dentro os dados de acesso ao banco de dados de cada servidor. Modifique o arquivo .htaccess de cada um dos servidores (viu como falei que seria útil?) para trabalhar no ambiente escolhido e pronto.</p>
<p>Outro caso que você pode usar é para colocar o site/aplicação em manutenção, mas isto é assunto para outro artigo &#8211; <a href="http://matiasrezende.com.br/blog/zend-framework/colocando-o-siteaplicacao-em-manutencao-com-o-zend-framework/" title="Colocando o site/aplicação em manutenção com o Zend Framework">link aqui</a>.</p>
<p>Por hoje era só isto, mas fique ligado que teremos mais artigos sobre o application.ini. Gostou? Comente e compartilhe!!!</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-ambientes-no-application-ini-do-zend-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Trabalhando com layouts diferentes por módulo no Zend Framework</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-layouts-diferentes-por-modulo-no-zend-framework/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-layouts-diferentes-por-modulo-no-zend-framework/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 21:40:35 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[Módulos]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=167</guid>
		<description><![CDATA[Fala galera, tudo certo? A ideia deste artigo surgiu de uma dúvida que apareceu no fórum iMasters, sobre como trabalhar com layouts diferentes e com os módulos do Zend Framework. Começando, vamos imaginar uma estrutura simples com 2 módulos (default e admin). Vamos criar a estrutura com o Zend Tool. Criando o projeto: Agora, criando [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera, tudo certo?</p>
<p>A ideia deste artigo surgiu de uma dúvida que apareceu no <a href="http://forum.imasters.com.br/topic/444389-problema-com-bootstrap-dos-modulos/" title="Link externo" target="_blank">fórum iMasters</a>, sobre como trabalhar com layouts diferentes e com os módulos do Zend Framework.</p>
<p>Começando, vamos imaginar uma estrutura simples com 2 módulos (default e admin). Vamos criar a estrutura com o Zend Tool.</p>
<p>Criando o projeto:</p>
<pre class="brush: php; title: ; notranslate">
zf create project example
</pre>
<p>Agora, criando os módulos:</p>
<pre class="brush: php; title: ; notranslate">
cd example
zf create module default
zf create module admin
zf create controller Index -m default
zf create controller Index -m admin
</pre>
<p>Com isto, criamos os módulos default e admin, criando também o controller Index em cada um deles.</p>
<p>Certo, mas e o layout? Agora, vamos fazer os ajustes no application.ini para conseguirmos trabalhar com layouts por módulos. Vamos lá.</p>
<h2>application.ini</h2>
<pre class="brush: php; title: ; notranslate">
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.date.timezone = &quot;America/Sao_Paulo&quot;
resources.frontController.params.displayExceptions = 0

resources.locale.default = &quot;pt_BR&quot;

; layouts
resources.layout.layout = &quot;layout&quot;

; include path
includePaths.library = APPLICATION_PATH &quot;/../library&quot;

appnamespace = &quot;Application&quot;

; bootstrap
bootstrap.path = APPLICATION_PATH &quot;/Bootstrap.php&quot;
bootstrap.class = &quot;Bootstrap&quot;

; front controller
resources.frontController.moduleDirectory   = APPLICATION_PATH &quot;/modules&quot;
resources.modules[]= &quot;&quot;
resources.frontController.defaultModule = &quot;default&quot;
resources.frontController.prefixDefaultModule = &quot;true&quot;
resources.frontController.actionHelperPaths.App_Action_Helper = &quot;App/Helpers/Action&quot;

; view
resources.view.doctype = &quot;HTML5&quot;
resources.view.encoding = &quot;UTF-8&quot;
resources.view.charset = &quot;UTF-8&quot;
resources.view.helperPath.App_View_Helper = &quot;App/Helpers/View&quot;
[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
</pre>
<h2>A &#8220;mágica&#8221;</h2>
<p>Agora, vamos à mágica&#8230; (ok, não tem mágica, mas é bem legal <img src='http://matiasrezende.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Criamos um arquivo chamado layout.phtml para cada módulo e deixamos ele dentro da pasta raiz da view do respectivo módulo. Por exemplo, para o módulo <strong>default</strong>, o arquivo fica em <strong>/application/modules/default/views/scripts/layout.phtml</strong> e tem, por exemplo, o seguinte conteúdo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $this-&gt;doctype()?&gt;
&lt;html lang=&quot;pt-br&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;?php
$this-&gt;headTitle()-&gt;append('Layout e módulos - Zend Framework');
$this-&gt;headTitle()-&gt;setSeparator(' - ');
echo $this-&gt;headTitle(),PHP_EOL;
$this-&gt;headMeta()-&gt;headMeta ('Matias Rezende', 'author');

$this-&gt;headLink()-&gt;setSeparator(PHP_EOL)
		 -&gt;prependStylesheet($this-&gt;baseUrl('estilos/estilo.css'));

$this-&gt;headScript ()-&gt;setSeparator(PHP_EOL)
		    -&gt;prependFile ($this-&gt;baseUrl('scripts/jquery/jquery-1.6.1.min.js') );

echo $this-&gt;headMeta(),PHP_EOL;
echo $this-&gt;headLink(),PHP_EOL;
echo $this-&gt;headScript();
?&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div id=&quot;wrapper&quot;&gt;
		&lt;div id=&quot;content&quot;&gt;
			&lt;h1&gt;Modulo default&lt;/h1&gt;
			&lt;?php echo $this-&gt;layout()-&gt;content;?&gt;
		&lt;/div&gt;&lt;!-- /content --&gt;
	&lt;/div&gt;&lt;!-- /wrapper --&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Para o módulo admin <strong>(/application/modules/admin/views/scripts/layout.phtml)</strong>, colocamos o conteúdo abaixo (mesma estrutura com a mudança apenas no texto que aparece no H1 &#8211; apenas para diferenciar):</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $this-&gt;doctype()?&gt;
&lt;html lang=&quot;pt-br&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;?php
$this-&gt;headTitle()-&gt;append('Layout e módulos - Zend Framework');
$this-&gt;headTitle()-&gt;setSeparator(' - ');
echo $this-&gt;headTitle(),PHP_EOL;
$this-&gt;headMeta()-&gt;headMeta ('Matias Rezende', 'author');

$this-&gt;headLink()-&gt;setSeparator(PHP_EOL)
		 -&gt;prependStylesheet($this-&gt;baseUrl('estilos/estilo.css'));

$this-&gt;headScript ()-&gt;setSeparator(PHP_EOL)
		    -&gt;prependFile ($this-&gt;baseUrl('scripts/jquery/jquery-1.6.1.min.js') );

echo $this-&gt;headMeta(),PHP_EOL;
echo $this-&gt;headLink(),PHP_EOL;
echo $this-&gt;headScript();
?&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div id=&quot;wrapper&quot;&gt;
		&lt;div id=&quot;content&quot;&gt;
			&lt;h1&gt;Modulo admin&lt;/h1&gt;
			&lt;?php echo $this-&gt;layout()-&gt;content;?&gt;
		&lt;/div&gt;&lt;!-- /content --&gt;
	&lt;/div&gt;&lt;!-- /wrapper --&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Pronto!!!! Agora, vamos explicar o que fizemos no application.ini:</p>
<h2>Explicando passo a passo</h2>
<pre class="brush: php; title: ; notranslate">
; layouts
resources.layout.layout = &quot;layout&quot;
</pre>
<p>Aqui dissemos que o nome do arquivo de layout vai ser <strong>layout</strong>.phtml. Pode ser qualquer nome que você quiser (base, mainView&#8230;), desde que modifique o nome do arquivo também.</p>
<pre class="brush: php; title: ; notranslate">
; front controller
resources.frontController.moduleDirectory   = APPLICATION_PATH &quot;/modules&quot;
resources.modules[]= &quot;&quot;
resources.frontController.defaultModule = &quot;default&quot;
resources.frontController.prefixDefaultModule = &quot;true&quot;
</pre>
<p>Configuração básica para trabalhar com módulos. Primeiro definimos a pasta dos módulos. Depois dissemos que existe mais de um módulo. Posteriormente definimos que o primeiro módulo é o default. Na última linha, definimos que o nome dos controllers terá o prefixo (Default_IndexController). Prefiro deixar assim porque ao criar um controller pelo Zend Tool ele cria com o prefixo. Para não ter que editar arquivo por arquivo, prefiro deixar assim mesmo.</p>
<p>Espero que tenham gostado. Se gostou, comente e compartilhe!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/trabalhando-com-layouts-diferentes-por-modulo-no-zend-framework/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Exibindo resultados paginados com Zend Paginator</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/exibindo-resultados-paginados-com-zend-paginator/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/exibindo-resultados-paginados-com-zend-paginator/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 19:06:57 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Paginator]]></category>
		<category><![CDATA[Paginação]]></category>
		<category><![CDATA[Paginar resultados]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=157</guid>
		<description><![CDATA[Fala galera!!! Mais um post sobre o Zend Framework, mostrando um recurso muito utilizado, que é a paginação. Para isto, utilizaremos o Zend Paginator. Como quase tudo no Zend Framework, é possível fazer esta paginação de diversas formas. Vou mostrar a que eu tenho utilizado, que acho a mais simples. Model (uma ideia bem simples, [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera!!!</p>
<p>Mais um post sobre o <a href="http://matiasrezende.com.br/blog/category/zend-framework/" title="Posts sobre Zend Framework">Zend Framework</a>, mostrando um recurso muito utilizado, que é a paginação. Para isto, utilizaremos o Zend Paginator.</p>
<p>Como quase tudo no Zend Framework, é possível fazer esta paginação de diversas formas. Vou mostrar a que eu tenho utilizado, que acho a mais simples.</p>
<p><span id="more-157"></span></p>
<h2>Model (uma ideia bem simples, só para demonstrar):</h2>
<pre class="brush: php; title: ; notranslate">
&lt;?php

class Model_NoticiaMapper {
	private $_dbTable;

	 /**
	 * @return Model_DbTable_Noticia
	 */
	public function getDbTable() {
		if (!$this-&gt;_dbTable instanceof Model_DbTable_Noticia) {
			$this-&gt;_dbTable = new Model_DbTable_Noticia();
		}
		return $this-&gt;_dbTable;
	}

	/**
	 * @return Zend_Db_Table_Select
	 */
	public function findAllNews() {
		return $this-&gt;getDbTable()-&gt;select();
	}
}
</pre>
<p>O que é importante perceber? O método <strong>findAllNews()</strong> retorna um <strong>Zend_Db_Table_Select</strong> e não um resultado depois de feito o fetch(all/row). Isto é fundamental, pois este objeto select será utilizado pelo Zend_Paginator.</p>
<h2>No seu Controller:</h2>
<pre class="brush: php; title: ; notranslate">
$model = new Model_NoticiaMapper ();
$noticias = Zend_Paginator::factory ( $model-&gt;findAllNews () );
$noticias-&gt;setCurrentPageNumber ( $this-&gt;_getParam( 'pagina', 1 ) )
         -&gt;setItemCountPerPage ( 10 );
$this-&gt;view-&gt;noticias = $noticias;
</pre>
<p>Veja que o factory recebe o objeto Zend_Db_Table_Select e retorna o objeto responsável pela paginação. Nós adicionamos algumas configurações básicas ao objeto:</p>
<ul>
<li><strong>setCurrentPageNumber( int $pageNumber )</strong> define qual é <strong>a página atual</strong> em que os resultados estão sendo exibidos. No nosso caso, recebemos o parâmetro <strong>pagina</strong>, que será passado pela URL que será montada mais abaixo.</li>
<li><strong>setItemCountPerPage( int $countPerPage )</strong> define a <strong>quantidade de resultados por página</strong>. No caso colocamos 10, mas pode ser o valor que você escolher (inclusive um valor definido de forma dinâmica).</li>
</ul>
<p>Como ele implementa Fluent Interface, podemos usar os métodos encadeados como demonstrados.</p>
<p>Passamos o objeto da paginação para a view em $this->view->noticias, que então estará disponível na view em $this->noticias;</p>
<h2>Exibindo os resultados na View:</h2>
<pre class="brush: php; title: ; notranslate">
&lt;?php foreach ($this-&gt;noticias as $noticia): ?&gt;
	&lt;h2&gt;&lt;?php echo $noticia-&gt;titulo?&gt;&lt;/h2&gt;
	&lt;p&gt;&lt;?php echo $noticia-&gt;noticia?&gt;&lt;/p&gt;
&lt;?php endforeach; ?&gt;
&lt;?php echo $this-&gt;paginationControl($this-&gt;noticias,null,'paginator.phtml'); ?&gt;
</pre>
<p>A única coisa que precisa de explicação é a utilização do viewHelper <strong>paginationControl()</strong>:</p>
<p><strong>paginationControl</strong>(Zend_Paginator $paginator = null, $scrollingStyle = null, $partial = null, $params = null), onde:</p>
<ul>
<li><strong>$paginator</strong> é o objeto da paginação ($this->noticias no nosso caso)</li>
<li>
            <strong>$scroolingStyle</strong> é o tipo de demonstração de página que será utilizado. O Zend Framework tem 4 opções definidas:</p>
<ul>
<li><strong>All</strong> => Retorna todas as páginas.</li>
<li><strong>Elastic</strong> => Uma paginação no estilo Google, onde a quantidade e as páginas exibidas modificam de acordo com a página atual.</li>
<li><strong>Jumping</strong> => Só aparecem novas páginas quando você chega no final das páginas exibidas, criando uma nova série.</li>
<li><strong>Sliding</strong> => Formato padrão. A página atual é o centro da série de páginas a serem exibidas. Por exemplo, se estamos na página 10, aparece da página 5 até a página 15.</li>
</ul>
</li>
<li><strong>$partial</strong> o nome do arquivo que vai renderizar o controle da paginação (exemplo abaixo)</li>
<li><strong>$params</strong> parâmetros a serem passados para o viewPartial que vai renderizar o controle da paginação</li>
</ul>
<h2>Arquivo paginator.phtml (que deve ficar dentro de views/scripts/paginator.phtml):</h2>
<pre class="brush: php; title: ; notranslate">
&lt;?php if ($this-&gt;pageCount): ?&gt;
	&lt;div id=&quot;paginator&quot;&gt;
	&lt;?php if (isset($this-&gt;previous)): ?&gt;
		&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('pagina' =&gt; $this-&gt;previous)); ?&gt;&quot;&gt;Anterior &lt;/a&gt;
	&lt;?php endif; ?&gt;
	&lt;?php foreach ($this-&gt;pagesInRange as $page): ?&gt;
		&lt;?php if ($page != $this-&gt;current): ?&gt;
		    &lt;a href=&quot;&lt;?php echo $this-&gt;url(array('pagina' =&gt; $page)); ?&gt;&quot;&gt;&lt;?php echo $page; ?&gt;&lt;/a&gt;
		&lt;?php else: ?&gt;
			&lt;span class=&quot;currentPage&quot;&gt;&lt;?php echo $page; ?&gt;&lt;/span&gt;
		&lt;?php endif; ?&gt; |
	&lt;?php endforeach; ?&gt;
	&lt;?php if (isset($this-&gt;next)): ?&gt;
		&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('pagina' =&gt; $this-&gt;next)); ?&gt;&quot;&gt;Próxima &lt;/a&gt;
	&lt;?php endif; ?&gt;
	&lt;/div&gt;
&lt;?php endif; ?&gt;
</pre>
<p>Acho que este não precisa explicar muita coisa, né? Como neste caso só quero que seja mostrada a div#paginator SE houver mais de uma página, fazemos a verificação com o if($this->pageCount). Para montar a URL das páginas, usamos o viewHelper url(). Ele, no formato que está, mantém os parâmetros atuais (rota, controller, action, modulo, parâmetros existentes&#8230;). Basicamente ele pega a URL atual e adiciona o número da página (parâmetro <strong>pagina</strong>, que recebemos no controller, lembra?).</p>
<p>E agora&#8230; NADA!!! Prontinho&#8230; Só isto. Simples, né?</p>
<p>Esta foi uma forma de paginar resultados do banco de dados, mas o Zend Paginator permite a paginação de diversos tipos de dados. Por hoje é só, mas fique ligado que em breve teremos mais artigos sobre o Zend Paginator, mostrando mais deste poderoso recurso.</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/exibindo-resultados-paginados-com-zend-paginator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando rotas com Zend Route</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/criando-rotas/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/criando-rotas/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 21:56:27 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Route]]></category>
		<category><![CDATA[Criar Rota]]></category>
		<category><![CDATA[Rotas]]></category>
		<category><![CDATA[URL Amigável]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=143</guid>
		<description><![CDATA[Olá galera&#8230; Tudo certo? Começando hoje uma série de posts sobre o Zend_Route. Vamos começar ensinando uma forma de criar rotas personalizadas. Este formato é o mais indicado quanto você tem poucas rotas e estas rotas são simples. Basta adicionar alguns códigos ao seu arquivo application.ini: Explicando passo a passo: Indicando ao application.ini que estamos [...]]]></description>
			<content:encoded><![CDATA[<p>Olá galera&#8230;</p>
<p>Tudo certo? Começando hoje uma série de posts sobre o Zend_Route. Vamos começar ensinando uma forma de criar rotas personalizadas. Este formato é o mais indicado quanto você tem poucas rotas e estas rotas são simples. Basta adicionar alguns códigos ao seu arquivo application.ini:</p>
<pre class="brush: php; title: ; notranslate">
resources.router.routes.produto.route = &quot;produto/:categoria/:sub-categoria/:produto&quot;
resources.router.routes.produto.defaults.module = default
resources.router.routes.produto.defaults.controller = produtos
resources.router.routes.produto.defaults.action = show
resources.router.routes.produto.defaults.categoria =
resources.router.routes.produto.defaults.sub-categoria =
resources.router.routes.produto.defaults.produto =
</pre>
<h2>Explicando passo a passo:</h2>
<pre class="brush: php; title: ; notranslate">
resources.router.routes.produto
</pre>
<p>Indicando ao application.ini que estamos trabalhando com o recurso <strong>router</strong> e que ali contém uma das rotas (routes), de nome <strong>produto</strong>. Para definir qualquer informação desta rota, devemos iniciar as linhas com este código.</p>
<pre class="brush: php; title: ; notranslate">
resources.router.routes.produto.route = &quot;produto/:categoria/:sub-categoria/:produto&quot;
</pre>
<p>Ao fazermos isto, definimos que todas as URLs que começarem com <strong>produto</strong> entrarão nesta rota. O primeiro parâmetro após a palavra produto será o parâmetro <strong>categoria</strong>. O segundo será <strong>sub-categoria</strong> e o terceiro será o <strong>produto</strong>.</p>
<h2>Definindo os valores padrão (defaults)</h2>
<p>Para definirmos para onde será direcionada esta requisição, vamos definir nos valores default. </p>
<pre class="brush: php; title: ; notranslate">
resources.router.routes.produto.defaults.module = default
resources.router.routes.produto.defaults.controller = produtos
resources.router.routes.produto.defaults.action = show
</pre>
<p>Aí definimos que qualquer requisição (página) será direcionada para o módulo <strong>default</strong>, para o controller <strong>produtos</strong> e para a action <strong>show</strong>.</p>
<p>Para evitarmos problemas, definimos também os valores default para os parâmetros (categoria, sub-categoria e produto).</p>
<p>Então, transformamos uma URL assim: </p>
<p><strong>http://site.com.br/produtos/show/categoria/informatica/sub-categoria/notebooks/produto/notebook-dell-inspirion-15-r</strong></p>
<p>por uma URL assim:</p>
<p><strong>http://site.com.br/produto/informatica/notebooks/notebook-dell-inspirion-15-r</strong></p>
<p>Melhorou, né?</p>
<p>Vejam que esta é UMA das formas de fazer isto (existem diversas outras).</p>
<p>Gostou? Comentem!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/criando-rotas/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Separando menu de sub-menu com Zend Navigation</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/separando-menu-de-sub-menu-com-zend-navigation/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/separando-menu-de-sub-menu-com-zend-navigation/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 19:13:44 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Navigation]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Parte 5]]></category>
		<category><![CDATA[Série Zend Navigation]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=136</guid>
		<description><![CDATA[Olá galera!!!! Mais um artigo da série sobre Zend Navigation. Já viu os outros? Aqui tem o link para a série completa. Vale a pena começar por lá. Muita vezes temos em um site um menu superior e um menu interno, que varia de acordo com a página. Com o Zend Navigation é fácil de [...]]]></description>
			<content:encoded><![CDATA[<p>Olá galera!!!!</p>
<p>Mais um artigo da série sobre Zend Navigation. Já viu os outros? <a href="/blog/category/zend-framework/zend-navigation/" title="Artigos Zend Navigation">Aqui</a> tem o link para a série completa. Vale a pena começar por lá.</p>
<p>Muita vezes temos em um site um menu superior e um menu interno, que varia de acordo com a página. Com o Zend Navigation é fácil de resolver este problema. Para isto, utilizaremos os métodos <strong>setOnlyActiveBranch()</strong>, <strong>setMinDepth()</strong>, <strong>setMaxDepth()</strong>, <strong>setRenderParents()</strong> e <strong>setUlClass()</strong> do objeto menu(). Explicando cada um deles rapidamente (maiores informações -> <a href="http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.navigation.menu" title="Manual Zend Navigation" target="_blank">link</a>):</p>
<p><span id="more-136"></span></p>
<h2>setOnlyActiveBranch(bool false)</h2>
<p>Define que somente o galho ativo deve ser exibido. Por exemplo, caso exista mais de um menu com sub-menus, só aparecerá o sub menu em que o menu principal esteja ativo. Ou seja, caso estejamos na página <strong>A Empresa</strong>, somente será exibido o ramo relativo à página A Empresa.</p>
<h2>setMinDepth(int)</h2>
<p>Define a profundidade mínima do menu a ser exibida.</p>
<h2>setMaxDepth(int)</h2>
<p>O oposto do método anterior. Define a profundidade máxima do menu a ser exibida.</p>
<h2>setRenderParents(bool true)</h2>
<p>Define se junto a um sub menu deve ser renderizado também o pai destes menus. Por exemplo, no caso da página A Empresa, define se no sub-menu o link para página A Empresa aparecerá também.</p>
<h2>setUlClass(string)</h2>
<p>Define o menu com esta classe. Util para definir formatação diferente para menu e sub-menu.</p>
<p>Então, para montar o menu superior sem sub-menu, colocando o sub-menu na lateral sem o menu principal, modificaremos o arquivo base de layout que temos usado na série de artigos para o seguinte:</p>
<p><strong>arquivo default.ini (arquivo de navegação &#8211; mesmo do último artigo)</strong></p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
home.class = &quot;home&quot;
home.title = &quot;Página Inicial&quot;
home.route = &quot;default&quot;
;; Página A empresa
empresa.label = &quot;A empresa&quot;
empresa.controller = &quot;empresa&quot;
empresa.action = &quot;index&quot;
empresa.title = &quot;Informações sobre a empresa&quot;
empresa.route = &quot;default&quot;
        ;; História
        empresa.pages.historia.label = &quot;História&quot;
        empresa.pages.historia.controller = &quot;empresa&quot;
        empresa.pages.historia.action = &quot;historia&quot;
        empresa.pages.historia.title = &quot;História da empresa&quot;
        empresa.pages.historia.route = &quot;default&quot;
        ;; Missão
        empresa.pages.missao.label = &quot;Missão&quot;
        empresa.pages.missao.controller = &quot;empresa&quot;
        empresa.pages.missao.action = &quot;missao&quot;
        empresa.pages.missao.title = &quot;Missão da empresa&quot;
        empresa.pages.missao.route = &quot;default&quot;
        ;; Visão
        empresa.pages.visao.label = &quot;Visão&quot;
        empresa.pages.visao.controller = &quot;empresa&quot;
        empresa.pages.visao.action = &quot;visao&quot;
        empresa.pages.visao.title = &quot;Visão da empresa&quot;
        empresa.pages.visao.route = &quot;default&quot;
;; Página Notícias
noticias.label = &quot;Notícias&quot;
noticias.controller = &quot;noticias&quot;
noticias.action = &quot;index&quot;
noticias.title = &quot;Notícias sobre o mercado&quot;
noticias.route = &quot;default&quot;
        ;; Categoria Esportes
        noticias.pages.esportes.label = &quot;Esportes&quot;
        noticias.pages.esportes.controller = &quot;noticias&quot;
        noticias.pages.esportes.action = &quot;index&quot;
        noticias.pages.esportes.title = &quot;Notícias sobre Esportes&quot;
        noticias.pages.esportes.route = &quot;categoria&quot;
        noticias.pages.esportes.params.categoria = &quot;esportes&quot;
        ;; Categoria Entretenimento
        noticias.pages.entretenimento.label = &quot;Entretenimento&quot;
        noticias.pages.entretenimento.controller = &quot;noticias&quot;
        noticias.pages.entretenimento.action = &quot;index&quot;
        noticias.pages.entretenimento.title = &quot;Notícias sobre Entretenimento&quot;
        noticias.pages.entretenimento.route = &quot;categoria&quot;
        noticias.pages.entretenimento.params.categoria = &quot;entretenimento&quot;
        ;; Categoria Tecnologia
        noticias.pages.tecnologia.label = &quot;Tecnologia&quot;
        noticias.pages.tecnologia.controller = &quot;noticias&quot;
        noticias.pages.tecnologia.action = &quot;index&quot;
        noticias.pages.tecnologia.title = &quot;Notícias sobre Tecnologia&quot;
        noticias.pages.tecnologia.route = &quot;categoria&quot;
        noticias.pages.tecnologia.params.categoria = &quot;tecnologia&quot;
;; Página Contato
contato.label = &quot;Contato&quot;
contato.controller = &quot;contato&quot;
contato.action = &quot;index&quot;
contato.title = &quot;Entre em contato conosco&quot;
contato.route = &quot;default
</pre>
<p><strong>layout.phtml</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;div id=&quot;wrapper&quot;&gt;
        &lt;div id=&quot;top&quot;&gt;
                &lt;?php echo $this-&gt;navigation()-&gt;menu()-&gt;setMaxDepth(0);?&gt;&lt;!-- /menu --&gt;
        &lt;/div&gt;&lt;!-- /top --&gt;
        &lt;div id=&quot;content&quot;&gt;
                &lt;?php echo $this-&gt;navigation()
                                -&gt;menu()
                                -&gt;setOnlyActiveBranch(true)
                                -&gt;setMinDepth(1)
                                -&gt;setMaxDepth(1)
                                -&gt;setRenderParents(false)?&gt;
                                -&gt;setUlClass('sub-menu')?&gt;&lt;!-- /sub-menu --&gt;
                &lt;?php echo $this-&gt;layout()-&gt;content;?&gt;
        &lt;/div&gt;&lt;!-- /content --&gt;
        &lt;div id=&quot;footer&quot;&gt;
                &lt;p&gt;Blog do Matias &amp;copy; &lt;?php echo date('Y')?&gt; • http://matiasrezende.com.br&lt;/p&gt;
        &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /wrapper --&gt;
</pre>
<p>Explicando:
<ul>
<li>No menu principal, definimos <strong>setMaxDepth(0)</strong> para evitar que fosse renderizado o sub-menu.</li>
<li>No sub-menu, definimos <strong>setOnlyActiveBranch(true)</strong> para que fosse exibido somente o sub-menu relativo ao menu selecionado.</li>
<li>Ainda no sub-menu, definimos <strong>setMinDepth(1)</strong> para evitar que fosse renderizado o menu principal no sub-menu e definimos <strong>setMaxDepth(1)</strong> para sobrescrever o que foi definido no objeto anterior (menu), permitindo que apareça só e somente 1 nível de sub-menu.</li>
<li>Como não queremos que apareça o menu pai renderizado no sub-menu, definimos <strong>setRenderParents(false)</strong>.</li>
<li>Classe sub-menu somente para demonstrar a funcionalidade, apesar de não ser necessário.</li>
</ul>
<p>Vejam que mesmo com o menu e sub-menu, o Zend Navigation continua definindo o menu e o sub-menu que está ativo com a classe <strong>active</strong>, como vimos no primeiro artigo.</p>
<p><strong>Obs.:</strong></p>
<p>Existe o método <strong>renderSubMenu()</strong>, que funciona quase como queremos. Ele renderiza, como o <a href="http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.navigation.menu" title="Manual método renderSubMenu() - Zend Navigation" target="_blank">manual diz</a>, o sub-menu mais profundo do container ativo. O problema aparece quando não existe sub-menu no menu ativo (no nosso exemplo, na página Início e Contato, que não tem sub-páginas). Nestes casos, o sub-menu renderizado passa a ser o próprio menu, o que não é o comportamento desejado para este caso, mas se em uma situação você SEMPRE tiver sub-menu, você pode trocar setMinDepth(), setMaxDepth(), setOnlyActiveBranch() e setRenderParents() pelo renderSubMenu().</p>
<p>Está começando a ficar bom utilizar o Zend Navigation??? Vai ficar ainda melhor, pois ainda não vimos <strong>Breadcrumbs</strong>, <strong>Sitemap</strong> e integração com <strong>Zend_Acl</strong>.</p>
<p>Fiquem ligados e acompanhando o restante da série sobre um ótimo recurso do Zend Framework, que facilita bastante nossa vida na hora de criar aplicações.</p>
<p>Comentem!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/separando-menu-de-sub-menu-com-zend-navigation/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Adicionando rotas a uma página com Zend Navigation</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/adicionando-rotas-a-uma-pagina-com-zend-navigation/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/adicionando-rotas-a-uma-pagina-com-zend-navigation/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 20:59:38 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Navigation]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Parte 4]]></category>
		<category><![CDATA[Série Zend Navigation]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=128</guid>
		<description><![CDATA[Opa&#8230; Tudo certo por aí? Já viu os outros posts da série? É melhor começar por eles&#8230; Hoje vamos ver como adicionar rotas a uma página que está em um menu. Não sabe criar rotas ou não sabe o que é uma rota? Dá uma lida aqui antes de prosseguir. Para o nosso caso, vamos [...]]]></description>
			<content:encoded><![CDATA[<p>Opa&#8230; Tudo certo por aí?</p>
<p>Já viu os <a href="http://matiasrezende.com.br/blog/tag/serie-zend-navigation/" title="Série completa Zend Navigation">outros posts</a> da série? É melhor começar por eles&#8230; <img src='http://matiasrezende.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Hoje vamos ver como adicionar rotas a uma página que está em um menu. Não sabe criar rotas ou não sabe o que é uma rota? Dá uma lida <a href="http://matiasrezende.com.br/blog/category/zend-framework/zend-route/">aqui</a> antes de prosseguir. Para o nosso caso, vamos incluir utilizando o método mais simples, que é pelo application.ini.</p>
<p><span id="more-128"></span></p>
<pre class="brush: php; title: ; notranslate">
;; Rota - notícias
resources.router.routes.categoria.route = &quot;/categoria/:categoria&quot;
resources.router.routes.categoria.defaults.controller = &quot;noticias&quot;
resources.router.routes.categoria.defaults.action = &quot;index&quot;
resources.router.routes.categoria.defaults.categoria = null
</pre>
<p>Com isto, precisamos informar ao Zend Navigation em qual rota está cada página. Para isto, utilizamos o código abaixo em nosso navigation/default.ini:</p>
<pre class="brush: php; title: ; notranslate">
noticias.pages.esportes.route = &quot;categoria&quot;
</pre>
<p>Fácil, né? Pois é&#8230; Só que aí aparece um problema nas outras páginas. Quando você entra em uma categoria de notícias, todas as páginas do menu ficam indicando para a própria página. Estranho, né? Isto acontece porque, quando não definimos uma rota específica para uma página, o <strong>View Helper</strong> URL pega a rota da página que está sendo exibida neste momento para criar a URL. Quando você não tem nenhuma rota, isto não é um problema. A partir do momento que você tem mais de uma rota (nosso caso) é um problema chato.</p>
<h3>Como resolver??</h3>
<p>Simples!!!! Definindo a rota das outras páginas como default. Olha como é fácil.</p>
<pre class="brush: php; title: ; notranslate">
noticias.route = &quot;default&quot;
</pre>
<p>Fazendo isto em todas as páginas resolvemos o problema. Depois disto, o <strong>navigation/default.ini</strong> ficou assim:</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
home.class = &quot;home&quot;
home.title = &quot;Página Inicial&quot;
home.route = &quot;default&quot;
;; Página A empresa
empresa.label = &quot;A empresa&quot;
empresa.controller = &quot;empresa&quot;
empresa.action = &quot;index&quot;
empresa.title = &quot;Informações sobre a empresa&quot;
empresa.route = &quot;default&quot;
        ;; História
        empresa.pages.historia.label = &quot;História&quot;
        empresa.pages.historia.controller = &quot;empresa&quot;
        empresa.pages.historia.action = &quot;historia&quot;
        empresa.pages.historia.title = &quot;História da empresa&quot;
        empresa.pages.historia.route = &quot;default&quot;
        ;; Missão
        empresa.pages.missao.label = &quot;Missão&quot;
        empresa.pages.missao.controller = &quot;empresa&quot;
        empresa.pages.missao.action = &quot;missao&quot;
        empresa.pages.missao.title = &quot;Missão da empresa&quot;
        empresa.pages.missao.route = &quot;default&quot;
        ;; Visão
        empresa.pages.visao.label = &quot;Visão&quot;
        empresa.pages.visao.controller = &quot;empresa&quot;
        empresa.pages.visao.action = &quot;visao&quot;
        empresa.pages.visao.title = &quot;Visão da empresa&quot;
        empresa.pages.visao.route = &quot;default&quot;
;; Página Notícias
noticias.label = &quot;Notícias&quot;
noticias.controller = &quot;noticias&quot;
noticias.action = &quot;index&quot;
noticias.title = &quot;Notícias sobre o mercado&quot;
noticias.route = &quot;default&quot;
        ;; Categoria Esportes
        noticias.pages.esportes.label = &quot;Esportes&quot;
        noticias.pages.esportes.controller = &quot;noticias&quot;
        noticias.pages.esportes.action = &quot;index&quot;
        noticias.pages.esportes.title = &quot;Notícias sobre Esportes&quot;
        noticias.pages.esportes.route = &quot;categoria&quot;
        noticias.pages.esportes.params.categoria = &quot;esportes&quot;
        ;; Categoria Entretenimento
        noticias.pages.entretenimento.label = &quot;Entretenimento&quot;
        noticias.pages.entretenimento.controller = &quot;noticias&quot;
        noticias.pages.entretenimento.action = &quot;index&quot;
        noticias.pages.entretenimento.title = &quot;Notícias sobre Entretenimento&quot;
        noticias.pages.entretenimento.route = &quot;categoria&quot;
        noticias.pages.entretenimento.params.categoria = &quot;entretenimento&quot;
        ;; Categoria Tecnologia
        noticias.pages.tecnologia.label = &quot;Tecnologia&quot;
        noticias.pages.tecnologia.controller = &quot;noticias&quot;
        noticias.pages.tecnologia.action = &quot;index&quot;
        noticias.pages.tecnologia.title = &quot;Notícias sobre Tecnologia&quot;
        noticias.pages.tecnologia.route = &quot;categoria&quot;
        noticias.pages.tecnologia.params.categoria = &quot;tecnologia&quot;
;; Página Contato
contato.label = &quot;Contato&quot;
contato.controller = &quot;contato&quot;
contato.action = &quot;index&quot;
contato.title = &quot;Entre em contato conosco&quot;
contato.route = &quot;default&quot;
</pre>
<p>Isto gerou um menu assim</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul class=&quot;navigation&quot;&gt;
    &lt;li class=&quot;active&quot;&gt;
        &lt;a title=&quot;Página Inicial&quot; class=&quot;home&quot; href=&quot;/navigation/public/&quot;&gt;Início&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Informações sobre a empresa&quot; href=&quot;/navigation/public/empresa&quot;&gt;A empresa&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;a title=&quot;História da empresa&quot; href=&quot;/navigation/public/empresa/historia&quot;&gt;História&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Missão da empresa&quot; href=&quot;/navigation/public/empresa/missao&quot;&gt;Missão&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Visão da empresa&quot; href=&quot;/navigation/public/empresa/visao&quot;&gt;Visão&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Notícias sobre o mercado&quot; href=&quot;/navigation/public/noticias&quot;&gt;Notícias&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Esportes&quot; href=&quot;/navigation/public/categoria/esportes&quot;&gt;Esportes&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Entretenimento&quot; href=&quot;/navigation/public/categoria/entretenimento&quot;&gt;Entretenimento&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Tecnologia&quot; href=&quot;/navigation/public/categoria/tecnologia&quot;&gt;Tecnologia&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Entre em contato conosco&quot; href=&quot;/navigation/public/contato&quot;&gt;Contato&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Legal né? Já está gostando mais de usar o Zend Navigation? Ainda tem MUITA coisa para aprender nele. Fiquem ligados nas novidades</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/adicionando-rotas-a-uma-pagina-com-zend-navigation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Adicionando páginas às páginas criadas com Zend Navigation</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/adicionando-paginas-as-paginas-criadas-com-zend-navigation/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/adicionando-paginas-as-paginas-criadas-com-zend-navigation/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 20:30:19 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Navigation]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Parte 3]]></category>
		<category><![CDATA[Série Zend Navigation]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=120</guid>
		<description><![CDATA[Fala galera!!! Tudo certo? Hoje temos o terceiro artigo/tutorial da série sobre o Zend Navigation. Já viu o primeiro e o segundo da série? É bom começar por lá antes de iniciarmos aqui. Muitas vezes temos um site/sistema que precisa montar um menu e um sub-menu, que depende da página (menu) selecionado. Com o Zend [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera!!!</p>
<p>Tudo certo? Hoje temos o terceiro artigo/tutorial da série sobre o Zend Navigation. Já viu o <a href="http://matiasrezende.com.br/blog/zend-framework/criando-um-menu-com-zend-navigation/" title="Primeiro artigo da série sobre Zend Navigation">primeiro</a> e o <a href="http://matiasrezende.com.br/blog/zend-framework/adicionando-atributos-as-paginas/" title="Segundo artigo da série sobre Zend Navigation">segundo</a> da série? É bom começar por lá antes de iniciarmos aqui.</p>
<p><span id="more-120"></span></p>
<p>Muitas vezes temos um site/sistema que precisa montar um menu e um sub-menu, que depende da página (menu) selecionado. Com o Zend Navigation isto é muito simples de fazer. Vejamos qual a estrutura das páginas que teremos:</p>
<ul>
<li>Início</li>
<li>A Empresa
<ul>
<li>História</li>
<li>Missão</li>
<li>Visão</li>
</ul>
</li>
<li>Notícias
<ul>
<li>Esportes</li>
<li>Entretenimento</li>
<li>Tecnologia</li>
</ul>
</li>
<li>Contato</li>
</ul>
<p>Então, vamos adicionar as sub-paginas ao menu já existente. Para isto, cada objeto de página deve receber as sub-páginas, através do atributo page. Vejamos o código como ficou.</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
home.class = &quot;home&quot;
home.title = &quot;Página Inicial&quot;
;; Página A empresa
empresa.label = &quot;A empresa&quot;
empresa.controller = &quot;empresa&quot;
empresa.action = &quot;index&quot;
empresa.title = &quot;Informações sobre a empresa&quot;
        ;; História
        empresa.pages.historia.label = &quot;História&quot;
        empresa.pages.historia.controller = &quot;empresa&quot;
        empresa.pages.historia.action = &quot;historia&quot;
        empresa.pages.historia.title = &quot;História da empresa&quot;
        ;; Missão
        empresa.pages.missao.label = &quot;Missão&quot;
        empresa.pages.missao.controller = &quot;empresa&quot;
        empresa.pages.missao.action = &quot;missao&quot;
        empresa.pages.missao.title = &quot;Missão da empresa&quot;
        ;; Visão
        empresa.pages.visao.label = &quot;Visão&quot;
        empresa.pages.visao.controller = &quot;empresa&quot;
        empresa.pages.visao.action = &quot;visao&quot;
        empresa.pages.visao.title = &quot;Visão da empresa&quot;
;; Página Notícias
noticias.label = &quot;Notícias&quot;
noticias.controller = &quot;noticias&quot;
noticias.action = &quot;index&quot;
noticias.title = &quot;Notícias sobre o mercado&quot;
        ;; Categoria Esportes
        noticias.pages.esportes.label = &quot;Esportes&quot;
        noticias.pages.esportes.controller = &quot;noticias&quot;
        noticias.pages.esportes.action = &quot;esportes&quot;
        noticias.pages.esportes.title = &quot;Notícias sobre Esportes&quot;
        ;; Categoria Entretenimento
        noticias.pages.entretenimento.label = &quot;Entretenimento&quot;
        noticias.pages.entretenimento.controller = &quot;noticias&quot;
        noticias.pages.entretenimento.action = &quot;entretenimento&quot;
        noticias.pages.entretenimento.title = &quot;Notícias sobre Entretenimento&quot;
        ;; Categoria Tecnologia
        noticias.pages.tecnologia.label = &quot;Tecnologia&quot;
        noticias.pages.tecnologia.controller = &quot;noticias&quot;
        noticias.pages.tecnologia.action = &quot;tecnologia&quot;
        noticias.pages.tecnologia.title = &quot;Notícias sobre Tecnologia&quot;
;; Página Contato
contato.label = &quot;Contato&quot;
contato.controller = &quot;contato&quot;
contato.action = &quot;index&quot;
contato.title = &quot;Entre em contato conosco&quot;
</pre>
<p>Desta forma, teremos o seguinte HTML gerado.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul class=&quot;navigation&quot;&gt;
    &lt;li class=&quot;active&quot;&gt;
        &lt;a title=&quot;Página Inicial&quot; class=&quot;home&quot; href=&quot;/navigation/public/&quot;&gt;Início&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Informações sobre a empresa&quot; href=&quot;/navigation/public/empresa&quot;&gt;A empresa&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;a title=&quot;História da empresa&quot; href=&quot;/navigation/public/empresa/historia&quot;&gt;História&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Missão da empresa&quot; href=&quot;/navigation/public/empresa/missao&quot;&gt;Missão&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Visão da empresa&quot; href=&quot;/navigation/public/empresa/visao&quot;&gt;Visão&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Notícias sobre o mercado&quot; href=&quot;/navigation/public/noticias&quot;&gt;Notícias&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Esportes&quot; href=&quot;/navigation/public/noticias/esportes&quot;&gt;Esportes&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Entretenimento&quot; href=&quot;/navigation/public/noticias/entretenimento&quot;&gt;Entretenimento&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Tecnologia&quot; href=&quot;/navigation/public/noticias/tecnologia&quot;&gt;Tecnologia&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Entre em contato conosco&quot; href=&quot;/navigation/public/contato&quot;&gt;Contato&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Certo, tudo funcionou. Mas a questão das categorias tá estranho, não? Imaginem ter que criar uma action para cada categoria de notícias, ou então capturar tudo em um método __call()? Feio, né? Vamos mudar este menu, para que o nome da categoria seja passada por parâmetro para a action index. Ficaria desta forma:</p>
<pre class="brush: php; title: ; notranslate">
        ;; Categoria Esportes
        noticias.pages.esportes.label = &quot;Esportes&quot;
        noticias.pages.esportes.controller = &quot;noticias&quot;
        noticias.pages.esportes.action = &quot;index&quot;
        noticias.pages.esportes.title = &quot;Notícias sobre Esportes&quot;
        noticias.pages.esportes.params.categoria = &quot;esportes&quot;
        ;; Categoria Entretenimento
        noticias.pages.entretenimento.label = &quot;Entretenimento&quot;
        noticias.pages.entretenimento.controller = &quot;noticias&quot;
        noticias.pages.entretenimento.action = &quot;index&quot;
        noticias.pages.entretenimento.title = &quot;Notícias sobre Entretenimento&quot;
        noticias.pages.entretenimento.params.categoria = &quot;entretenimento&quot;
        ;; Categoria Tecnologia
        noticias.pages.tecnologia.label = &quot;Tecnologia&quot;
        noticias.pages.tecnologia.controller = &quot;noticias&quot;
        noticias.pages.tecnologia.action = &quot;index&quot;
        noticias.pages.tecnologia.title = &quot;Notícias sobre Tecnologia&quot;
        noticias.pages.tecnologia.params.categoria = &quot;tecnologia&quot;
</pre>
<p>Teríamos com este código um sub-menu assim:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;li&gt;
        &lt;a title=&quot;Notícias sobre o mercado&quot; href=&quot;/navigation/public/noticias&quot;&gt;Notícias&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Esportes&quot; href=&quot;/navigation/public/noticias/index/categoria/esportes&quot;&gt;Esportes&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Entretenimento&quot; href=&quot;/navigation/public/noticias/index/categoria/entretenimento&quot;&gt;Entretenimento&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a title=&quot;Notícias sobre Tecnologia&quot; href=&quot;/navigation/public/noticias/index/categoria/tecnologia&quot;&gt;Tecnologia&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
</pre>
<p>Legal?? Mais ou menos, né? A URL ficou bem estranha&#8230; Vamos adicionar uma rota (Zend Route) para que a URL fique mais amigável. Mas isto é coisa para o próximo artigo.</p>
<p>Comentem!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/adicionando-paginas-as-paginas-criadas-com-zend-navigation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adicionando atributos às páginas com Zend Navigation</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/adicionando-atributos-as-paginas-com-zend-navigation/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/adicionando-atributos-as-paginas-com-zend-navigation/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 12:06:09 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Navigation]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Parte 2]]></category>
		<category><![CDATA[Série Zend Navigation]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=100</guid>
		<description><![CDATA[Fala galera Hoje vamos para o segundo artigo da série sobre o Zend Navigation. Vamos aprender a adicionar atributos às páginas. Antes de ler este artigo, sugiro que leia o primeiro da série, porque usaremos como base os códigos postados lá. Então, para este artigo, vamos adicionar alguns atributos HTML ao menu, como class e [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera</p>
<p>Hoje vamos para o segundo artigo da série sobre o Zend Navigation. Vamos aprender a adicionar atributos às páginas. Antes de ler este artigo, sugiro que leia o <a href="http://matiasrezende.com.br/blog/zend-framework/criando-um-menu-com-zend-navigation/" title="Zend Navigation - primeiro artigo da série">primeiro da série</a>, porque usaremos como base os códigos postados lá.</p>
<p>Então, para este artigo, vamos adicionar alguns atributos HTML ao menu, como class e title.</p>
<p><span id="more-100"></span></p>
<p>Vamos relembrar como estava nosso navigation.ini?</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
;; Página A empresa
empresa.label = &quot;A empresa&quot;
empresa.controller = &quot;empresa&quot;
empresa.action = &quot;index&quot;
;; Página Notícias
noticias.label = &quot;Notícias&quot;
noticias.controller = &quot;noticias&quot;
noticias.action = &quot;index&quot;
;; Página Contato
contato.label = &quot;Contato&quot;
contato.controller = &quot;contato&quot;
contato.action = &quot;index&quot;
</pre>
<p>Agora, para adicionarmos uma class a um item do menu (tag a), apenas adicionamos o atributo class à página que queremos. Vamos adicionar a classe home para a página home.</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
home.class = &quot;home&quot;
</pre>
<p>Simples assim. Teremos assim um html do menu como abaixo:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul class=&quot;navigation&quot;&gt;
    &lt;li class=&quot;active&quot;&gt;
        &lt;a class=&quot;home&quot; href=&quot;/navigation/public/&quot;&gt;Início&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;/navigation/public/empresa&quot;&gt;A empresa&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;/navigation/public/noticias&quot;&gt;Notícias&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;/navigation/public/contato&quot;&gt;Contato&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Certo, mas pra que serve isto? Imagina que o seu menu tem ícones diferentes para cada página&#8230; Pronto!!! Só formatar o CSS, como abaixo:</p>
<pre class="brush: css; title: ; notranslate">
                        div#top ul.navigation li a.home {
                                background: url(../img/icons/house.png) no-repeat 10px center ;
                                padding-left: 35px;
                        }

                        div#top ul.navigation li a:hover, div#top ul.navigation li.active {
                                background-color: gray;
                        }
</pre>
<p>Usando esta imagem como ícone.</p>
<p><a href="http://matiasrezende.com.br/blog/wp-content/uploads/2011/08/house.png"><img src="http://matiasrezende.com.br/blog/wp-content/uploads/2011/08/house.png" alt="" title="house" width="16" height="16" class="alignleft size-full wp-image-101" /></a></p>
<p>Agora, vamos adicionar um title para cada página. Alguém arrisca como fazemos isto? Se você disse para fazer igual fizemos com a class, ACERTOU!!! Então, vamos ao código.</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
home.class = &quot;home&quot;
home.title = &quot;Página Inicial&quot;
;; Página A empresa
empresa.label = &quot;A empresa&quot;
empresa.controller = &quot;empresa&quot;
empresa.action = &quot;index&quot;
empresa.title = &quot;Informações sobre a empresa&quot;
;; Página Notícias
noticias.label = &quot;Notícias&quot;
noticias.controller = &quot;noticias&quot;
noticias.action = &quot;index&quot;
noticias.title = &quot;Notícias sobre o mercado&quot;
;; Página Contato
contato.label = &quot;Contato&quot;
contato.controller = &quot;contato&quot;
contato.action = &quot;index&quot;
contato.title = &quot;Entre em contato conosco&quot;
</pre>
<p>Isto gera um HTML assim:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul class=&quot;navigation&quot;&gt;
    &lt;li&gt;
        &lt;a title=&quot;Página Inicial&quot; class=&quot;home&quot; href=&quot;/navigation/public/&quot;&gt;Início&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class=&quot;active&quot;&gt;
        &lt;a title=&quot;Informações sobre a empresa&quot; href=&quot;/navigation/public/empresa&quot;&gt;A empresa&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Notícias sobre o mercado&quot; href=&quot;/navigation/public/noticias&quot;&gt;Notícias&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a title=&quot;Entre em contato conosco&quot; href=&quot;/navigation/public/contato&quot;&gt;Contato&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Com isto, temos um menu um pouco mais flexível em termos de HTML/CSS, permitindo formatações diferentes para cada item do menu, além de poder adicionar o title, importante para acessibilidade e SEO.</p>
<p>Por hoje é só. No próximo artigo vamos adicionar páginas às páginas já existentes e configurar a exibição do menu, mostrando em locais separados o menu e o sub-menu. Aguardem e comentem!!!</p>
<p>Carlos Eduardo</p>
<p>Postado também no <a href="http://forum.imasters.com.br/blog/11/entry-17-zend-navigation-adicionando-atributos-as-paginas/">Fórum iMasters</a></p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/adicionando-atributos-as-paginas-com-zend-navigation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando um menu com Zend Navigation</title>
		<link>http://matiasrezende.com.br/blog/zend-framework/criando-um-menu-com-zend-navigation/</link>
		<comments>http://matiasrezende.com.br/blog/zend-framework/criando-um-menu-com-zend-navigation/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 23:19:47 +0000</pubDate>
		<dc:creator>Matias Rezende</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Navigation]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Parte 1]]></category>
		<category><![CDATA[Série Zend Navigation]]></category>

		<guid isPermaLink="false">http://matiasrezende.com.br/blog/?p=37</guid>
		<description><![CDATA[Olá a todos Este é o primeiro post de uma série de posts que farei sobre o Zend Navigation. Começaremos apenas criando um menu simples, para mostrar como iniciar com o Zend Navigation. Para todos os exemplos, vamos tomar por base um site que terá a seguinte configuração básica: Início A empresa Notícias Ver notícia [...]]]></description>
			<content:encoded><![CDATA[<p>Olá a todos</p>
<p>Este é o primeiro post de uma série de posts que farei sobre o Zend Navigation. Começaremos apenas criando um menu simples, para mostrar como iniciar com o Zend Navigation.
<p>Para todos os exemplos, vamos tomar por base um site que terá a seguinte configuração básica:</p>
<ul>
<li>Início</li>
<li>A empresa</li>
<li>Notícias</li>
<ul>
<li>Ver notícia</li>
</ul>
</ul>
<p><span id="more-37"></span></p>
<h3>Criando o helper navigation()</h3>
<p>Basicamente, temos 2 formas de criar. Uma delas é diretamente no arquivo application.ini. A outra, usando _initNavigation() no Bootstrap, deixando os dados das páginas em arquivo separado.</p>
<h4>Via application.ini</h4>
<p>Para fazermos a configuração via application.ini, é bem simples.</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
resources.navigation.pages.home.label = &quot;Início&quot;
resources.navigation.pages.home.controller = &quot;index&quot;
resources.navigation.pages.home.action = &quot;index&quot;
;; Página A empresa
resources.navigation.pages.empresa.label = &quot;A empresa&quot;
resources.navigation.pages.empresa.controller = &quot;empresa&quot;
resources.navigation.pages.empresa.action = &quot;index&quot;
;; Página Notícias
resources.navigation.pages.noticias.label = &quot;Notícias&quot;
resources.navigation.pages.noticias.controller = &quot;noticias&quot;
resources.navigation.pages.noticias.action = &quot;index&quot;
;; Página Contato
resources.navigation.pages.contato.label = &quot;Contato&quot;
resources.navigation.pages.contato.controller = &quot;contato&quot;
resources.navigation.pages.contato.action = &quot;index&quot;
</pre>
<p>Esta é uma solução quando temos poucas páginas, não temos necessidade de modificar nenhuma informação (como Label). Eu particularmente não gosto de fazer assim, pois acho &#8220;feio&#8221;. O application.ini deve ser usado para configurações e não vejo a definição das páginas existentes no sistema como uma configuração desta forma.</p>
<h3>Via boostrap e arquivo .ini</h3>
<p>Criando o helper via boostrap, podemos utilizar tanto um array, quanto um arquivo XML quanto um arquivo .ini. Eu prefiro trabalhar com arquivo .ini, pois acho mais &#8220;Estilo Zend&#8221; de fazer. Então, criaremos um arquivo chamado <strong>default.ini</strong> dentro da pasta <strong>navigation</strong>, que vai ficar dentro da pasta application (pode ser qualquer nome que você quiser e em qualquer lugar) e adicionaremos o seguinte ao nosso boostrap:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	protected function _initNavigation() {
		$this-&gt;bootstrap ( 'layout' );
		$layout = $this-&gt;getResource ( 'layout' );
		$view = $layout-&gt;getView ();
		$config = new Zend_Config_Ini ( APPLICATION_PATH . '/navigation/default.ini' ); // caso tenha trocado o nome ou local do arquivo, modifique esta linha
		$navigation = new Zend_Navigation ( $config );
		$view-&gt;navigation ( $navigation );
	}
}</pre>
<p>Obs.: Caso tenha trocado o nome ou localização do arquivo, não esqueça de trocar também o caminho/nome no seu Bootstrap</p>
<p>O nosso arquivo default.ini ficará assim:</p>
<pre class="brush: php; title: ; notranslate">
;; Página Início
home.label = &quot;Início&quot;
home.controller = &quot;index&quot;
home.action = &quot;index&quot;
;; Página A empresa
empresa.label = &quot;A empresa&quot;
empresa.controller = &quot;empresa&quot;
empresa.action = &quot;index&quot;
;; Página Notícias
noticias.label = &quot;Notícias&quot;
noticias.controller = &quot;noticias&quot;
noticias.action = &quot;index&quot;
;; Página Contato
contato.label = &quot;Contato&quot;
contato.controller = &quot;contato&quot;
contato.action = &quot;index&quot;
</pre>
<p>Pronto. Para iniciarmos, o que temos até o momento já basta. Daqui para frente, vamos assumir que foi feito sempre utilizando a forma Boostrap + arquivo .ini.</p>
<h3>Montando o Menu</h3>
<p>Agora, vamos utilizar este menu no nosso site. O site terá 3 partes. Topo, conteúdo e rodapé. O html será básico, da seguinte forma.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $this-&gt;doctype ( 'XHTML1_STRICT' )?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;?php
$this-&gt;headTitle ()
	-&gt;append ( 'Matias Rezende' )
	-&gt;append ( 'Blog' )
	-&gt;append ( 'Zend Navigation' )
	-&gt;setSeparator ( ' - ' );

$this-&gt;headMeta ()
	-&gt;appendHttpEquiv ( 'Content-Type', 'text/html;charset=UTF-8' )
	-&gt;appendHttpEquiv ( 'Content-Language', 'pt-br' );

$this-&gt;headLink ()
	-&gt;setSeparator ( PHP_EOL );

$this-&gt;headScript ()
	-&gt;setSeparator ( PHP_EOL );

echo $this-&gt;headTitle (), PHP_EOL;
echo $this-&gt;headMeta (), PHP_EOL;
echo $this-&gt;headLink (), PHP_EOL;
echo $this-&gt;headScript ();
?&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div id=&quot;wrapper&quot;&gt;
		&lt;div id=&quot;top&quot;&gt;
			&lt;?php echo $this-&gt;navigation ()-&gt;menu ();?&gt;&lt;!-- /menu --&gt;
		&lt;/div&gt;&lt;!-- /top --&gt;
		&lt;div id=&quot;content&quot;&gt;
			&lt;?php echo $this-&gt;layout ()-&gt;content;?&gt;
        &lt;/div&gt;&lt;!-- /content --&gt;
		&lt;div id=&quot;footer&quot;&gt;
			&lt;p&gt;Blog do Matias © &lt;?php echo date ( 'Y' )?&gt; • http://matiasrezende.com.br&lt;/p&gt;
		&lt;/div&gt;&lt;!-- /footer --&gt;
	&lt;/div&gt;&lt;!-- /wrapper --&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Ao acessarmos a página inicial do site, temos o seguinte.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;title&gt;Matias Rezende - Blog - Zend Navigation&lt;/title&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=UTF-8&quot; /&gt;
&lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;pt-br&quot; /&gt;

&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;wrapper&quot;&gt;
        &lt;div id=&quot;top&quot;&gt;
                &lt;ul class=&quot;navigation&quot;&gt;
    &lt;li class=&quot;active&quot;&gt;
        &lt;a href=&quot;/navigation/public/&quot;&gt;Início&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;/navigation/public/empresa&quot;&gt;A empresa&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;/navigation/public/noticias&quot;&gt;Notícias&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;/navigation/public/contato&quot;&gt;Contato&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;&lt;!-- /menu --&gt;
        &lt;/div&gt;&lt;!-- /top --&gt;
        &lt;div id=&quot;content&quot;&gt;
                &lt;h1&gt;Início&lt;/h1&gt;
&lt;p&gt;Página inicial&lt;/p&gt;   &lt;/div&gt;&lt;!-- /content --&gt;
        &lt;div id=&quot;footer&quot;&gt;
                &lt;p&gt;Blog do Matias © 2011 • http://matiasrezende.com.br&lt;/p&gt;
        &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /wrapper --&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Com quase nada de CSS, temos um efeito um pouco melhor no menu (é, continua feio, mas o artigo é do Zend_Navigation e não do design&#8230; <img src='http://matiasrezende.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Não me culpem por não saber fazer nada de layout!!! <img src='http://matiasrezende.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ).</p>
<pre class="brush: css; title: ; notranslate">
@charset &quot;UTF-8&quot;;

* {
        margin: 0;
        padding: 0;
        list-style: none;
}

a {
        text-decoration: none;
}

a:hover {
        text-decoration: underline;
}

body {
        font-family: Arial, sans-serif;
}

div#wrapper {
        width: 1000px;
        margin: 0 auto;
        background: red;
}

div#top {
        height: 200px;
        background: blue;
}

        /**
         * CSS Menu
         */
        div#top ul.navigation {
                height: 40px;
        }

                div#top ul.navigation li {
                        float: left;
                        line-height: 30px;
                        background: green;
                }

                        div#top ul.navigation li a {
                                color: #fff;
                                display: block;
                                padding: 5px 15px;
                        }

                        div#top ul.navigation li a:hover {
                                background: gray;
                        }

div#content {
        background: white;
        min-height: 400px;
}

div#footer {
        text-align: center;
        padding: 10px;
}</pre>
<p><a href="http://matiasrezende.com.br/blog/wp-content/uploads/2011/07/tela1o.jpg"><img src="http://matiasrezende.com.br/blog/wp-content/uploads/2011/07/tela1o-1024x482.jpg" alt="Imagem 1 - exemplo do Zend Navigation" title="Imagem 1" width="560" height="263" class="alignleft size-large wp-image-84" /></a></p>
<p>Se vocês perceberem, o menu é feito utilizando ul li e recebe a classe navigation. Isto pode ser alterado, mas não entraremos nesta situação ainda.</p>
<p>Até agora, você viu alguma vantagem em utilizar o Zend_Navigation? Eu confesso que ainda não, mas vamos começar a ver a primeira das vantagens agora (e até o final da série de artigos veremos MUITOS outros).</p>
<p>Normalmente, nos menus que fazemos, a página ativa recebe uma formatação especial. Se você é uma pessoa atenta, percebeu que, ao acessar a página inicial (no HTML colado ali em cima), o link para esta opção do menu recebeu a classe active. isto mesmo, o Zend_Navigation já identificou a página que está ativa neste momento!!! Para formatar o menu ativo, vamos modificar um pouco o CSS.</p>
<pre class="brush: css; title: ; notranslate">
                        div#top ul.navigation li a:hover, div#top ul.navigation li.active {
                                background: gray;
                        }
</pre>
<p>Pronto!!! O menu ativo já está igual ao menu onde o mouse está!! Assim, você pode formatar (com CSS) da forma que bem entender.</p>
<p><a href="http://matiasrezende.com.br/blog/wp-content/uploads/2011/07/tela2c.jpg"><img src="http://matiasrezende.com.br/blog/wp-content/uploads/2011/07/tela2c-1024x484.jpg" alt="Tela 2 Exemplo" title="Tela 2" width="560" height="264" class="alignleft size-large wp-image-89" /></a></p>
<p>E aí? Já está valendo a pena utilizar o Zend_Navigation? Então espere até ver mais alguns recursos possíveis com ele.
</p>
<p>Fiquem atentos aos próximos artigos desta série sobre o Zend_Navigation, mais uma das poderosas ferramentas do Zend Framework.</p>
<p>Abraços!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://matiasrezende.com.br/blog/zend-framework/criando-um-menu-com-zend-navigation/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

