<?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::Nivaldo &#187; viewhelper</title>
	<atom:link href="http://www.nivaldoarruda.com.br/tag/viewhelper/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nivaldoarruda.com.br</link>
	<description>Tecnologias Web, PHP e Aquários</description>
	<lastBuildDate>Sun, 29 Aug 2010 23:59:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Desvendando os Decorators (Zend_form_decorator) &#8211; Parte 1</title>
		<link>http://www.nivaldoarruda.com.br/2009/05/06/desvendando-os-decorators-zend_form_decorator-parte-1/</link>
		<comments>http://www.nivaldoarruda.com.br/2009/05/06/desvendando-os-decorators-zend_form_decorator-parte-1/#comments</comments>
		<pubDate>Wed, 06 May 2009 18:09:10 +0000</pubDate>
		<dc:creator>Nivaldo Arruda</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[1.8.0]]></category>
		<category><![CDATA[apostila]]></category>
		<category><![CDATA[decorator]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[viewhelper]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Form]]></category>
		<category><![CDATA[zend_form_decorator]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://www.nivaldoarruda.com.br/?p=386</guid>
		<description><![CDATA[Como sempre tive (e ainda tenho) problemas com os decorators, grande parte dos acessos para esse blog são provenientes de buscas por &#8220;decorators&#8221; e principalmente por ter recebido uma sugestão direta do XAngel, eu resolvi criar uma série de post em duas partes sobre o assunto. Nessa primeira parte, irei apenas traduzir a página sobre [...]

<br/><br/>
<strong>Posts relacionados:</strong><ol><li><a href='http://www.nivaldoarruda.com.br/2009/09/07/zend-framework-tutorial-personalizando-os-decorators/' rel='bookmark' title='Permanent Link: Zend Framework &#8211; Tutorial &#8211; Personalizando os decorators'>Zend Framework &#8211; Tutorial &#8211; Personalizando os decorators</a> <small>php, zend, hospedagem, ajax, programação, tutorial, curso, apostila, site, criar...</small></li>
<li><a href='http://www.nivaldoarruda.com.br/2009/03/22/dica-rapida-decorators/' rel='bookmark' title='Permanent Link: Dica Rápida: Decorators'>Dica Rápida: Decorators</a> <small>Aceitando a sugestão do XAngel irei providenciar um artigo bem...</small></li>
<li><a href='http://www.nivaldoarruda.com.br/2009/02/16/integrando-o-zend-framework-com-o-dojo-parte-iii/' rel='bookmark' title='Permanent Link: Integrando o Zend Framework com o Dojo &#8211; Parte III'>Integrando o Zend Framework com o Dojo &#8211; Parte III</a> <small>Dando continuidade a nossa integração, vamos dar uma rapida olhada...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p>Como sempre tive (e ainda tenho) problemas com os decorators, grande parte dos acessos para esse blog são provenientes de buscas por &#8220;decorators&#8221; e principalmente por ter recebido uma sugestão direta do <a title="Cueca Suja" href="http://www.cuecasuja.com" target="_blank">XAngel</a>, eu resolvi criar uma série de post em duas partes sobre o assunto.</p>
<p>Nessa primeira parte, irei apenas traduzir a página sobre <a title="Zend_Form_Decorator" href="http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.decorators" target="_blank">Decorators</a> do ZF Reference Guide. Ela contém uma boa explicação sobre o seu funcionamento e algumas dicas bem úteis que podem resolver alguns problemas rapidamente.</p>
<p>A segunda parte será um pouco mais interessante, pois irei exemplificar a criação de decorators customizados, que alteram o layout dos forms &#8220;automagicamente&#8221;.</p>
<p>Sem mais enrolação, vamos para o post.<br />
<span id="more-386"></span><br />
<span style="color: #008000;"><strong>Decorators</strong></span></p>
<p>Um ponto em particular (e penoso) para muitos desenvolvedores web é a criação automática de forms XHTML. O desenvolvedor precisa, para cada elemento, criar marcas para o próprio elemento (típicamente um label) e marcas especiais para exibir as mensagens de validações de erros. Quanto mais elementos na página, mais trabalhosa a tarefa se torna.</p>
<p>O Zend_Form_Element tenta resolver esse problema usando &#8220;decorators&#8221;. Decorators são classes simples que possuem acesso ao elemento e métodos para renderizar seu conteúdo. Para mais informações sobre como os decorators funcionam, por favor, veja a seção <a title="Decorators" href="http://framework.zend.com/manual/en/zend.form.decorators.html" target="_blank">Zend_Form_Decorator</a>.</p>
<p><span style="color: #008000;"><strong>Os decorators padrões, utilizado pelo Zend_Form_Element, são:</strong></span></p>
<ul>
<li><strong>ViewHelper</strong>: Específica o view helper utilizado para renderizar o elemento. O atributo &#8220;helper&#8221; do elemento pode ser usado para especificar qual view helper utilizar. Por padrão, o Zend_Form_Element especifica o helper &#8220;formText&#8221;, mas subclasses individuais especificam outros helpers.</li>
</ul>
<ul>
<li><strong>Errors</strong>: Anexa a mensagem de erro ao elemento utilizando o Zend_View_Helper_FormErrors. Se não existe erros, nada aparecerá.</li>
</ul>
<ul>
<li><strong>Description</strong>: Adiciona uma descrição para o elemento. Se nenhuma descrição foi setada, nada aparecerá. Por padrão, a descrição é renderizada dentro de uma tag &#8220;&lt;p&gt;&#8221; com a classe (css) &#8220;description&#8221;.</li>
</ul>
<ul>
<li><strong>HtmlTag</strong>: Agrupa o elemento e os erros na tag HTML &#8220;&lt;dd&gt;&#8221;.</li>
</ul>
<ul>
<li><strong>Label</strong>: Anexa um label para o elemento, utilizando o Zend_View_Helper_FormLabel, e o empacora na tag &#8220;&lt;dt&gt;&#8221;. Se nenhum label for especificado apenas a tag é renderizada.</li>
</ul>
<blockquote><p><span style="color: #008000;"><strong>Decorators padrões não precisam ser carregados</strong></span></p>
<p>Os decorators padrões são carregados durante a inicialização do objeto. Você pode disabilitar isso passando a opção &#8216;disableLoadDefaultDecorators&#8217;  para o construtor:</p>
<pre name="code" language="php">$element = new Zend_Form_Element('foo',
array('disableLoadDefaultDecorators' =&gt;
true)
);</pre>
<p>Essa opção pode ser enviada junto com qualquer outra opção que você passar, tanto como array quanto como um objeto Zend_Config.</p></blockquote>
<p>Uma vez que a ordem, em que os decorators foram registrados, é importante &#8211; o primeiro decorator registrado é executado em primeiro &#8211; você precisa ter certeza que está registrando seus decorators em uma ordem apropriada, ou garantir que você setou as opções de posicionamento em um design compreensivel. Para ilustrar melhor, esse é o código que registra os decorators padrões:</p>
<pre name="code" language="php">$this-&gt;addDecorators(array(
array('ViewHelper'),
array('Errors'),
array('Description', array('tag' =&gt; 'p', 'class' =&gt; 'description')),
array('HtmlTag', array('tag' =&gt; 'dd')),
array('Label', array('tag' =&gt; 'dt')),
));</pre>
<pre name="code" language="php">&lt;dt&gt;&lt;label for="foo" class="optional"&gt;Foo&lt;/label&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;input type="text" name="foo" id="foo" value="123" /&gt;
&lt;ul class="errors"&gt;
&lt;li&gt;Mensagem de erro&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="description"&gt;
Descrição do elemento
&lt;/p&gt;
&lt;/dd&gt;</pre>
<blockquote><p><span style="color: #008000;"><strong>Utilizando múltiplos decorators de um mesmo tipo</strong></span></p>
<p>Internamente, o Zend_Form_Element usa uma classe de decorator como mecanismo de busca para obter decorators. Como resultado, você não pode registrar mais de um decorator do mesmo tipo; Os decorators subsequentes irão simplesmente sobrescrever o anterior.</p>
<p>Para contornar isso, você pode utilizar aliases. Ao invés de passar o decorator ou o seu nome como primeiro argumento para o &#8220;addDecorator()&#8221;, passe um array com um único elemento, com um alias apontando para o objeto do decorator ou seu nome:</p>
<pre name="code" language="php">// Alias para 'FooBar':
$element-&gt;addDecorator(array('FooBar' =&gt; 'HtmlTag'),
array('tag' =&gt; 'div'));

//obtendo:
$decorator = $element-&gt;getDecorator('FooBar');</pre>
<p>Nos métodos &#8220;addDecorators()&#8221; e &#8220;setDecorators()&#8221;, você precisa informar no array a opção &#8220;decorator&#8221; representando o decorator:</p>
<pre name="code" language="php">
// Adiciona dois decorator "HtmlTag", um deles apontando para "FooBar"
$element-&gt;addDecorators(
array('HtmlTag', array('tag' =&gt; 'div')),
array(
'decorator' =&gt; array('FooBar' =&gt; 'HtmlTag'),
'options' =&gt; array('tag' =&gt; 'dd')
),
);

//Obtendo:
$htmlTag = $element-&gt;getDecorator('HtmlTag');
$fooBar  = $element-&gt;getDecorator('FooBar');</pre>
</blockquote>
<p><span style="color: #008000;"><strong>Métodos associados com os decoratos:</strong></span></p>
<ul>
<li>addDecorator($nomeOuDecorator, array $options = null)</li>
<li>addDecorators(array $decorators)</li>
<li>setDecorators(array $decorators) (Sobrescreve todos os decorators)</li>
<li>getDecorator($name) (obtém um decorator pelo nome)</li>
<li>getDecorators() (obtém todos os decorators)</li>
<li>removeDecorator($name) (remove um decorator pelo nome)</li>
<li>clearDecorators() (remove todos os decorators)</li>
</ul>
<p>O Zend_Form_Element usa também &#8220;overloading&#8221; para permitir a renderização de decorator específicos. &#8220;__call()&#8221;  irá interceptar os métodos que iniciam com &#8220;render&#8221; e usa o restante do nome para buscar pelo decorator; Se encontrar, ele irá renderiza-lo. Qualquer argumento passado pela chamada do método será utilizado como conteúdo informado para o método &#8220;render()&#8221; do decorator. Por exemplo:</p>
<pre name="code" language="php">// Renderiza apenas o decorator ViewHelper:
echo $element-&gt;renderViewHelper();

// Renderiza apenas o decorator ViewHelper, passando o conteúdo:

echo $element-&gt;renderHtmlTag("Esse é o conteúdo da tag HTML.");</pre>
<p>Se um decorator não existe uma exceção é criada.</p>
<hr />
Original: <a title="Zend Guide" href="http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.decorators" target="_blank">http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.decorators</a><br />
Traduzido Por: Nivaldo Arruda (<a href="http://www.nivaldoarruda.com.br" target="_blank">http://www.nivaldoarruda.com.br</a>)</p>
<hr />
</div>

<br/><br/><p><strong>Posts relacionados:</strong><ol><li><a href='http://www.nivaldoarruda.com.br/2009/09/07/zend-framework-tutorial-personalizando-os-decorators/' rel='bookmark' title='Permanent Link: Zend Framework &#8211; Tutorial &#8211; Personalizando os decorators'>Zend Framework &#8211; Tutorial &#8211; Personalizando os decorators</a> <small>php, zend, hospedagem, ajax, programação, tutorial, curso, apostila, site, criar...</small></li>
<li><a href='http://www.nivaldoarruda.com.br/2009/03/22/dica-rapida-decorators/' rel='bookmark' title='Permanent Link: Dica Rápida: Decorators'>Dica Rápida: Decorators</a> <small>Aceitando a sugestão do XAngel irei providenciar um artigo bem...</small></li>
<li><a href='http://www.nivaldoarruda.com.br/2009/02/16/integrando-o-zend-framework-com-o-dojo-parte-iii/' rel='bookmark' title='Permanent Link: Integrando o Zend Framework com o Dojo &#8211; Parte III'>Integrando o Zend Framework com o Dojo &#8211; Parte III</a> <small>Dando continuidade a nossa integração, vamos dar uma rapida olhada...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.nivaldoarruda.com.br/2009/05/06/desvendando-os-decorators-zend_form_decorator-parte-1/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
