Files
smarty/docs/pt_BR/appendixes/tips.xml

356 lines
11 KiB
XML
Raw Normal View History

2004-03-28 15:24:19 +00:00
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="tips">
<title>Dicas &amp; Truques</title>
<para>
</para>
<sect1 id="tips.blank.var.handling">
<title>Manipula<EFBFBD><EFBFBD>o de Vari<72>vel Vazia</title>
<para>
Quando voc<6F> quer algumas vezes imprimir um valor que voc<6F> definir para uma vari<72>vel vazia
ao inv<6E>s de imprimir nada, tal como imprimindo "&amp;nbsp;" a fim de que plano de fundo de tabelas
funcionem corretamente. Muitos usariam uma instru<72><75>o {if} para manipular isto, mas h<> um
macete com o Smarty, usando o modificador de vari<72>vel
<emphasis>default</emphasis>.
</para>
<example>
<title>Imprimindo &amp;nbsp; quando uma vari<72>vel est<73> vazia</title>
<programlisting>
{* A forma mais longa *}
{if $title eq ""}
&amp;nbsp;
{else}
{$title}
{/if}
{* A forma mais simples *}
{$title|default:"&amp;nbsp;"}</programlisting>
</example>
</sect1>
<sect1 id="tips.default.var.handling">
<title>Manipula<EFBFBD><EFBFBD>o do valor padr<64>o de Vari<72>vel</title>
<para>
Se uma vari<72>vel <20> usada freq<65>entemente em seus templates, aplicando o modificador
default toda vez que ela <20> mencionado pode evitar um bit desagrad<61>vel. Voc<6F> pode remediar isto
pela atribui<75><69>o de um valor padr<64>o para a vari<72>vel com a fun<75><6E>o
<link linkend="language.function.assign">assign</link>.
</para>
<example>
<title>Atribuindo o valor padr<64>o para uma vari<72>vel de template</title>
<programlisting>
{* fa<66>a isto em algum lugar no topo de seu template *}
{assign var="titulo" value=$titulo|default:"sem t<>tulo"}
{* Se o $titulo estava vazio, ele agora cont<6E>m o valor "sem titulo" quando voc<6F> exib<69>-lo *}
{$title}</programlisting>
</example>
</sect1>
<sect1 id="tips.passing.vars">
<title>Passando a vari<72>vel titulo para o template de cabe<62>alho</title>
<para>
Quando a maioria de seus templates usam os mesmos cabe<62>alhos e mesmos rodap<61>s, <20>
comum dividi-los um em cada template e ent<6E>o inclu<6C>-los. Mas o que fazer se o
cabe<62>alho precisa ter um titulo diferente, dependendo de que p<>gina ele est<73> vindo?
Voc<6F> pode passar o titulo para o
cabe<62>alho quando ele <20> inclu<6C>do.
</para>
<example>
<title>Passando a vari<72>vel titulo para o template de cabe<62>alho</title>
<programlisting>
mainpage.tpl
------------
{include file="header.tpl" titulo="P<>gina Principal"}
{* O corpo do template vem aqui *}
{include file="footer.tpl"}
archives.tpl
------------
{config_load file="archive_page.conf"}
{include file="header.tpl" titulo=#archivePageTitle#}
{* O corpo do template vem aqui *}
{include file="footer.tpl"}
header.tpl
----------
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;{$titulo|default:"BC News"}&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
footer.tpl
----------
&lt;/BODY&gt;
&lt;/HTML&gt;</programlisting>
</example>
<para>
Quando a p<>gina principal <20> atra<72>da, o t<>tulo da "P<>gina Principal" <20> passado para o template
header.tpl, e ser<65> subseq<65>encialmente usado com o t<>tulo. Quando a p<>gina de arquivamento <20> atra<72>da,
o t<>tulo ser<65> "Archives". Note no exemplo de archive, n<>s estamos usando uma vari<72>vel do arquivo
archives_page.conf ao inv<6E>s de uma vari<72>vel codificada r<>gida.
Tamb<6D>m note que "BC news" <20> exibida se
a vari<72>vel $titulo n<>o est<73> definida,
usando o modificador de vari<72>vel <emphasis>default</emphasis>.
</para>
</sect1>
<sect1 id="tips.dates">
<title>Datas</title>
<para>
Como uma regra b<>sica, sempre passe datas para o smarty como timestamps. Isto permite ao
desenhista de template utilizar <link linkend="language.modifier.date.format">date_format</link>
para controle completo sobre a formata<74><61>o de data,
e tamb<6D>m facilita a compara<72><61>o de datas se
necess<73>rio.
</para>
<para>
NOTA: No Smarty 1.4.0, voc<6F> pode passar datas para o Smarty como timestamps unix,
mysql, ou qualquer outra data interpret<65>vel por strtotime().
</para>
<example>
<title>Usando date_format</title>
<programlisting>
{$startDate|date_format}
SA<EFBFBD>DA:
Jan 4, 2001
{$startDate|date_format:"%Y/%m/%d"}
SA<EFBFBD>DA:
2001/01/04
{if $date1 &lt; $date2}
...
{/if}</programlisting>
</example>
<para>
Quando usando {html_select_date} em um template, o programador normalmente vai querer converter
a sa<73>da de um formul<75>rio de volta para o formato de timestamp. Aqui est<73> uma fun<75><6E>o para ajudar
com isso.
</para>
<example>
<title>Convertendo elementos em forma de data de volta para um timestamp</title>
<programlisting>
// isto assume que a forma de seus elementos s<>o nomeadas como
// startDate_Day, startDate_Month, startDate_Year
$startDate = makeTimeStamp($startDate_Year,$startDate_Month,$startDate_Day);
function makeTimeStamp($year="",$month="",$day="")
{
if(empty($year))
$year = strftime("%Y");
if(empty($month))
$month = strftime("%m");
if(empty($day))
$day = strftime("%d");
return mktime(0,0,0,$month,$day,$year);
}</programlisting>
</example>
</sect1>
<sect1 id="tips.wap">
<title>WAP/WML</title>
<para>
Os templates WAP/WML requerem um cabe<62>alho de Content-Type de PHP para ser passado junto com
template. A forma mais f<>cil de fazer isto seria escrever uma fun<75><6E>o customizada que imprime
o cabe<62>alho. Se voc<6F> est<73> usando sistema de caching, esse n<>o funcionar<61>, ent<6E>o n<>s faremos isso
usando a tag de insert (lembre que tags de insert n<>o s<>o "cached!") Certifique-se que n<>o h<> sa<73>da
para o navegador antes do template,
sen<65>o o cabe<62>alho ir<69> falhar.
</para>
<example>
<title>Usando insert para escrever um cabe<62>alho WML Content-Type</title>
<programlisting>
// esteja certo que o apache est<73> configurado para as extens<6E>es .wml !
// ponha esta fun<75><6E>o em algum lugar de sua aplica<63><61>o, ou em Smarty.addons.php
function insert_header() {
// esta fun<75><6E>o espera o argumento $content
extract(func_get_arg(0));
if(empty($content))
return;
header($content);
return;
}
// seu template Smarty _deve_ come<6D>ar com a insert tag, olha o exemplo:
{insert name=header content="Content-Type: text/vnd.wap.wml"}
&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;
&lt;!-- begin new wml deck --&gt;
&lt;wml&gt;
&lt;!-- begin first card --&gt;
&lt;card&gt;
&lt;do type="accept"&gt;
&lt;go href="#two"/&gt;
&lt;/do&gt;
&lt;p&gt;
Bem-vindo ao WAP com Smarty!
Pressione OK para continuar...
&lt;/p&gt;
&lt;/card&gt;
&lt;!-- begin second card --&gt;
&lt;card id="two"&gt;
&lt;p&gt;
Bem f<>cil isso, n<>o <20>?
&lt;/p&gt;
&lt;/card&gt;
&lt;/wml&gt;</programlisting>
</example>
</sect1>
<sect1 id="tips.componentized.templates">
<title>Templates componentizados</title>
<para>
Esta dica <20> um pouco de hack, mas ainda <20> uma id<69>ia limpa.
Use-a por seu pr<70>prio risco. ;-)
</para>
<para>
Tradicionalmente, programar templates em suas aplica<63><61>es segue esta forma:
Primeiro, voc<6F> acumula suas vari<72>veis dentro de sua aplica<63><61>o PHP, (talvez com requisi<73><69>es
de banco de dados.) Ent<6E>o, voc<6F> instancia seu objeto Smarty, atribui valores <20>s vari<72>veis
e exibe o template. Por exemplo n<>s temos um registrador de estoque em nosso template.
N<>s coletar<61>amos os dados estocagem em nossa aplica<63><61>o, ent<6E>o damos valor a estas vari<72>veis
no template e o exibimos. Agora isso seria legal
se voc<6F> adicionasse este registrador de
armazenamento (stock ticker) para qualquer aplica<63><61>o simplesmente incluindo o template, e sem
se preocupar com a busca de dados mais a frente?
</para>
<para>
Voc<6F> pode embutir o PHP dentro de seus templates com as tags {php}{/php}.
Com isto, voc<6F> pode configurar templates independentes, tendo a sua pr<70>pria
estrutura de dados para dar valor <20>s suas pr<70>prias vari<72>veis. Com a l<>gica embutida
dessa forma, voc<6F> pode manter a l<>gica do template &amp; junto. Desta maneira n<>o <20>
importante de onde o fonte do
template est<73> vindo, ele est<73> sempre junto como um componente.
</para>
<example>
<title>Template componentizado</title>
<programlisting>
{* Smarty *}
{php}
// configurar nossa fun<75><6E>o para buscar dados armazenados
function fetch_ticker($symbol,&amp;$ticker_name,&amp;$ticker_price) {
// ponha a l<>gica aqui que procura $ticker_name
// e $ticker_price de algum recurso
}
// chama a fun<75><6E>o
fetch_ticker("YHOO",$ticker_name,$ticker_price);
// passando valores <20>s vari<72>veis de template
$this->assign("ticker_name",$ticker_name);
$this->assign("ticker_price",$ticker_price);
{/php}
Nome do Estoque: {$ticker_name} Pre<72>o do Estoque: {$ticker_price}</programlisting>
</example>
<para>
No Smarty 1.5.0, h<> at<61> uma forma mais limpa. Voc<6F> pode incluir o php em seus templates com
a tag {include_php ...}.
Desta forma voc<6F> pode manter a l<>gica do PHP separada da l<>gica do
template. Veja a fun<75><6E>o <link linkend="language.function.include.php">include_php</link> para
mais informa<6D><61>o.
</para>
<example>
<title>Template componentizado com include_php</title>
<programlisting>
load_ticker.php
---------------
&lt;?php
// configura nossa fun<75><6E>o para buscar os dados armazenados
function fetch_ticker($symbol,&amp;$ticker_name,&amp;$ticker_price) {
// ponha aqui a l<>gica que procura $ticker_name
// e $ticker_price de algum recurso
}
// chama a fun<75><6E>o
fetch_ticker("YHOO",$ticker_name,$ticker_price);
// passar valores para as vari<72>veis de template
$this->assign("ticker_name",$ticker_name);
$this->assign("ticker_price",$ticker_price);
?&gt;
index.tpl
---------
{* Smarty *}
{include_php file="load_ticker.php"}
Nome do Estoque: {$ticker_name} Pre<72>o do Estoque: {$ticker_price}</programlisting>
</example>
</sect1>
<sect1 id="tips.obfuscating.email">
<title>Ofuscando endere<72>os de E-mail</title>
<para>
Voc<6F> deseja saber como seu endere<72>o de E-mail consegue entrar em tantas listas de email de spam?
A <20>nica forma de spammers coletar endere<72>os de E-mail <20> de p<>ginas da web. Para ajudar a combater
este problema, voc<6F> pode fazer o seu endere<72>o de E-mail aparecer em javascript misturado no
c<>digo HTML, mesmo assim ele aparecer<65> e funcionar<61> corretamente no navegador. Isto <20> feito com
o plugin mailto.
</para>
<example>
<title>Exemplo de ofuscamento de um Endere<72>o de E-mail</title>
<programlisting>
index.tpl
---------
envia inquisi<73><69>o para
{mailto address=$EmailAddress encode="javascript" subject="Ol<4F>"}
</programlisting>
</example>
<note>
<title>Nota t<>cnica</title>
<para>
Este m<>todo n<>o <20> 100% a prova de falha. Um spammer poderia criar um programa
para coletar o e-mail e para decodificar estes valores, mas n<>o <20> muito comum.
</para>
</note>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->