split the pt_br dir

This commit is contained in:
didou
2004-03-28 15:24:19 +00:00
parent c2cd578414
commit 7c2a2e433c
18 changed files with 9932 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="bugs">
<title>BUGS</title>
<para>
Verifique o arquivo de BUGS que v<>m com a <20>ltima distribui<75><69>o do Smarty, ou
verifique o website.
</para>
</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
-->

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="resources">
<title>Recursos</title>
<para>
A homepage do Smarty est<73> localizada em http://smarty.php.net/.
Voc<6F> pode entrar na lista de email enviando um e-mail para
smarty-general-subscribe@lists.php.net. Um arquivo da lista de e-mail pode ser
visto em http://marc.theaimsgroup.com/?l=smarty&amp;r=1&amp;w=2
</para>
</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
-->

View File

@@ -0,0 +1,356 @@
<?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
-->

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="troubleshooting">
<title>Localiza<EFBFBD><EFBFBD>o de Erros</title>
<para></para>
<sect1 id="smarty.php.errors">
<title>erros de Smarty/PHP </title>
<para>
O Smarty pode obter muitos erros tais como, atributos de tags perdidos ou nomes de vari<72>veis
mal formadas. Se isto acontece, voc<6F> ver<65>
um erro como segue:
</para>
<example>
<title>Erros do Smarty</title>
<programlisting>
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
in /path/to/smarty/Smarty.class.php on line 1041
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
in /path/to/smarty/Smarty.class.php on line 1041</programlisting>
</example>
<para>
O Smarty te mostra o nome do template, o n<>mero da linha e o erro.
Depois disso, o erro consiste do n<>mero da linha da classe Smarty em que o erro
ocorreu.
</para>
<para>
H<> certos erros que o smarty n<>o pode entender, tais como um um fechamento de tags errado.
Estes tipos de erros normalmente
termina na interpreta<74><61>o de erros do tempo de compila<6C><61>o do PHP.
</para>
<example>
<title>Erros de an<61>lise do PHP</title>
<programlisting>
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75</programlisting>
</example>
<para>
Quando voc<6F> encontra um erro de an<61>lise de PHP, o n<>mero da linha do erro corresponder<65> ao
script PHP compilado, n<>o o template em si. Normalmente voc<6F> pode no template localizar o
erro de sintaxe. Aqui algumas coisas para voc<6F> procurar:
falta de fechamento de tags para {if}{/if} ou
{section}{/section}, ou sintaxe da l<>gica dentro de uma tag {if}.
Se voc<6F> n<>o encontra o erro, voc<6F> pode ter
que abrir o arquivo PHP compilado e ir at<61> o numero da linha exibido, no local onde o erro correspondente
est<73> no template.
</para>
</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
-->

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="chapter.debugging.console">
<title>Debugging Console</title>
<para>
H<> um console para debug incluso no Smarty. O console informa a voc<6F> de
todos os templates inclu<6C>dos, vari<72>veis definidas e vari<72>veis de arquivos de configura<72><61>o
da chamada atual do template. Um template chamado "debug.tpl"
<20> incluso com a distribui<75><69>o do Smarty o qual controla a formata<74><61>o
do console. Defina $debugging para true no Smarty, e se necess<73>rio defina $debug_tpl
para o caminho de recurso de debug.tpl (isto <20> SMARTY_DIR por
padr<64>o.) Quando voc<6F> carrega uma p<>gina, um console em javascript ir<69> abrir uma
janela popup e dar a voc<6F> o nome de todos os templates inclu<6C>dos e as vari<72>veis definidas
para a p<>gina atual. Para ver as vari<72>veis dispon<6F>veis para um template
em particular, veja a fun<75><6E>o <link linkend="language.function.debug">{debug}</link>.
Para desabilitar o console de debug, defina $debugging para
false. Voc<6F> pode ativar temporariamente o console de debug colocando
SMARTY_DEBUG na URL se voc<6F> ativou esta op<6F><70>o com <link
linkend="variable.debugging.ctrl">$debugging_ctrl</link>.
</para>
<note>
<title>Nota T<>cnica</title>
<para>
O console de debug n<>o funciona quando voc<6F> usa a API fetch(),
apenas quando estiver usando display(). <20> um conjunto de comandos javascript
adicionados ao final do template gerado. Se voc<6F> n<>o gosta de javascript,
voc<6F> pode editar o template debug.tpl para formatar a sa<73>da como voc<6F> quiser.
Dados de debug n<>o s<>o guardados em cache e os dados de debug.tpl
n<>o s<>o inclu<6C>dos no console de debug.
</para>
</note>
<note>
<para>
Os tempos de carregamento de cada template e arquivo de cofigura<72><61>o s<>o em segundos,
ou ent<6E>o fra<72><61>es.
</para>
</note>
</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
-->

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="config.files">
<title>Arquivos de Configura<72><61>o</title>
<para>
Arquivos de configura<72><61>o s<>o <20>teis para designers gerenciarem v<>riaveis
globais para os templates a partir de um arquivo. Um exemplo s<>o as cores do template. Normalmente se
se voc<6F> quer mudar o tema de cores para uma aplica<63><61>o, voc<6F> deve ir
em cada um dos arquivos de template e mudar as cores. Com
um arquivo de configura<72><61>o, as cores podem ser mantidas em um lugar, e apenas
um arquivo precisa ser atualizado.
</para>
<example>
<title>Examplo de sintaxe de um arquivo de configura<72><61>o</title>
<programlisting>
# global variables
pageTitle = "Main Menu"
bodyBgColor = #000000
tableBgColor = #000000
rowBgColor = #00ff00
[Customer]
pageTitle = "Customer Info"
[Login]
pageTitle = "Login"
focus = "username"
Intro = """este <20> um valor
que se divide m mais de uma linha. deve
estar dentro de tr<74>s aspas."""
# hidden section
[.Database]
host=my.domain.com
db=ADDRESSBOOK
user=php-user
pass=foobar</programlisting>
</example>
<para>
Valores de vari<72>veis podem estar entre aspas, mas n<>o <20> necess<73>rio.
Voc<6F> pode usar aspas simples ou duplas. Se voc<6F> tiver um valor que
ocupe mais de uma linha, coloque todo o valor entre tr<74>s aspas
("""). Voc<6F> pode colocar coment<6E>rios em um arquivo de configura<72><61>o com qualquer sintaxe
que n<>o seja v<>lida em um arquivo de configura<72><61>o. N<>s recomendamos usar um <literal>#</literal>
(cancela) no <20>nicio de cada linha.
</para>
<para>
Este arquivo de onfigura<72><61>o tem duas se<73><65>es. Nomes de se<73><65>es devem estar entre conchetes
[]. Nomes de se<73><65>o podem ser string arbritraria que n<>o contenham os s<>mbolos
<literal>[</literal> ou <literal>]</literal>. As quatro vari<72>veis no top s<>o
vari<72>veis globais, ou vari<72>veis sem se<73><65>o.
Estas vari<72>veis s<>o sempre carregadas do arquivo de configura<72><61>o. Se uma se<73><65>o em
particular for carregada, ent<6E>o as vari<72>veis globais e as vari<72>veis desta se<73><65>o s<>o carregadas.
Se uma vari<72>vel existir como global e dentro de uma se<73><65>o,
a vari<72>vel da se<73><65>o ser<65> utilizada. Se voc<6F> tiver duas vari<72>veis na mesma se<73><65>o com o mesmo nome,
a <20>ltima ser<65> utilizada.
</para>
<para>
Arquivos de configura<72><61>o s<>o carregados no template com a fun<75><6E>o embutida
<command>config_load</command>.
</para>
<para>
Voc<6F> pode esconder vari<72>veis ou se<73><65>es inteiras colocando um ponto
antes do nome da vari<72>vel. Isto <20> <20>til se a sua aplica<63><61>o
se arquivos de configura<72><61>o e l<> dados sens<6E>veis a partir deles
que a ferramenta de template n<>o precisa. Se voc<6F> tem terceiros fazendo a edi<64><69>o de templates,
voc<6F> ter<65> certesa que eles n<>o leiam dados sens<6E>veis
do arquivo de configura<72><61>o carregando ele no template.
</para>
</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
-->

View File

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="language.basic.syntax">
<title>Sintaxe B<>sica</title>
<para>
Todas as tags de template do Smarty est<73>o fechadas com delimitadores.
Por padr<64>o, estes delimitadores s<>o <literal>{</literal> e
<literal>}</literal>, mas eles podem ser mudados.
</para>
<para>
Para estes exemplos, n<>s iremos assumir que voc<6F> est<73> usando os
delimitadores padr<64>o. No Smarty, todo o conte<74>do fora dos delimitadores <20>
mostrado como conte<74>do estatico, ou sem modifica<63><61>es. Quando o Smarty encontra
tags de template, ele tenta interpreta-las, e ent<6E>o mostra a sa<73>da
apropriada em seu lugar.
</para>
<sect1 id="language.syntax.comments">
<title>Coment<EFBFBD>rios</title>
<para>
Coment<6E>rios de template s<>o cercados por asteriscos, e s<>o cercados por
delimitadores, assim: {* este <20> um coment<6E>rio *}.
Coment<6E>rios Smarty n<>o s<>o mostrado na sa<73>da final do template.
Eles s<>o usados para fazer notas internas nos templates.
</para>
<example>
<title>Coment<EFBFBD>rios</title>
<programlisting>
{* Smarty *}
{* inclui o arquivo header aqui *}
{include file="header.tpl"}
{include file=$includeFile}
{include file=#includeFile#}
{* Mostra listas dropdown *}
&lt;SELECT name=company&gt;
{html_options values=$vals selected=$selected output=$output}
&lt;/SELECT&gt;</programlisting>
</example>
</sect1>
<sect1 id="language.syntax.functions">
<title>Fun<EFBFBD><EFBFBD>es</title>
<para>
Cada tag Smarty mostra uma
<link linkend="language.variables">vari<EFBFBD>vel</link> ou utiliza algum tipo de
fun<75><6E>o. Fun<75><6E>es s<>o processadas e mostradas colocando-se a fun<75><6E>o e seus
atributos entre delimitadores, assim: {funcname
attr1="val" attr2="val"}.
</para>
<example>
<title>Sintaxe de fun<75><6E>es</title>
<programlisting>
{config_load file="colors.conf"}
{include file="header.tpl"}
{if $highlight_name}
Welcome, &lt;font color="{#fontColor#}"&gt;{$name}!&lt;/font&gt;
{else}
Welcome, {$name}!
{/if}
{include file="footer.tpl"}</programlisting>
</example>
<para>
Ambas as fun<75><6E>es internas e as fun<75><6E>es customizadas tem a mesma sintaxe nos
templates. Fun<75><6E>es internas s<>o o funcionamento do Smarty,
assim como <command>if</command>, <command>section</command> e
<command>strip</command>. Elas n<>o podem ser modificadas. Fun<75><6E>es customizadas
s<>o fun<75><6E>es adicionais implementadas por plugins. Elas podem ser modificadas
como voc<6F> quiser, ou voc<6F> pode adionar novas. <command>html_options</command> e
<command>html_select_date</command> s<>o exemplos de fun<75><6E>es customizadas.
</para>
</sect1>
<sect1 id="language.syntax.attributes">
<title>Atributos</title>
<para>
A maioria das fun<75><6E>es levam atributos que especificam ou modificam o seu
funcionamento. Atributos para fun<75><6E>es Smarty s<>o muito parecidos como
atributos HTML. Valores est<73>ticos s<>o precisam estar entre aspas,
mas <20> recomendados para strings literais. Vari<72>veis tamb<6D>m podem ser
usadas, e n<>o precisam estar entre aspas.
</para>
<para>
Alguns atributos requerem valores booleanos (true ou false). Estes podem
ser especificados sem aspas <literal>true</literal>,
<literal>on</literal>, e <literal>yes</literal>, ou
<literal>false</literal>, <literal>off</literal>, e
<literal>no</literal>.
</para>
<example>
<title>Sintaxe de atributos de fun<75><6E>es</title>
<programlisting>
{include file="header.tpl"}
{include file=$includeFile}
{include file=#includeFile#}
{html_select_date display_days=yes}
&lt;SELECT name=company&gt;
{html_options values=$vals selected=$selected output=$output}
&lt;/SELECT&gt;</programlisting>
</example>
</sect1>
<sect1 id="language.syntax.quotes">
<title>Colocando Vari<72>veis em Aspas Duplas</title>
<para>
Smarty ir<69> reconhecer vari<72>veis entre aspas duplas enquanto
as vari<72>veis conterem apenas n<>meros, letras, sublinhados e conchetes
[]. Com qualquer outro caractere (pontos, referencia de objetos, etc.) as vari<72>veis
devem estar entre ap<61>strofos.
</para>
<example>
<title>Sintaxe entre aspas</title>
<programlisting>
EXEMPLOS DE SINTAXE:
{func var="test $foo test"} &lt;-- v<> $foo
{func var="test $foo_bar test"} &lt;-- v<> $foo_bar
{func var="test $foo[0] test"} &lt;-- v<> $foo[0]
{func var="test $foo[bar] test"} &lt;-- v<> $foo[bar]
{func var="test $foo.bar test"} &lt;-- v<> $foo (not $foo.bar)
{func var="test `$foo.bar` test"} &lt;-- v<> $foo.bar
EXEMPLOS PRATICOS:
{include file="subdir/$tpl_name.tpl"} &lt;-- ir<69> substituir $tpl_name com o valor
{cycle values="one,two,`$smarty.config.myval`"} &lt;-- deve ter ap<61>strofos</programlisting>
</example>
</sect1>
<sect1 id="language.math">
<title>Matem<EFBFBD>tica</title>
<para>
Matem<65>tica pode ser aplicada diretamente em valores de vari<72>veis.
</para>
<example>
<title>Exemplos de matem<65>tica</title>
<programlisting>
{$foo+1}
{$foo*$bar}
{* alguns exemplos mais complicados *}
{$foo-&gt;bar-$bar[1]*$baz-&gt;foo-&gt;bar()-3*7}
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
{assign var="foo" value="`$foo+$bar`"}</programlisting>
</example>
</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
-->

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="language.combining.modifiers">
<title>Combinando Modificadores</title>
<para>
Voc<6F> pode aplicar qualquer n<>mero de modificadores para uma vari<72>vel. Eles ser<65>o
aplicados na ordem que eles foram combinados, da esquerda para a direita. Eles
devem ser separados com um caractere <literal>|</literal> (pipe).
</para>
<example>
<title>Combinando Modificadores</title>
<programlisting>
index.php:
$smarty = new Smarty;
$smarty-&gt;assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
$smarty-&gt;display('index.tpl');
index.tpl:
{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}
MOSTRA:
Smokers are Productive, but Death Cuts Efficiency.
S M O K E R S A R E P R O D U C T I V E , B U T D E A T H C U T S E F F I C I E N C Y .
s m o k e r s a r e p r o d u c t i v e , b u t d e a t h c u t s...
s m o k e r s a r e p r o d u c t i v e , b u t . . .
s m o k e r s a r e p. . .</programlisting>
</example>
</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
-->

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,342 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="language.variables">
<title>Vari<EFBFBD>veis</title>
<para>
O Smarty tem v<>rios tipos diferentes de vari<72>veis. O tipo de vari<72>vel depende de
de qual s<>mbolo esta prefixada(ou cercada).
</para>
<para>
Vari<72>veis no Smarty podem ser mostradas diretamente ou usada como argumentos para
atributos de fun<75><6E>es e modificadores, dentro de express<73>es condicionais, etc.
Para mostrar uma vari<72>vel, simplesmente coloque ela entre delimitadores sendo que
ela seja a <20>nica coisa entre eles. Exemplos:
<programlisting>
{$Name}
{$Contacts[row].Phone}
&lt;body bgcolor="{#bgcolor#}"&gt;</programlisting>
</para>
<sect1 id="language.assigned.variables">
<title>Vari<EFBFBD>veis definidas do PHP</title>
<para>
Vari<72>veis que s<>o definidas do PHP s<>o referenciadas precedendo elas
com um sinal de sifr<66>o <literal>$</literal>. Vari<72>veis definidas dentro do template
com a fun<75><6E>o <link linkend="language.function.assign">assign</link>
tamb<6D>m s<>o mostradas desta maneira.
</para>
<example>
<title>Vari<EFBFBD>veis definidas</title>
<programlisting>
Hello {$firstname}, glad to see you could make it.
&lt;p&gt;
Your last login was on {$lastLoginDate}.
MOSTRA:
Hello Doug, glad to see you could make it.
&lt;p&gt;
Your last login was on January 11th, 2001.</programlisting>
</example>
<sect2 id="language.variables.assoc.arrays">
<title>Associative arrays</title>
<para>
Voc<6F> tamb<6D>m pode referenciar matrizes associativas que s<>o definidas no PHP
especificando a chave depois do s<>mbolo '.'
(ponto).
</para>
<example>
<title>Acessando vari<72>veis de matriz associativa</title>
<programlisting>
index.php:
$smarty = new Smarty;
$smarty-&gt;assign('Contacts',
array('fax' => '555-222-9876',
'email' => 'zaphod@slartibartfast.com',
'phone' => array('home' => '555-444-3333',
'cell' => '555-111-1234')));
$smarty-&gt;display('index.tpl');
index.tpl:
{$Contacts.fax}&lt;br&gt;
{$Contacts.email}&lt;br&gt;
{* you can print arrays of arrays as well *}
{$Contacts.phone.home}&lt;br&gt;
{$Contacts.phone.cell}&lt;br&gt;
MOSTRA:
555-222-9876&lt;br&gt;
zaphod@slartibartfast.com&lt;br&gt;
555-444-3333&lt;br&gt;
555-111-1234&lt;br&gt;</programlisting>
</example>
</sect2>
<sect2 id="language.variables.array.indexes">
<title><EFBFBD>ndices de Matrizes</title>
<para>
Voc<6F> pode referencia matrizes pelo seu <20>ndice, muito
parecido com a sintaxe nativa do PHP.
</para>
<example>
<title>Acesando matrizes por seus <20>ndices</title>
<programlisting>
index.php:
$smarty = new Smarty;
$smarty-&gt;assign('Contacts',
array('555-222-9876',
'zaphod@slartibartfast.com',
array('555-444-3333',
'555-111-1234')));
$smarty-&gt;display('index.tpl');
index.tpl:
{$Contacts[0]}&lt;br&gt;
{$Contacts[1]}&lt;br&gt;
{* you can print arrays of arrays as well *}
{$Contacts[2][0]}&lt;br&gt;
{$Contacts[2][1]}&lt;br&gt;
MOSTRA:
555-222-9876&lt;br&gt;
zaphod@slartibartfast.com&lt;br&gt;
555-444-3333&lt;br&gt;
555-111-1234&lt;br&gt;</programlisting>
</example>
</sect2>
<sect2 id="language.variables.objects">
<title>Objetos</title>
<para>
Propriedades de objetos definidos do PHP podem ser referenciados
especificando-se o nome da propriedade depois do s<>mbolo '-&gt;'.
</para>
<example>
<title>Acessando propriedades de objetos</title>
<programlisting>
name: {$person-&gt;name}&lt;br&gt;
email: {$person-&gt;email}&lt;br&gt;
MOSTRA:
name: Zaphod Beeblebrox&lt;br&gt;
email: zaphod@slartibartfast.com&lt;br&gt;</programlisting>
</example>
</sect2>
</sect1>
<sect1 id="language.config.variables">
<title>Vari<EFBFBD>veis carregadas de arquivos de configura<72><61>o</title>
<para>
Vari<72>veis que s<>o carregadas de arquivos de configura<72><61>o s<>o referenciadas
colocando-se elas entre cancelas (#), ou com a vari<72>vel smarty
<link
linkend="language.variables.smarty.config">$smarty.config</link>.
A segunda sintaxe <20> <20>til para coloca-las
entre aspas em um atributo.
</para>
<example>
<title>Vari<EFBFBD>veis de configura<72><61>o</title>
<programlisting>
foo.conf:
pageTitle = "This is mine"
bodyBgColor = "#eeeeee"
tableBorderSize = "3"
tableBgColor = "#bbbbbb"
rowBgColor = "#cccccc"
index.tpl:
{config_load file="foo.conf"}
&lt;html&gt;
&lt;title&gt;{#pageTitle#}&lt;/title&gt;
&lt;body bgcolor="{#bodyBgColor#}"&gt;
&lt;table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}"&gt;
&lt;tr bgcolor="{#rowBgColor#}"&gt;
&lt;td&gt;First&lt;/td&gt;
&lt;td&gt;Last&lt;/td&gt;
&lt;td&gt;Address&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
index.tpl: (sintaxe alternativa)
{config_load file="foo.conf"}
&lt;html&gt;
&lt;title&gt;{$smarty.config.pageTitle}&lt;/title&gt;
&lt;body bgcolor="{$smarty.config.bodyBgColor}"&gt;
&lt;table border="{$smarty.config.tableBorderSize}" bgcolor="{$smarty.config.tableBgColor}"&gt;
&lt;tr bgcolor="{$smarty.config.rowBgColor}"&gt;
&lt;td&gt;First&lt;/td&gt;
&lt;td&gt;Last&lt;/td&gt;
&lt;td&gt;Address&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
SA<EFBFBD>DA: (mesma para ambos exemplos)
&lt;html&gt;
&lt;title&gt;This is mine&lt;/title&gt;
&lt;body bgcolor="#eeeeee"&gt;
&lt;table border="3" bgcolor="#bbbbbb"&gt;
&lt;tr bgcolor="#cccccc"&gt;
&lt;td&gt;First&lt;/td&gt;
&lt;td&gt;Last&lt;/td&gt;
&lt;td&gt;Address&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</programlisting>
</example>
<para>
Vari<72>veis de um arquivo de configura<72><61>o n<>o podem ser usadas at<61>
que sejam carregadas de um arquivo de configura<72><61>o. Este procedimento
<20> explicado posteriormente neste documento em
<command>config_load</command>.
</para>
</sect1>
<sect1 id="language.variables.smarty">
<title>A vari<72>vel reservada {$smarty}</title>
<para>
A vari<72>vel reservada {$smarty} pode ser utilizada para acessar vari<72>veis
especiais do template. Segue uma lista completa.
</para>
<sect2 id="language.variables.smarty.request">
<title>Vari<EFBFBD>veis Request</title>
<para>
Vari<72>veis request como get, post, cookies, server,
environment, e session podem ser acessadas como mostrado
nos exemplos abaixo:
</para>
<example>
<title>Mostrando v<>ri<72>veis request</title>
<programlisting>
{* mostra o valor de page da URL (GET) http://www.domain.com/index.php?page=foo *}
{$smarty.get.page}
{* mostra a vari<72>vel "page" de um formul<75>rio (POST) *}
{$smarty.post.page}
{* mostra o valor do cookie "username" *}
{$smarty.cookies.username}
{* mostra a vari<72>vel do servidor "SERVER_NAME" *}
{$smarty.server.SERVER_NAME}
{* mostra a vari<72>vel de ambiente do sistema "PATH" *}
{$smarty.env.PATH}
{* mostra a vari<72>vel de session do php "id" *}
{$smarty.session.id}
{* mostra a vari<72>vel "username" da uni<6E>o de get/post/cookies/server/env *}
{$smarty.request.username}</programlisting>
</example>
</sect2>
<sect2 id="language.variables.smarty.now">
<title>{$smarty.now}</title>
<para>
O timestamp atual pode ser acessado com {$smarty.now}.
O n<>mero reflete o n<>mero de segundos passados desde o assim chamado
Epoch (1 de Janeiro de 1970) e pode ser passado diretamente para o
modificador date_format para mostrar a data.
</para>
<example>
<title>Usando {$smarty.now}</title>
<programlisting>
{* usa o modificador date_format para mostrar a data e hora atuais *}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</programlisting>
</example>
</sect2>
<sect2 id="language.variables.smarty.const">
<title>{$smarty.const}</title>
<para>
Voc<6F> pode acessar o valor de constantes PHP diretamente.
</para>
<example>
<title>Usando {$smarty.const}</title>
<programlisting>
{$smarty.const._MY_CONST_VAL}</programlisting>
</example>
</sect2>
<sect2 id="language.variables.smarty.capture">
<title>{$smarty.capture}</title>
<para>
A sa<73>da capturada via {capture}..{/capture} pode ser acessada usando a vari<72>vel
{$smarty}. Veja a a se<73><65>o sobre
<link linkend="language.function.capture">capture</link> para um exemplo.
</para>
</sect2>
<sect2 id="language.variables.smarty.config">
<title>{$smarty.config}</title>
<para>
A vari<72>vel {$smarty} pode ser usada para referir vari<72>veis de configura<72><61>o carregadas.
{$smarty.config.foo} <20> um sinonimo para {#foo#}. Veja a se<73><65>o sobre
<link linkend="language.function.config.load">config_load</link> para um exemplo.
</para>
</sect2>
<sect2 id="language.variables.smarty.loops">
<title>{$smarty.section}, {$smarty.foreach}</title>
<para>
A vari<72>vel {$smarty} pode ser usada para se referir a propriedades 'section' e
'foreach' de loop. Veja a documenta<74><61>o sobre
<link linkend="language.function.section">section</link> e
<link linkend="language.function.foreach">foreach</link>.
</para>
</sect2>
<sect2 id="language.variables.smarty.template">
<title>{$smarty.template}</title>
<para>
Esta vari<72>vel cont<6E>m o nome do template
atual que esta sendo processado.
</para>
</sect2>
</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
-->

View File

@@ -0,0 +1,546 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="advanced.features">
<title>Advanced Features</title>
<sect1 id="advanced.features.objects">
<title>Objetos</title>
<para>
O Smarty permite acesso a objetos do PHP atrav<61>s de seus templates. H<> duas formas de acess<73>-los.
Uma forma <20> registrar objetos para o template, ent<6E>o os acessa via sintaxe similar a fun<75><6E>es
customiz<69>veis. A outra forma <20> atribuir objetos para os templates e acess<73>-los como se fossem
uma vari<72>vel atribu<62>da. O primeiro m<>todo tem uma sintaxe de template muito mais legal. E tamb<6D>m
mais segura, <20> medida que um objeto registrado pode ser restrito a certos m<>todos e
propriedades. Entretanto, um objeto registrado n<>o pode ser
posto em loop ou ser atribuido em arrays de
objetos, etc. O m<>todo que voc<6F> escolher ser<65> determinado pelas suas necessidades, mas use o
primeiro m<>todo se poss<73>vel para
manter um m<>nimo de sintaxe no template.
</para>
<para>
Se a seguran<61>a est<73> habilitada, nenhum dos m<>todos privados ou fun<75><6E>es podem acessados
(come<6D>ando com "_"). Se um m<>todo e propriedade de um mesmo nome existir, o m<>todo ser<65>
usado.
</para>
<para>
Voc<6F> pode restringir os m<>todos e propriedades que podem ser acessados listando os em um array
como o terceiro par<61>metro de registra<72><61>o.
</para>
<para>
Por defini<6E><69>o, par<61>metros passados para objetos atrav<61>s dos templates s<>o passados da mesma
forma que fun<75><6E>es customiz<69>veis os obt<62>m. Um array associativo <20> passado como o primeiro par<61>metro,
e o objeto smarty como o segundo. Se voc<6F> quer que os par<61>metros passados um de cada vez
por cada argumento como passagem de par<61>metro de objeto tradicional, defina o quarto par<61>metro
de registra<72><61>o para falso.
</para>
<para>
O quinto par<61>metro opcional s<> tem efeito com <parameter>format</parameter>
sendo <literal>true</literal> e cont<6E>m
uma lista de m<>tods de ob que seriam tratados como
blocos. Isso significa que estes m<>todos
tem uma tag de fechamento no template
(<literal>{foobar->meth2}...{/foobar->meth2}</literal>) e
os par<61>metros para os m<>todos tem a mesma sinopse como os par<61>metros para
block-function-plugins: Eles pegam 4 par<61>metros
<parameter>$params</parameter>,
<parameter>$content</parameter>,
<parameter>&amp;$smarty</parameter> e
<parameter>&amp;$repeat</parameter> e eles tamb<6D>m comportam-se como
block-function-plugins.
</para>
<example>
<title>usando um objeto registrado ou atribu<62>do</title>
<programlisting>
&lt;?php
// O objeto
class My_Object {
function meth1($params, &amp;$smarty_obj) {
return "this is my meth1";
}
}
$myobj = new My_Object;
// registrando o objeto (ser<65> por refer<65>ncia)
$smarty->register_object("foobar",$myobj);
// Se voc<6F> quer restringie acesso a certos m<>todos ou propriedades, liste-os
$smarty->register_object("foobar",$myobj,array('meth1','meth2','prop1'));
// Se voc<6F> quer usar o formato de par<61>metro de objeto tradicional, passe um booleano de false
$smarty->register_object("foobar",$myobj,null,false);
// Voc<6F> pode tamb<6D>m atribuir objetos. Atribua por refer<65>ncia quando poss<73>vel.
$smarty->assign_by_ref("myobj", $myobj);
$smarty->display("index.tpl");
?&gt;
TEMPLATE:
{* accessa nosso objeto registrado *}
{foobar->meth1 p1="foo" p2=$bar}
{* voc<6F> pode tamb<6D>m atribuir a sa<73>da *}
{foobar->meth1 p1="foo" p2=$bar assign="output"}
the output was {$output}
{* acessa nosso objeto atribu<62>do *}
{$myobj->meth1("foo",$bar)}</programlisting>
</example>
</sect1>
<sect1 id="advanced.features.prefilters">
<title>Prefilters</title>
<para>
Os prefilters de Template s<>o fun<75><6E>es de PHP nas quais seus templates s<>o rodados
antes de serem compilados. Isto <20> bom para preprocessamento de seus templates para remover
coment<6E>rios indesejados, mantendo o olho no que as pessoas est<73>o colocando nos seus templates,
etc. Prefilters podem ser ou <link linkend="api.register.prefilter">registrado</link>
ou carregado do diret<65>rio de plugins usando a fun<75><6E>o
<link linkend="api.load.filter">load_filter()</link>
ou pela configura<72><61>o da vari<72>vel
<link linkend="variable.autoload.filters">$autoload_filters</link>.
O Smarty passar<61> o c<>digo fonte do template como o
primeiro argumeto, e espera a fun<75><6E>o retornar
o c<>digo fonte do template resultante.
</para>
<example>
<title>Usando um prefilter de template</title>
<programlisting>
&lt;?php
// Ponha isto em sua aplica<63><61>o
function remove_dw_comments($tpl_source, &amp;$smarty)
{
return preg_replace("/&lt;!--#.*--&gt;/U","",$tpl_source);
}
// registrar o prefilter
$smarty->register_prefilter("remove_dw_comments");
$smarty->display("index.tpl");
?&gt;
{* Smarty template index.tpl *}
&lt;!--# esta linha ser<65> removida pelo prefilter --&gt;</programlisting>
</example>
</sect1>
<sect1 id="advanced.features.postfilters">
<title>Postfilters</title>
<para>
Os postfilters de template s<>o fun<75><6E>es de PHP nas quais seus templates s<>o rodados
imediatamente depois de serem compilados. Os postfilters podem ser ou
<link linkend="api.register.postfilter">registrado</link>carrgados do diret<65>rio de
plugins usando a fun<75><6E>o
<link linkend="api.load.filter">load_filter()</link> ou pela
vari<72>vel de configura<72><61>o
<link linkend="variable.autoload.filters">$autoload_filters</link>.
O Smarty passar<61> o c<>digo fonte do template compilado
como o primeiro argumento, e espera
a fun<75><6E>o retornar o resultado do processamento.
</para>
<example>
<title>usando um postfilter de template</title>
<programlisting>
&lt;?php
// ponha isto em sua aplica<63><61>o
function add_header_comment($tpl_source, &amp;$smarty)
{
return "&lt;?php echo \"&lt;!-- Created by Smarty! --&gt;\n\" ?&gt;\n".$tpl_source;
}
// registra o postfilter
$smarty->register_postfilter("add_header_comment");
$smarty->display("index.tpl");
?&gt;
{* compiled Smarty template index.tpl *}
&lt;!-- Created by Smarty! --&gt;
{* rest of template content... *}</programlisting>
</example>
</sect1>
<sect1 id="advanced.features.outputfilters">
<title>Output Filters (Filtros de Sa<53>da)</title>
<para>
Quando o template <20> invocado via display() ou fetch(), sua sa<73>da pode ser enviada
atrav<61>s de um ou mais filtros de sa<73>da. Estes diferem dos postfilters porque postfilters
operam em templates compilados antes de serem salvos para o disco, e os filtros de sa<73>da
operam na sa<73>da do template quando
ele <20> executado.
</para>
<para>
Filtros de Sa<53>da podem ser ou
<link linkend="api.register.outputfilter">registrado</link> ou carregado
do diret<65>rio de plugins usando a fun<75><6E>o
<link linkend="api.load.filter">load_filter()</link> ou configurando a vari<72>vel
<link linkend="variable.autoload.filters">$autoload_filters</link>.
O Smarty passar<61> a sa<73>da como o primeiro argumento,
e espera a fun<75><6E>o retornar o resultado
do processamento.
</para>
<example>
<title>usando um filtro de sa<73>da de template</title>
<programlisting>
&lt;?php
// ponha isto em sua aplica<63><61>o
function protect_email($tpl_output, &amp;$smarty)
{
$tpl_output =
preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!',
'$1%40$2', $tpl_output);
return $tpl_output;
}
// registra o outputfilter
$smarty->register_outputfilter("protect_email");
$smarty->display("index.tpl");
// agora qualquer ocorr<72>ncia de um endere<72>o de email na sa<73>da do template ter<65> uma
// simples prote<74><65>o contra spambots
?&gt;</programlisting>
</example>
</sect1>
<sect1 id="section.template.cache.handler.func">
<title>Fun<EFBFBD><EFBFBD>o Manipuladora de Cache</title>
<para>
Como uma alternativa ao uso do mecanismo de caching padr<64>o baseado em arquivo, voc<6F> pode
especificar uma fun<75><6E>o de manipula<6C><61>o de cache customizada que ser<65> usada para ler, escrever
e limpar arquivos de cache.
</para>
<para>
Crie uma fun<75><6E>o em sua aplica<63><61>o que o Smarty usar<61> como um manipulador de cache. Defina o
nome dela na vari<72>vel de classe
<link linkend="variable.cache.handler.func">$cache_handler_func</link>.
O Smarty agora usar<61> esta para manipular dados no cache. O primeiro argumento <20> a a<><61>o,
que <20> um desses 'read', 'write' e 'clear'. O segundo par<61>metro <20> o objeto do Smarty. O
terceiro par<61>metro <20> o conte<74>do que est<73> no cache.
No write, o Smarty passa o conte<74>do em
cache nestes par<61>metros. No 'read', o Smarty espera sua fun<75><6E>o aceitar este par<61>metro por
refer<65>ncia e preenche ele com os dados em cache. No 'clear', passa uma vari<72>vel simulacra aqui
visto que ela n<>o <20> usada. O quarto par<61>metro
<20> o nome do arquivo de template (necess<73>rio para
ler/escrever), o quinto par<61>metro <20> a cache_id (opcional),
e o sexto <20> a compile_id (opcional).
</para>
<para>
Note que: O <20>ltimo par<61>metro ($exp_time)foi adicionado no Smarty-2.6.0.
</para>
<example>
<title>exemplo usando MySQL como uma fonte de cache</title>
<programlisting>
&lt;?php
/*
exemplo de uso:
include('Smarty.class.php');
include('mysql_cache_handler.php');
$smarty = new Smarty;
$smarty-&gt;cache_handler_func = 'mysql_cache_handler';
$smarty-&gt;display('index.tpl');
mysql database is expected in this format:
create database SMARTY_CACHE;
create table CACHE_PAGES(
CacheID char(32) PRIMARY KEY,
CacheContents MEDIUMTEXT NOT NULL
);
*/
function mysql_cache_handler($action, &amp;$smarty_obj, &amp;$cache_content, $tpl_file=null, $cache_id=null, $compile_id=null, $exp_time=null)
{
// set db host, user and pass here
$db_host = 'localhost';
$db_user = 'myuser';
$db_pass = 'mypass';
$db_name = 'SMARTY_CACHE';
$use_gzip = false;
// cria um cache id unico
$CacheID = md5($tpl_file.$cache_id.$compile_id);
if(! $link = mysql_pconnect($db_host, $db_user, $db_pass)) {
$smarty_obj-&gt;_trigger_error_msg("cache_handler: could not connect to database");
return false;
}
mysql_select_db($db_name);
switch ($action) {
case 'read':
// save cache to database
$results = mysql_query("select CacheContents from CACHE_PAGES where CacheID='$CacheID'");
if(!$results) {
$smarty_obj-&gt;_trigger_error_msg("cache_handler: query failed.");
}
$row = mysql_fetch_array($results,MYSQL_ASSOC);
if($use_gzip &amp;&amp; function_exists("gzuncompress")) {
$cache_contents = gzuncompress($row["CacheContents"]);
} else {
$cache_contents = $row["CacheContents"];
}
$return = $results;
break;
case 'write':
// save cache to database
if($use_gzip &amp;&amp; function_exists("gzcompress")) {
// compress the contents for storage efficiency
$contents = gzcompress($cache_content);
} else {
$contents = $cache_content;
}
$results = mysql_query("replace into CACHE_PAGES values(
'$CacheID',
'".addslashes($contents)."')
");
if(!$results) {
$smarty_obj-&gt;_trigger_error_msg("cache_handler: query failed.");
}
$return = $results;
break;
case 'clear':
// clear cache info
if(empty($cache_id) &amp;&amp; empty($compile_id) &amp;&amp; empty($tpl_file)) {
// clear them all
$results = mysql_query("delete from CACHE_PAGES");
} else {
$results = mysql_query("delete from CACHE_PAGES where CacheID='$CacheID'");
}
if(!$results) {
$smarty_obj-&gt;_trigger_error_msg("cache_handler: query failed.");
}
$return = $results;
break;
default:
// error, unknown action
$smarty_obj-&gt;_trigger_error_msg("cache_handler: unknown action \"$action\"");
$return = false;
break;
}
mysql_close($link);
return $return;
}
?&gt;</programlisting>
</example>
</sect1>
<sect1 id="template.resources">
<title>Recursos (Resources)</title>
<para>
Os templates podem vir de uma variedade de fontes. Quando voc<6F> exibe (display) ou
busca (fetch) um template, ou inclui um template de dentro de outro template, voc<6F>
fornece um tipo de recurso, seguido pelo
caminho e nome do template apropriado. Se um
recurso n<>o <20> dado explicitamente o valor de
<link linkend="variable.default.resource.type">$default_resource_type</link> <20> assumido.
</para>
<sect2 id="templates.from.template.dir">
<title>Templates partindo do $template_dir</title>
<para>
Templates a partir do $template_dir n<>o exigem um recurso de template,
apesar de voc<6F> usar o arquivo: resource for consistancy.
Apenas forne<6E>a o caminho para o template que voc<6F> quer usar em rela<6C><61>o ao diret<65>rio
root $template_dir.
</para>
<example>
<title>Usando templates partindo do $template_dir</title>
<programlisting>
// from PHP script
$smarty->display("index.tpl");
$smarty->display("admin/menu.tpl");
$smarty->display("file:admin/menu.tpl"); // Igual ao de cima
{* de dentro do template do Smarty *}
{include file="index.tpl"}
{include file="file:index.tpl"} {* igual ao de cima *}</programlisting>
</example>
</sect2>
<sect2 id="templates.from.any.dir">
<title>Templates partindo de qualquer diret<65>rio</title>
<para>
Os Templates de fora do $template_dir exigem o arquivo:
tipo de recurso do template,
seguido pelo caminho absoluto e nome do template.
</para>
<example>
<title>usando templates partindo de qualquer diret<65>rio</title>
<programlisting>
// de dentro do script PHP
$smarty->display("file:/export/templates/index.tpl");
$smarty->display("file:/path/to/my/templates/menu.tpl");
{* de dentro do template do Smarty *}
{include file="file:/usr/local/share/templates/navigation.tpl"}</programlisting>
</example>
<sect3>
<title>Caminhos de arquivos do Windows</title>
<para>
Se voc<6F> est<73> usando uma m<>quina windows, caminhos de arquivos normalmente incluem uma letra
do drive (C:) no come<6D>o do nome do caminho.
Esteja certo de usar "file:" no caminho para
evitar conflitos de nome e obter os resultados desejados.
</para>
<example>
<title>usando templates com caminhos de arquivo do windows</title>
<programlisting>
// de dentro do script PHP
$smarty->display("file:C:/export/templates/index.tpl");
$smarty->display("file:F:/path/to/my/templates/menu.tpl");
{* de dentro do template do Smarty *}
{include file="file:D:/usr/local/share/templates/navigation.tpl"}</programlisting>
</example>
</sect3>
</sect2>
<sect2 id="templates.from.elsewhere">
<title>Templates partindo de outras fontes</title>
<para>
Voc<6F> pode resgatar templates usando qualquer fonte poss<73>vel de voc<6F> acessar com PHP: banco
de dados, sockets, LDAP, e assim por diante.
Voc<6F> faz isto escrevendo as fun<75><6E>es de plugin
de recurso e registrando elas com o Smarty.
</para>
<para>
Veja a se<73><65>o <link linkend="plugins.resources">plugins de recurso</link>
para mais informa<6D><61>o sobre as fun<75><6E>es
que voc<6F> deve fornecer.
</para>
<note>
<para>
Note que voc<6F> pode ativar manualmente o recurso de <literal>arquivo</literal> embutido, mas n<>o pode fornecer um recurso que busca templates a partir do sistema de arquivos de alguma outra forma registrando sob um outro nome de recurso.
<literal>file</literal> resource, but you can provide a resource
that fetches templates from the file system in some other way by
registering under another resource name.
</para>
</note>
<example>
<title>usando recursos customiz<69>veis</title>
<programlisting>
// no script PHP
// ponha estas fun<75><6E>es em algum lugar de sua aplica<63><61>o
function db_get_template ($tpl_name, &amp;$tpl_source, &amp;$smarty_obj)
{
// fa<66>a o banco de dados chamar aqui para buscar o seu template,
// preenchendo o $tpl_source
$sql = new SQL;
$sql->query("select tpl_source
from my_table
where tpl_name='$tpl_name'");
if ($sql->num_rows) {
$tpl_source = $sql->record['tpl_source'];
return true;
} else {
return false;
}
}
function db_get_timestamp($tpl_name, &amp;$tpl_timestamp, &amp;$smarty_obj)
{
// fa<66>a o banco de dados chamar daqui para preencher a $tpl_timestamp.
$sql = new SQL;
$sql->query("select tpl_timestamp
from my_table
where tpl_name='$tpl_name'");
if ($sql->num_rows) {
$tpl_timestamp = $sql->record['tpl_timestamp'];
return true;
} else {
return false;
}
}
function db_get_secure($tpl_name, &amp;$smarty_obj)
{
// assume-se que todos os templates s<>o seguros
return true;
}
function db_get_trusted($tpl_name, &amp;$smarty_obj)
{
// n<>o usado para templates
}
// registrar o nome de recurso "db"
$smarty->register_resource("db", array("db_get_template",
"db_get_timestamp",
"db_get_secure",
"db_get_trusted"));
// usando o recurso a partir do script PHP
$smarty->display("db:index.tpl");
{* usando o recurso de dentro do template do Smarty *}
{include file="db:/extras/navigation.tpl"}</programlisting>
</example>
</sect2>
<sect2 id="default.template.handler.function">
<title>Fun<EFBFBD><EFBFBD>o Manipuladora de Template Padr<64>o</title>
<para>
Voc<6F> pode especificar a fun<75><6E>o que <20> usada para devolver o conte<74>do do template no evento
em que o template n<>o pode ser devolvido de seu recurso. Um uso disto <20> para criar templates
que n<>o existem "on-the-fly"
(templates cujo conte<74>do flutua muito, bastante vari<72>vel).
</para>
<example>
<title>usando a fun<75><6E>o manipuladora de template padr<64>o</title>
<programlisting>
&lt;?php
// ponha esta fun<75><6E>o em algum lugar de sua aplica<63><61>o
function make_template ($resource_type, $resource_name, &amp;$template_source, &amp;$template_timestamp, &amp;$smarty_obj)
{
if( $resource_type == 'file' ) {
if ( ! is_readable ( $resource_name )) {
// cria um arquivo de template, retorna o conte<74>do.
$template_source = "This is a new template.";
$template_timestamp = time();
$smarty_obj->_write_file($resource_name,$template_source);
return true;
}
} else {
// n<>o <20> arquivo
return false;
}
}
// defina a manipuladora padr<64>o
$smarty->default_template_handler_func = 'make_template';
?&gt;</programlisting>
</example>
</sect2>
</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
-->

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,503 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="api.variables">
<title>Vari<EFBFBD>veis</title>
<sect1 id="variable.template.dir">
<title>$template_dir</title>
<para>
Este <20> o nome padr<64>o do diret<65>rio de template. Se voc<6F> n<>o fornecer
um tipo de recurso quando incluir arquivos, ent<6E>o ele ir<69> ser encontrado aqui.
Por padr<64>o isso <20> "./templates", significando que isso ir<69>
olhar para o diret<65>rio de templates no mesmo diret<65>rio que est<73> executando
o script PHP.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
N<>o <20> recomendado colocar este diret<65>rio sob um diret<65>rio
document root do seu webserver.
</para>
</note>
</sect1>
<sect1 id="variable.compile.dir">
<title>$compile_dir</title>
<para>
Esse <20> o nome do diret<65>rio onde os template compilados est<73>o localizados
Por padr<64>o isso <20> "./templates_c", significando que isso ir<69>
olhar para o diret<65>rio de templates no mesmo diret<65>rio que est<73> executando
o script PHP.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
Essa configura<72><61>o deve ser um path relativo ou um path absoluto.
include_path n<>o <20> usado para escrever em arquivos.
</para>
</note>
<note>
<title>Notas T<>cnicas</title>
<para>
N<>o <20> recomendado colocar este diret<65>rio sob um diret<65>rio
document root do seu webserver.
</para>
</note>
</sect1>
<sect1 id="variable.config.dir">
<title>$config_dir</title>
<para>
Este <20> o diret<65>rio usado para armazenar arquivos de configura<72><61>o usados nos
templates. O padr<64>o <20> "./configs", significando que isso ir<69>
olhar para o diret<65>rio de templates no mesmo diret<65>rio que est<73> executando
o script PHP.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
N<>o <20> recomendado colocar este diret<65>rio sob um diret<65>rio
document root do seu webserver.
</para>
</note>
</sect1>
<sect1 id="variable.plugins.dir">
<title>$plugins_dir</title>
<para>
Esse <20> o diret<65>rio onde Smarty ir<69> procurar por plugins que s<>o necess<73>rios.
O Padr<64>o <20> "plugins" sob o SMARTY_DIR. Se voc<6F>es especificar um
path relativo, Smarty ir<69> primeiro procurar sob o SMARTY_DIR, ent<6E>o
relativo para o cwd (current working directory), ent<6E>o relativo para cada
entrada no seu PHP include path.
</para>
<note>
<title>Notas t<>cnicas</title>
<para>
Para uma melhor performance, n<>o configure seu plugins_dir para ter que usar o
PHP include path. Use um path absoluto, ou um path relativo para
SMARTY_DIR ou o cwd.
</para>
</note>
</sect1>
<sect1 id="variable.debugging">
<title>$debugging</title>
<para>
Isso habilita o <link
linkend="chapter.debugging.console">debugging console</link>.
O console <20> uma janela de javascript que informa <20> voc<6F>
sobre os arquivos de template inclu<6C>dos e vari<72>veis
destinadas para a p<>gina de template atual.
</para>
</sect1>
<sect1 id="variable.debug.tpl">
<title>$debug_tpl</title>
<para>
Este <20> o nome do arquivo de template usado para o console de debug.
Por padr<64>o, <20> nomeado como debug.tpl e est<73> localizado no <link
linkend="constant.smarty.dir">SMARTY_DIR</link>.
</para>
</sect1>
<sect1 id="variable.debugging.ctrl">
<title>$debugging_ctrl</title>
<para>
Isso permite caminhos alternativos de habilitar o debug. NONE n<>o significa
que m<>todos alternativos s<>o permitidos. URL significa quando a palavra
SMARTY_DEBUG foi encontrado na QUERY_STRING, que o debug est<73> habilitado
para a chamada do script.
Se $debugging <20> true, esse valor <20> ignorado.
</para>
</sect1>
<sect1 id="variable.global.assign">
<title>$global_assign</title>
<para>
Essa <20> a lista de vari<72>veis que est<73>o sempre implicitamente fixadas
para o template engine. Isso est<73> acess<73>vel para fazer vari<72>veis
globais ou vari<72>veis do servidor dispon<6F>veis para todo o template
sem ter que fix<69>-las manualmente. Cada elemento em
$global_assign deve ser um nome de uma vari<72>vel global,
ou um par de chave/valor, onde a chave <20> o nome do array global
array e o valor <20> o array de vari<72>veis fixadas deste array global. $SCRIPT_NAME <20>
globalmente fixado por padr<64>o
para $HTTP_SERVER_VARS.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
Vari<72>veis de servidor podem ser acessadas atrav<61>s da vari<72>vel
$smarty, como {$smarty.server.SCRIPT_NAME}. Veja a se<73><65>o
da vari<72>vel
<link linkend="language.variables.smarty">$smarty</link>.
</para>
</note>
</sect1>
<sect1 id="variable.undefined">
<title>$undefined</title>
<para>
Isso seta o valor de $undefined para Smarty, o padr<64>o <20> null.
Atualmente isso <20> somente usado para setar vari<72>veis indefinidas em
$global_assign para o valor padr<64>o.
</para>
</sect1>
<sect1 id="variable.autoload.filters">
<title>$autoload_filters</title>
<para>
Se h<> algum filtro que voc<6F> deseja carregar em cada chamada de template,
voc<6F> pode especificar-lhes usando essa vari<72>vel e a Smarty ir<69>
automaticamente carreg<65>-los para voc<6F>. A vari<72>vel <20> um array associativo
onde as chaves s<>o tipos de filtro e os valores s<>o arrays de nomes de filtros.
Por exemplo:
<informalexample>
<programlisting>
$smarty-&gt;autoload_filters = array('pre' =&gt; array('trim', 'stamp'),
'output' => array('convert'));
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="variable.compile.check">
<title>$compile_check</title>
<para>
Em cima de cada requisi<73><69>o da aplica<63><61>o PHP , Smarty testa para ver se o
template atual foi alterado (diferentes time stamp) desde a <20>ltima
compila<6C><61>o. Se isso foi alterado, ele ir<69> recompilar o template. Se o template
n<>o foi compilado, ele ir<69> compilar de qualquer maneira dessa configura<72><61>o.
Por padr<64>o esta vari<72>vel <20> setada como true. Uma vez que a aplica<63><61>o est<73>
em produ<64><75>o (templates n<>o ser<65>o alterados), o passo compile_check
n<>o <20> necess<73>rio. Tenha certeza de setar $compile_check para "false" para
maior performance. Note que se voc<6F> alterar isso para "false" e o
arquivo de template est<73> alterado, voc<6F> *n<>o* ir<69> ver a altera<72><61>o desde que
o template seja recompilado. Se caching est<73> habilitado e
compile_check est<73> habilitado, ent<6E>o os arquivos de cache n<>o ser<65>o regerados se
um complexo arquivo de ou um arquivo de configura<72><61>o foi atualizado. Veja <link
linkend="variable.force.compile">$force_compile</link> ou <link
linkend="api.clear.compiled.tpl">clear_compiled_tpl</link>.
</para>
</sect1>
<sect1 id="variable.force.compile">
<title>$force_compile</title>
<para>
Isso for<6F>a Smarty para (re)compilar templates a cada requisi<73><69>o.
Essa configura<72><61>o sobreescreve $compile_check. Por padr<64>o
isso est<73> desabilitado. Isso <20> <20>til para desenvolvimento e debug.
Isso nunca deve ser usado em ambiente de produ<64><75>o. Se caching
est<73> habilitado, os arquivo(s) de cache ser<65>o regerados <20> todo momento.
</para>
</sect1>
<sect1 id="variable.caching">
<title>$caching</title>
<para>
Isto diz <20> Smarty se h<> ou n<>o sa<73>da de cache para o template.
Por padr<64>o isso est<73> setado para 0, ou desabilitado. Se seu template gerar
conte<74>do redundante, <20> necess<73>rio ligar o caching. Isso
ir<69> resultar num ganho significativo de performance. Voc<6F> pode tamb<6D>m ter m<>ltiplos
caches para o mesmo template. Um valor de 1 ou 2 caching habilitados. 1 diz
<20> Smarty para usar a vari<72>vel atual $cache_lifetime para determinar se o
cache expirou. Um valor 2 diz <20> Smarty para usar o valor cache_lifetime
ent<6E>o para quando o cache foi gerado. Desta maneira voc<6F> pode setar o
cache_lifetime imediatamente antes de buscar o template para ter controle
sobre quando este cache em particular expira. Veja tamb<6D>m <link
linkend="api.is.cached">is_cached</link>.
</para>
<para>
Se $compile_check est<73> habilitado, o conte<74>do do cache ir<69> ser regerado se
algum dos templates ou arquivos de configura<72><61>o que s<>o parte deste cache estiverem
alterados. Se $force_compile est<73> habilitado, o conte<74>do do cache ir<69> sempre ser
regerado.
</para>
</sect1>
<sect1 id="variable.cache.dir">
<title>$cache_dir</title>
<para>
Isso <20> o nome do diret<65>rio onde os caches do template s<>o
armazenados. Por padr<64>o isso <20> "./cache", significando que isso ir<69> olhar
para o diret<65>rio de cache no mesmo diret<65>rio que executar scripts PHP.
Voc<6F> pode tambe usar sua pr<70>pria fun<75><6E>o customizada de manuseamento de cache
para manipular arquivos de cache,
que ir<69>o ignorar esta configura<72><61>o.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
Essa configura<72><61>o deve ser ou um relativo
ou absoluto path. include_path n<>o <20> usado para escrever em arquivos.
</para>
</note>
<note>
<title>Notas T<>cnicas</title>
<para>
N<>o <20> recomendado colocar este diret<65>rio sob um diret<65>rio
document root do seu webserver.
</para>
</note>
</sect1>
<sect1 id="variable.cache.lifetime">
<title>$cache_lifetime</title>
<para>
Isso <20> o comprimento de tempo em segundos que um cache de template <20> v<>lido.
Uma vez que este tempo est<73> expirado, o cache ir<69> ser regerado. $caching deve
ser configurado para "true" para $cache_lifetime para ter algum prop<6F>sito. Um valor de -1
ir<69> for<6F>ar o cache a nunca expirar. Um valor de 0 ir<69> fazer com que o cache seja sempre regerado
(bom somente para testes, o m<>todo mais eficiente de desabilitar caching <20> set<65>-lo para
<link
linkend="variable.caching">$caching</link> = false.)
</para>
<para>
Se <link linkend="variable.force.compile">$force_compile</link> est<73>
habilitado, os arquivos de cache ser<65>o regerados todo o tempo, eficazmente
desativando caching. Voc<6F> pode limpar todos os arquivos de cache com a fun<75><6E>o <link
linkend="api.clear.all.cache">clear_all_cache()</link>, ou
arquivos individuais de cache (ou grupos) com a fun<75><6E>o <link
linkend="api.clear.cache">clear_cache()</link>.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
Se voc<6F> quiser dar para certos templates seu pr<70>prio tempo de vida de um cache,
voc<6F> poderia fazer isso configurando <link linkend="variable.caching">$caching</link> = 2,
ent<6E>o configure $cache_lifetime para um <20>nico valor somente antes de chamar display()
ou fetch().
</para>
</note>
</sect1>
<sect1 id="variable.cache.handler.func">
<title>$cache_handler_func</title>
<para>
Voc<6F> pode fornecer uma fun<75><6E>o padr<64>o para manipular arquivos de cache ao inv<6E>s de
usar o m<>todo built-in usando o $cache_dir. Veja a
se<73><65>o <link linkend="section.template.cache.handler.func">cache
handler function section</link> para obter detalhes.
</para>
</sect1>
<sect1 id="variable.cache.modified.check">
<title>$cache_modified_check</title>
<para>
Se configurado para true, Smarty ir<69> respeitar o If-Modified-Since
header enviado para o cliente. Se o timestamp do arquivo de cache
n<>o foi alterado desde a <20>ltima visita, ent<6E>o um header "304 Not Modified"
ir<69> ser enviado ao inv<6E>s do conte<74>do. Isso funciona somente em arquivos
de cache sem tags <command>insert</command>.
</para>
</sect1>
<sect1 id="variable.config.overwrite">
<title>$config_overwrite</title>
<para>
Se configurado para true, vari<72>veis lidas no arquivo de configura<72><61>es ir<69>o sobrescrever
uma a outra. Do contr<74>rio, as vari<72>veis ser<65>o guardadas em um array. Isso <20>
<20>til se voc<6F> quer armazenar arrays de dados em arquivos de configura<72><61>o, somente lista
tempos de cada elemento m<>ltiplo. true por padr<64>o.
</para>
</sect1>
<sect1 id="variable.config.booleanize">
<title>$config_booleanize</title>
<para>
Se setado para true, os valores do arquivo de configura<72><61>o de on/true/yes e off/false/no
ficar<61> convertido para valores booleanos automaticamente. Desta forma voc<6F> pode usar os
valores em um template como: {if #foobar#} ... {/if}. Se foobar estiver
on, true ou yes, a condi<64><69>o {if} ir<69> executar. true por padr<64>o.
</para>
</sect1>
<sect1 id="variable.config.read.hidden">
<title>$config_read_hidden</title>
<para>
Se configurado para true, esconde se<73><65>es (nomes de se<73><65>es come<6D>ados com um per<65>odo)
no arquivo de configura<72><61>o podem ser lidos do template. Tipicamente voc<6F> deixaria
isto como false, desta forma voc<6F> pode armazenar dados sensitivos no arquivo de configura<72><61>o
como um par<61>metro de banco de
dados e sem preocupar-se sobre o template carreg<65>-los. false <20> o padr<64>o.
</para>
</sect1>
<sect1 id="variable.config.fix.newlines">
<title>$config_fix_newlines</title>
<para>
Se setado para true, mac e dos newlines (\r e \r\n) no arquivo de configura<72><61>o ser<65>o
convertidos para \n quando eles forem interpretados. true <20> o padr<64>o.
</para>
</sect1>
<sect1 id="variable.default.template.handler.func">
<title>$default_template_handler_func</title>
<para>
Essa fun<75><6E>o <20> chamada quando um template n<>o pode ser obtido
de seu recurso.
</para>
</sect1>
<sect1 id="variable.php.handling">
<title>$php_handling</title>
<para>
Isso diz <20> Smarty como manipular c<>digos PHP contido nos
templates. H<> quatro poss<73>veis configura<72><61>es, padr<64>o sendo
SMARTY_PHP_PASSTHRU. Note que isso N<>O far<61> efeito com c<>digos php
dentro de tags <link linkend="language.function.php">{php}{/php}</link>
no template.
</para>
<itemizedlist>
<listitem><para>SMARTY_PHP_PASSTHRU - Smarty echos tags as-is.</para></listitem>
<listitem><para>SMARTY_PHP_QUOTE - Smarty quotes the
tags as html entities.</para></listitem>
<listitem><para>SMARTY_PHP_REMOVE - Smarty
ir<69> remover as tags do template.</para></listitem>
<listitem><para>SMARTY_PHP_ALLOW - Smarty ir<69> executar as
tags como c<>digos PHP.</para></listitem>
</itemizedlist>
<para>
NOTE: Usando c<>digos PHP code dentro de templates <20> altamente desencorajado.
Use <link linkend="language.custom.functions">custom functions</link> ou
<link linkend="language.modifiers">modifiers</link> ao inv<6E>s disso.
</para>
</sect1>
<sect1 id="variable.security">
<title>$security</title>
<para>
$security true/false, o padr<64>o <20> false. Security <20> bom para situa<75><61>es
quando voc<6F> tem partes inconfi<66>veis editando o template
(via ftp por exemplo) e voc<6F> quer reduzir os riscos de comprometimento
da seguran<61>a do sistema atrav<61>s da linguagem de template.
Habilitando-o faz-se cumprir as regras da linguagem de template,
a menos que especificamente cancelada com $security_settings:
</para>
<itemizedlist>
<listitem><para>Se $php_handling est<73> setado para SMARTY_PHP_ALLOW, isso <20> implicitamente
alterado para SMARTY_PHP_PASSTHRU</para></listitem>
<listitem><para>Fun<EFBFBD><EFBFBD>s PHP n<>o s<>o permitidas em blocos IF,
exceto estes especificados no $security_settings</para></listitem>
<listitem><para>templates podem ser somente incluidos no diret<65>rio
listado em $secure_dir array</para></listitem>
<listitem><para>Arquivos locais podem ser somente trazidos do diret<65>rio
listado em $secure_dir usando no array {fetch}</para></listitem>
<listitem><para>Estas tags {php}{/php} n<>o s<>o permitidas</para></listitem>
<listitem><para>Fun<EFBFBD><EFBFBD>es PHP n<>o s<>o permitidas como modificadores, exceto
estes especificados no $security_settings</para></listitem>
</itemizedlist>
</sect1>
<sect1 id="variable.secure.dir">
<title>$secure_dir</title>
<para>
Isso <20> um array de todos os diret<65>rios locais que s<>o considerados
seguros. {include} e {fetch} usam estes (diret<65>rios) quando security est<73> habilitado.
</para>
</sect1>
<sect1 id="variable.security.settings">
<title>$security_settings</title>
<para>
Essas configura<72><61>es s<>o usadas para cancelar ou especificar configura<72><61>es
de seguran<61>a quando security est<73> habilitado. Estas possuem as seguintes configura<72><61>es poss<73>veis:
</para>
<itemizedlist>
<listitem><para>PHP_HANDLING - true/false. Se setado para true,
a configura<72><61>o de $php_handling n<>o <20> checada para security.</para></listitem>
<listitem><para>IF_FUNCS - Isso <20> um array de nomes de fun<75><6E>es PHP permitidas
nos blocos IF.</para></listitem>
<listitem><para>INCLUDE_ANY - true/false. Se setado para true, algum
template pode ser inclu<6C>do para um arquivo do sistema, apesar de toda a lista de
$secure_dir.</para></listitem>
<listitem><para>PHP_TAGS - true/false. Se setado para true, as tags {php}{/php}
s<>o permitidas nos templates.</para></listitem>
<listitem><para>MODIFIER_FUNCS - Isso <20> um array de nomes de fun<75><6E>es PHP permitidas
usadas como modificadores de vari<72>vel.</para></listitem>
</itemizedlist>
</sect1>
<sect1 id="variable.trusted.dir">
<title>$trusted_dir</title>
<para>
$trusted_dir somente usado quando $security est<73> habilitado. Isso <20> um array
de todos os diret<65>rios que s<>o considerados confi<66>veis. Diret<65>rios confi<66>veis
s<>o onde voc<6F> ir<69> deixar seus scripts php que s<>o executados diretamente para o
template com <link linkend="language.function.include.php">{include_php}</link>.
</para>
</sect1>
<sect1 id="variable.left.delimiter">
<title>$left_delimiter</title>
<para>
Este <20> o delimitador esquerdo usado para a linguagem de template.
O padr<64>o <20> "{".
</para>
</sect1>
<sect1 id="variable.right.delimiter">
<title>$right_delimiter</title>
<para>
Este <20> o delimitador direito usado para a linguagem de template.
O padr<64>o <20> "}".
</para>
</sect1>
<sect1 id="variable.compiler.class">
<title>$compiler_class</title>
<para>
Especifica o nome do compilador de classes que
Smarty ir<69> usar para compilar templates. O padr<64>o <20> 'Smarty_Compiler'.
Para usu<73>rios avan<61>ados somente.
</para>
</sect1>
<sect1 id="variable.request.vars.order">
<title>$request_vars_order</title>
<para>
A ordem na qual as vari<72>veis requeridas ser<65>o registradas, similar ao
variables_order no php.ini
</para>
</sect1>
<sect1 id="variable.request.use.auto.globals">
<title>$request_use_auto_globals</title>
<para>
Especifica se a Smarty deve usar vari<72>veis globais do php $HTTP_*_VARS[]
($request_use_auto_globals=false que <20> o valor padr<64>o) ou
$_*[] ($request_use_auto_globals=true). Isso afeta templates
que fazem uso do {$smarty.request.*}, {$smarty.get.*} etc. .
Aten<65><6E>o: Se voc<6F> setar $request_use_auto_globals para true, <link
linkend="variable.request.vars.order">variable.request.vars.order
</link> n<>o ter<65>o efeito mas valores de configura<72><61>es do php
<literal>gpc_order</literal> s<>o usados.
</para>
</sect1>
<sect1 id="variable.compile.id">
<title>$compile_id</title>
<para>
Identificador de compila<6C><61>o persistente. Como uma alternativa
para passar o mesmo compile_id para cada chamada de fun<75><6E>o, voc<6F>
pode setar este compile_id e isso ir<69> ser usado implicitamente ap<61>s isso.
</para>
</sect1>
<sect1 id="variable.use.sub.dirs">
<title>$use_sub_dirs</title>
<para>
Configure isso para false se seu ambiente de PHP n<>o permite a cria<69><61>o de
subdiret<65>rios pela Smarty. Subdiret<65>rios s<>o muito eficientes, ent<6E>o use-os se voc<6F>
conseguir.
</para>
</sect1>
<sect1 id="variable.default.modifiers">
<title>$default_modifiers</title>
<para>
Isso <20> um array de modificadores implicitamente aplicados par cada
vari<72>vel no template. Por Exemplo, para cada vari<72>vel HTML-escape por padr<64>o,
use o array('escape:"htmlall"'); Para fazer a vari<72>vel isenta para modificadores
padr<64>o, passe o modificador especial "smarty" com um valor de par<61>metro "nodefaults"
modificando isso, como
{$var|smarty:nodefaults}.
</para>
</sect1>
<sect1 id="variable.default.resource.type">
<title>$default_resource_type</title>
<para>
Isso diz <20> Smarty qual tipo de recurso usar implicitamente.
O valor padr<64>o <20> 'file', significando que $smarty->display('index.tpl'); e
$smarty->display('file:index.tpl'); s<>o id<69>nticos no significado.
Veja o cap<61>tulo <link linkend="template.resources">resource</link> para detalhes.
</para>
</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
-->

View File

@@ -0,0 +1,396 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="caching">
<title>Caching</title>
<para>
Caching <20> usado para aumentar a velocidade de chamada para <link
linkend="api.display">display()</link> ou <link
linkend="api.fetch">fetch()</link> salvando isso num arquivo de sa<73>da. Se h<> uma vers<72>o
de cache dispon<6F>vel para a chamada, isso <20> mostrado ao inv<6E>s de regerar a sa<73>da de dados.
Caching pode fazer coisas tremendamente r<>pidas,
especialmente templates com longo tempo computacional. Desde a sa<73>da de dados do
display() ou fetch() est<73> em cache, um arquivo de cache poderia ser composto por
diversos arquivos de templates, arquivos de configura<72><61>o, etc.
</para>
<para>
Desde que templates sejam din<69>micos, <20> importante isso ter cuidado com
o que voc<6F> est<73> fazendo cache e por quanto tempo. Por exemplo, se voc<6F> est<73> mostrando
a p<>gina principal do seu website na qual as altera<72><61>es de conte<74>do s<>o muito frequentes,
isso funciona bem para cache dessa por uma hora ou mais. Um outro modo, se voc<6F> est<73>
mostrando uma p<>gina com um mapa do tempo contendo novas informa<6D><61>es por minuto, n<>o
faz sentido fazer cache nesta p<>gina.
</para>
<sect1 id="caching.setting.up">
<title>Configurando Caching</title>
<para>
A primeira coisa a fazer <20> habilitar o caching. Isso <20> feito pela configura<72><61>o <link
linkend="variable.caching">$caching</link> = true (or 1.)
</para>
<example>
<title>Habilitando Caching</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$smarty->display('index.tpl');</programlisting>
</example>
<para>
Com caching habilitado, a chamada para a fun<75><6E>o display('index.tpl') ir<69> trazer
o template como usual, mas tamb<6D>m
salva uma c<>pia disso para o arquivo de sa<73>da (uma c<>pia de cache) in the <link linkend="variable.cache.dir">$cache_dir</link>.
Na pr<70>xima chamada de display('index.tpl'), a c<>pia em cache ser<65> usada
ao inv<6E>s de trazer novamente o template.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
Os arquivos no $cache_dir s<>o nomeados com similaridade ao nome do arquivo de template.
Embora eles terminem com a extens<6E>o ".php", eles n<>o s<>o realmente scripts execut<75>veis de php.
N<>o edite estes arquivos!
</para>
</note>
<para>
Cada p<>gina em cache tem um per<65>odo de tempo limitado determinado por <link
linkend="variable.cache.lifetime">$cache_lifetime</link>. O padr<64>o do valor <20>
3600 segundos, ou 1 hora. Ap<41>s o tempo expirar, o cache <20> regerado.
<09> poss<73>vel dar tempos individuais para caches com seu pr<70>prio tempo
de expira<72><61>o pela configura<72><61>o $caching = 2. Veja a documenta<74><61>o em <link
linkend="variable.cache.lifetime">$cache_lifetime</link> para detalhes.
</para>
<example>
<title>Configurando cache_lifetime por cache</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = 2; // lifetime is per cache
// set the cache_lifetime for index.tpl to 5 minutes
$smarty->cache_lifetime = 300;
$smarty->display('index.tpl');
// set the cache_lifetime for home.tpl to 1 hour
$smarty->cache_lifetime = 3600;
$smarty->display('home.tpl');
// NOTE: the following $cache_lifetime setting will not work when $caching = 2.
// The cache lifetime for home.tpl has already been set
// to 1 hour, and will no longer respect the value of $cache_lifetime.
// The home.tpl cache will still expire after 1 hour.
$smarty->cache_lifetime = 30; // 30 seconds
$smarty->display('home.tpl');</programlisting>
</example>
<para>
Se <link linkend="variable.compile.check">$compile_check</link> est<73> habilitado,
cada arquivo de template e arquivo de configura<72><61>o que est<73> envolvido com o arquivo em cache
<09> checado por modifica<63><61>es. Se algum destes arquivos foi modificado desde que o <20>ltimo cache
foi gerado, o cache <20> imediatamente regerado.
Isso <20> ligeiramente uma forma de optimiza<7A><61>o de performance de overhead, deixe $compile_check setado para false.
</para>
<example>
<title>Habilitando $compile_check</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$smarty->compile_check = true;
$smarty->display('index.tpl');</programlisting>
</example>
<para>
Se <link linkend="variable.force.compile">$force_compile</link> est<73> habilitado,
os arquivos de cache ir<69>o sempre ser regerados. Isso <20> efetivamente desativar caching.
$force_compile <20> usualmente para prop<6F>sitos de debug somente, um caminho mais
eficiente de desativar caching <20> setar o <link
linkend="variable.caching">$caching</link> = false (ou 0.)
</para>
<para>
A fun<75><6E>o <link linkend="api.is.cached">is_cached()</link>
pode ser usada para testar se um template tem um cache v<>lido ou n<>o.
Se voc<6F> tem um template com cache que requer alguma coisa como um retorno do banco de dados,
voc<6F> pode usar isso para pular este processo.
</para>
<example>
<title>Usando is_cached()</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
if(!$smarty->is_cached('index.tpl')) {
// No cache available, do variable assignments here.
$contents = get_database_contents();
$smarty->assign($contents);
}
$smarty->display('index.tpl');</programlisting>
</example>
<para>
Voc<6F> pode deixar partes da sua p<>gina din<69>mica com a fun<75><6E>o de template <link
linkend="language.function.insert">insert</link>.
Vamos dizer que sua p<>gina inteira pode ter cache exceto para um banner que <20>
mostrado abaixo do lado direito da sua p<>gina. Usando uma fun<75><6E>o insert para o banner,
voc<6F> pode deixar esse elemento din<69>mico dentro do conte<74>do de cache. Veja a documenta<74><61>o
em <link linkend="language.function.insert">insert</link> para
detalhes e exemplos.
</para>
<para>
Voc<6F> pode limpar todos os arquivos de cache com a fun<75><6E>o <link
linkend="api.clear.all.cache">clear_all_cache()</link>, ou
arquivos de cache individuais (ou grupos) com a fun<75><6E>o <link
linkend="api.clear.cache">clear_cache()</link>.
</para>
<example>
<title>Limpando o cache</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
// clear out all cache files
$smarty->clear_all_cache();
// clear only cache for index.tpl
$smarty->clear_cache('index.tpl');
$smarty->display('index.tpl');</programlisting>
</example>
</sect1>
<sect1 id="caching.multiple.caches">
<title>Multiple Caches Per Page</title>
<para>
Voc<6F> pode ter m<>ltiplos arquivos de cache para uma simples chamada de display()
ou fetch(). Vamos dizer que uma chamada para display('index.tpl') deve ter v<>rios
conte<74>do de sa<73>da diferentes dependendo de alguma condi<64><69>o, e voc<6F> quer separar
os caches para cada um. Voc<6F> pode fazer isso passando um cache_id como um
segundo par<61>metro para a chamada da fun<75><6E>o.
</para>
<example>
<title>Passando um cache_id para display()</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$my_cache_id = $_GET['article_id'];
$smarty->display('index.tpl',$my_cache_id);</programlisting>
</example>
<para>
Acima, n<>s estamos passando a vari<72>vel $my_cache_id para display() com o
cache_id. Para cada valor <20>nico de $my_cache_id, um cache em separado ir<69> ser
gerado para index.tpl. Nesse exemplo, "article_id" foi passado em URL e <20> usado
como o cache_id.
</para>
<note>
<title>Notas T<>cnicas</title>
<para>
Tenha muito cuidado quando passar valores do cliente (web brownser) dentro
da Smarty (ou alguma aplica<63><61>o PHP.) Embora o exemplo acima usando o article_id
vindo de uma URL pare<72>a f<>cil, isso poderia ter consequ<71>ncias ruins. O
cache_id <20> usado para criar um diret<65>rio no sistema de arquivos, ent<6E>o se o usu<73>rio
decidir passar um valor extremamente largo para article_id, ou escrever um script
que envia article_ids rand<6E>micos em um ritmo r<>pido, isso poderia possivelmente causar
problemas em n<>vel de servidor. Tenha certeza de limpar algum dado passado antes de usar isso. Nessa inst<73>ncia, talvez voc<6F>
saiba que o article_id tem um comprimento de 10 caracteres e isso <20> constitu<74>do somente
de alfa-num<75>ricos, e deve ser um
article_id v<>lido no database. Verifique isso!
</para>
</note>
<para>
Tenha certeza de passar o mesmo cache_id como o segundo
par<61>metro para <link linkend="api.is.cached">is_cached()</link> e
<link linkend="api.clear.cache">clear_cache()</link>.
</para>
<example>
<title>Passando um cache_id para is_cached()</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$my_cache_id = $_GET['article_id'];
if(!$smarty->is_cached('index.tpl',$my_cache_id)) {
// No cache available, do variable assignments here.
$contents = get_database_contents();
$smarty->assign($contents);
}
$smarty->display('index.tpl',$my_cache_id);</programlisting>
</example>
<para>
Voc<6F> pode limpar todos os caches para um cache_id em particular passando
o primeiro par<61>metro null para clear_cache().
</para>
<example>
<title>Limpando todos os caches para um cache_id em particular</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
// clear all caches with "sports" as the cache_id
$smarty->clear_cache(null,"sports");
$smarty->display('index.tpl',"sports");</programlisting>
</example>
<para>
Desta maneira, voc<6F> pode "agrupar" seus
caches juntos dando-lhes o mesmo cache_id.
</para>
</sect1>
<sect1 id="caching.groups">
<title>Grupos de Cache</title>
<para>
Voc<6F> pode fazer agrupamentos mais elaborados configurando grupos de cache_id. Isso <20>
realizado pela separa<72><61>o de cada sub-grupo com uma barra vertical "|" no valor do
cache_id. Voc<6F> pode ter muitos sub-grupos com voc<6F> desejar.
</para>
<example>
<title>Grupos de cache_id</title>
<programlisting>
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
// clear all caches with "sports|basketball" as the first two cache_id groups
$smarty->clear_cache(null,"sports|basketball");
// clear all caches with "sports" as the first cache_id group. This would
// include "sports|basketball", or "sports|(anything)|(anything)|(anything)|..."
$smarty->clear_cache(null,"sports");
$smarty->display('index.tpl',"sports|basketball");</programlisting>
</example>
<note>
<title>Notas T<>cnicas</title>
<para>
O agrupamento de cache id N<>O use o path do template como alguma parte do cache_id.
Por exemplo, se voc<6F> tem display('themes/blue/index.tpl'), voc<6F> n<>o pode limpar o cache
para tudo que estiver sob o diret<65>rio "themes/blue". Se voc<6F> quiser fazer isso, voc<6F> deve
agrup<75>-los no cache_id, como display('themes/blue/index.tpl','themes|blue'); Ent<6E>o
voc<6F> pode limpar os caches para o
tema azul com with clear_cache(null,'themes|blue');
</para>
</note>
</sect1>
<sect1 id="caching.cacheable">
<title>Controlling Cacheability of Plugins' Output</title>
<para>
Desde Smarty-2.6.0 os caches de plugins pode ser declarados
ao registr<74>-los. O terceiro par<61>metro para register_block,
register_compiler_function e register_function <20> chamado
<parameter>$cacheable</parameter> e o padr<64>o para true que <20> tamb<6D>m
o comportamento de plugins na vers<72>o da Smarty antecessores <20> 2.6.0
</para>
<para>
Quando registrando um plugin com $cacheable=false o plugin <20> chamado todo o tempo na p<>gina que est<73> sendo mostrada, sempre se a p<>gina vier do cache. A fun<75><6E>o de plugin tem um comportamento levemente como uma fun<75><6E>o <link linkend="plugins.inserts">insert</link>.
</para>
<para>
Em contraste para <link linkend="language.function.insert">{insert}</link> o atributo para o plugin n<>o est<73> em cache por padr<64>o. Eles podem ser declarados para serem cacheados com o quarto par<61>metro <parameter>$cache_attrs</parameter>. <parameter>$cache_attrs</parameter> <20> um array de nomes de atributos que devem ser cacheados, ent<6E>o a fun<75><6E>o de plugin pega o valor como isso sendo o tempo que a p<>gina foi escrita para o cache todo o tempo isso <20> buscado do cache.
</para>
<example>
<title>Prevenindo uma sa<73>da de plugin de ser cacheada</title>
<programlisting>
index.php:
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
function remaining_seconds($params, &amp;$smarty) {
$remain = $params['endtime'] - time();
if ($remain >=0)
return $remain . " second(s)";
else
return "done";
}
$smarty->register_function('remaining', 'remaining_seconds', false, array('endtime'));
if (!$smarty->is_cached('index.tpl')) {
// fetch $obj from db and assign...
$smarty->assign_by_ref('obj', $obj);
}
$smarty->display('index.tpl');
index.tpl:
Tempo restante: {remain endtime=$obj->endtime}</programlisting>
<para>
O n<>mero de segundos at<61> que o endtime de $obj alcan<61>a altera<72><61>es em cada display de p<>gina, mesmo que a p<>gina esteja em cache. Desde o atributo endtime esteja em cache o objeto somente tem que ser puxado do banco de dados quando a p<>gina est<73> escrita para o cache mas n<>o em requisi<73><69>es subsequentes da p<>gina.
</para>
</example>
<example>
<title>Prevenindo uma passagem inteira do template para o cache</title>
<programlisting>
index.php:
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
function smarty_block_dynamic($param, $content, &amp;$smarty) {
return $content;
}
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);
$smarty->display('index.tpl');
index.tpl:
Page created: {"0"|date_format:"%D %H:%M:%S"}
{dynamic}
Now is: {"0"|date_format:"%D %H:%M:%S"}
... do other stuff ...
{/dynamic}</programlisting>
</example>
<para>
Quando recarregado a p<>gina que voc<6F> ir<69> notar que ambas as datas diferem. Uma <20> "din<69>mica" e uma <20> "est<73>tica". Voc<6F> pode fazer qualquer coisa entre as tags {dynamic}...{/dynamic} e ter certeza que isso n<>o ir<69> ficar em cache como o restante da p<>gina.
</para>
</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
-->

View File

@@ -0,0 +1,802 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="plugins">
<title>Extendendo a Smarty com Plugins</title>
<para>
A Vers<72>o 2.0 introduziu a arquitetura de plugin que <20> usada para quase todas as
funcionalidades customiz<69>veis da Smarty. Isto inclui:
<itemizedlist spacing="compact">
<listitem><simpara>fun<EFBFBD><EFBFBD>es</simpara></listitem>
<listitem><simpara>modificadores</simpara></listitem>
<listitem><simpara>fun<EFBFBD><EFBFBD>es de bloco</simpara></listitem>
<listitem><simpara>fun<EFBFBD><EFBFBD>es de compilador</simpara></listitem>
<listitem><simpara>prefiltros</simpara></listitem>
<listitem><simpara>posfiltros</simpara></listitem>
<listitem><simpara>filtros de sa<73>da</simpara></listitem>
<listitem><simpara>recursos</simpara></listitem>
<listitem><simpara>inserir</simpara></listitem>
</itemizedlist>
Com a exce<63><65>o de recursos, a compatibilidade com a forma antiga de fun<75><6E>es de
manipulador de registro via register_* API <20> preservada. Se voc<6F> n<>o usou o API mas no lugar disso
modificou as vari<72>veis de classe <literal>$custom_funcs</literal>, <literal>$custom_mods</literal>, e
outras diretamente, ent<6E>o voc<6F> vai
precisar ajustar seus scripts para ou usar API ou converter suas
funcionalidade customizadas em plugins.
</para>
<sect1>
<title>Como os Plugins Funcionam</title>
<para>
Plugins s<>o sempre lidos quando requisitados. Apenas os modificadores espec<65>ficos,
fun<75><6E>es, recursos, etc convocados em scripts de template ser<65>o lidos. Al<41>m disso, cada plugin
<20> lido apenas uma vez, mesmo se voc<6F> tem v<>rias inst<73>ncias diferentes da Smarty rodando na mesma
requisi<73><69>o.
</para>
<para>
Pre/posfiltros e filtros de sa<73>da s<>o uma parte de um caso especial. Visto que eles n<>o s<>o mencionados
nos templates, eles devem ser registrados ou lidos explicitamente via fun<75><6E>es de API antes do template
ser processado.
A ordem em que multiplos filtros do mesmo
tipo s<>o executados dependem da ordem em que eles s<>o registrados ou lidos.
</para>
<para>
O <link linkend="variable.plugins.dir">diret<EFBFBD>rio de plugins</link>
pode ser uma string contendo um caminho ou um array
contendo multiplos caminhos. Para instalar um plugin,
simplesmente coloque-o em um dos diret<65>rios e a Smarty ir<69> us<75>-lo automaticamente.
</para>
</sect1>
<sect1 id="plugins.naming.conventions">
<title>Conven<EFBFBD><EFBFBD>es de Apar<61>ncia</title>
<para>
Arquivos e fun<75><6E>es de Plugin devem seguir uma conven<65><6E>o de apar<61>ncia muito espec<65>fica
a fim de ser localizada pela Smarty.
</para>
<para>
Os arquivos de plugin devem ser nomeados da sequinte forma:
<blockquote>
<para>
<filename>
<replaceable>tipo</replaceable>.<replaceable>nome</replaceable>.php
</filename>
</para>
</blockquote>
</para>
<para>
Onde <literal>tipo</literal> <20> um dos seguintes tipos de plugin:
<itemizedlist spacing="compact">
<listitem><simpara>function</simpara></listitem>
<listitem><simpara>modifier</simpara></listitem>
<listitem><simpara>block</simpara></listitem>
<listitem><simpara>compiler</simpara></listitem>
<listitem><simpara>prefilter</simpara></listitem>
<listitem><simpara>postfilter</simpara></listitem>
<listitem><simpara>outputfilter</simpara></listitem>
<listitem><simpara>resource</simpara></listitem>
<listitem><simpara>insert</simpara></listitem>
</itemizedlist>
</para>
<para>
E <literal>nome</literal> seria um identificador v<>lido (letras,
n<>meros, e underscores apenas).
</para>
<para>
Alguns exemplos: <literal>function.html_select_date.php</literal>,
<literal>resource.db.php</literal>,
<literal>modifier.spacify.php</literal>.
</para>
<para>
As fun<75><6E>es de plugin dentro dos arquivos do plugin devem ser nomeadas da seguinte forma:
<blockquote>
<para>
<function>smarty_<replaceable>tipo</replaceable>_<replaceable>nome</replaceable></function>
</para>
</blockquote>
</para>
<para>
O significado de <literal>tipo</literal> e
<literal>nome</literal> s<>o os mesmos de antes.
</para>
<para>
A Smarty mostrar<61> mensagens de erro apropriadas se o arquivo de plugins que <20> necess<73>rio n<>o <20> encontrado,
ou se o arquivo ou a fun<75><6E>o de plugin
est<73>o nomeadas inadequadamente.
</para>
</sect1>
<sect1 id="plugins.writing">
<title>Escrevendo Plugins</title>
<para>
Os Plugins podem ser ou lidos pela Smarty automaticamente do sistema de arquivos ou eles podem
ser registrados no tempo de execu<63><75>o via uma das fun<75><6E>es
de API register_* . Eles podem tamb<6D>m ser
com o uso da fun<75><6E>o API unregister_* .
</para>
<para>
Para os plugins que s<>o registrados no tempo de execu<63><75>o, o nome da(s) fun<75><6E>o(<28>es) de plugin
n<>o t<>m que seguir a conven<65><6E>o de apar<61>ncia.
</para>
<para>
Se um plugin depende de alguma funcionalidade fornecida por um outro plugin (como <20> o caso com alguns
plugins embutidos com a Smarty),
ent<6E>o a forma apropriada para ler o plugin necess<73>rio <20> esta:
</para>
<programlisting>
require_once $smarty->_get_plugin_filepath('function', 'html_options');</programlisting>
<para>
Como uma regra geral, o objeto da Smarty <20> sempre passado para os plugins como o <20>ltimo par<61>metro
(com duas exce<63><65>es: modificadores n<>o passam o objeto da Smarty em tudo e blocks passam
<parameter>&amp;$repeat</parameter> depois do objeto da Smarty
para manter compatibilidade a antigas
vers<72>es da Smarty).
</para>
</sect1>
<sect1 id="plugins.functions"><title>Fun<EFBFBD><EFBFBD>es de Template</title>
<funcsynopsis>
<funcprototype>
<funcdef>void <function>smarty_function_<replaceable>name</replaceable></function></funcdef>
<paramdef>array <parameter>$params</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
Todos os atributos passados para as fun<75><6E>es de template a
partir do template est<73>o contidas em
<parameter>$params</parameter> como um array associativo. Ou acessa esses valores
diretamente i.e <varname>$params['start']</varname> ou usa
<varname>extract($params)</varname> para
import<72>-los para dentro da tabela s<>mbolo.
</para>
<para>
A sa<73>da (valor de retorno) da fun<75><6E>o ser<65> substitu<74>da no lugar da tag da fun<75><6E>o no template
(a fun<75><6E>o <function>fetch</function>, por exemplo). Alternativamente, a fun<75><6E>o pode simplesmente executar
alguma outra tarefa sem ter alguma sa<73>da
(a fun<75><6E>o <function>assign</function>).
</para>
<para>
Se a fun<75><6E>o precisa passar valores a algumas vari<72>veis para o template ou utilizar alguma outra funcionalidade
fornecida com a Smarty, ela pode usar
o objeto <parameter>$smarty</parameter> fornecido para fazer isso.
</para>
<para>
Veja tamb<6D>m:
<link linkend="api.register.function">register_function()</link>,
<link linkend="api.unregister.function">unregister_function()</link>.
</para>
<para>
<example>
<title>fun<EFBFBD><EFBFBD>o de plugin com sa<73>da</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: function.eightball.php
* Type: function
* Name: eightball
* Purpose: outputs a random magic answer
* -------------------------------------------------------------
*/
function smarty_function_eightball($params, &amp;$smarty)
{
$answers = array('Yes',
'No',
'No way',
'Outlook not so good',
'Ask again soon',
'Maybe in your reality');
$result = array_rand($answers);
return $answers[$result];
}
?&gt;</programlisting>
</example>
</para>
<para>
que pode ser usada no template da seguinte forma:
</para>
<programlisting>
Pergunta: N<>s sempre teremos tempo para viajar?
Resposta: {eightball}.</programlisting>
<para>
<example>
<title>fun<EFBFBD><EFBFBD>o de plugin sem sa<73>da</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: function.assign.php
* Type: function
* Name: assign
* Purpose: assign a value to a template variable
* -------------------------------------------------------------
*/
function smarty_function_assign($params, &amp;$smarty)
{
extract($params);
if (empty($var)) {
$smarty->trigger_error("assign: missing 'var' parameter");
return;
}
if (!in_array('value', array_keys($params))) {
$smarty->trigger_error("assign: missing 'value' parameter");
return;
}
$smarty->assign($var, $value);
}
?&gt;</programlisting>
</example>
</para>
</sect1>
<sect1 id="plugins.modifiers"><title>Modifiers</title>
<para>
Modificadores s<>o fun<75><6E>es que s<>o aplicadas a uma vari<72>vel no template antes dela ser mostrada
ou usada em algum outro contexto.
Modificadores podem ser encadeados juntos.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>mixed <function>smarty_modifier_<replaceable>name</replaceable></function></funcdef>
<paramdef>mixed <parameter>$value</parameter></paramdef>
<paramdef>[mixed <parameter>$param1</parameter>, ...]</paramdef>
</funcprototype>
</funcsynopsis>
<para>
O primeiro par<61>metro para o plugin midificador <20> o valor em que o modificador <20> suposto
operar. O resto dos par<61>metros podem ser opcionais,
dependendo de qual tipo de opera<72><61>o <20> para
ser executada.
</para>
<para>
O modificador deve retornar o resultado de seu processamento.
</para>
<para>
Veja tamb<6D>m:
<link linkend="api.register.modifier">register_modifier()</link>,
<link linkend="api.unregister.modifier">unregister_modifier()</link>.
</para>
<example>
<title>Plugin modificador simples</title>
<para>
Este plugin basiamente <20> um alias de uma
fun<75><6E>o do PHP. Ele n<>o tem nenhum par<61>metro adicional.
</para>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: modifier.capitalize.php
* Type: modifier
* Name: capitalize
* Purpose: capitalize words in the string
* -------------------------------------------------------------
*/
function smarty_modifier_capitalize($string)
{
return ucwords($string);
}
?&gt;</programlisting>
</example>
<para></para>
<example>
<title>Plugin modificador mais complexo</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: modifier.truncate.php
* Type: modifier
* Name: truncate
* Purpose: Truncate a string to a certain length if necessary,
* optionally splitting in the middle of a word, and
* appending the $etc string.
* -------------------------------------------------------------
*/
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false)
{
if ($length == 0)
return '';
if (strlen($string) > $length) {
$length -= strlen($etc);
$fragment = substr($string, 0, $length+1);
if ($break_words)
$fragment = substr($fragment, 0, -1);
else
$fragment = preg_replace('/\s+(\S+)?$/', '', $fragment);
return $fragment.$etc;
} else
return $string;
}
?&gt;</programlisting>
</example>
</sect1>
<sect1 id="plugins.block.functions"><title>Block Functions</title>
<funcsynopsis>
<funcprototype>
<funcdef>void <function>smarty_block_<replaceable>name</replaceable></function></funcdef>
<paramdef>array <parameter>$params</parameter></paramdef>
<paramdef>mixed <parameter>$content</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
Fun<75><6E>es de Block s<>o fun<75><6E>es da forma: {func} .. {/func}. Em outras palavras, ele enclausura
um bloco de template e opera no conte<74>do deste bloco. Fun<75><6E>es de Block tem preced<65>ncia sobre
fun<75><6E>es customizadas com mesmo nome,
assim, voc<6F> n<>o pode ter ambas, fun<75><6E>o customiz<69>vel {func} e
fun<75><6E>o de Bloco {func} .. {/func}.
</para>
<para>
Por defini<6E><69>o a implementa<74><61>o de sua fun<75><6E>o <20> chamada duas vezes pela Smarty: uma vez pela tag de abertura,
e outra pela tag de fechamento
(veja <literal>&amp;$repeat</literal> abaixo para como mudar isto).
</para>
<para>
Apenas a tag de abertura da fun<75><6E>o de bloco pode ter atributos.
Todos os atributos passados para as fun<75><6E>es de
template est<73>o contidos em <parameter>$params</parameter> como um array associativo. Voc<6F> pode ou acessar
esses valores diretamente, i.e. <varname>$params['start']</varname>
ou usar <varname>extract($params)</varname>
para import<72>-los para dentro da tabela s<>mbolo. Os atributos da tag de
abertura s<>o tamb<6D>m acess<73>veis a sua fun<75><6E>o
quando processando a tag de fechamento.
</para>
<para>
O valor da vari<72>vel <parameter>$content</parameter>
depende de que se sua fun<75><6E>o <20> chamada pela tag de
fechamento ou de abertura. Caso seja a de abertura, ele ser<65>
<literal>null</literal>, se for a de fechamento
o valor ser<65> do conte<74>do do bloco de template.
Note que o bloco de template j<> ter<65> sido processado pela
Smarty, ent<6E>o tudo que voc<6F> receber<65> <20> sa<73>da do template, n<>o o template original.
</para>
<para>
O par<61>metro <parameter>&amp;$repeat</parameter> <20> passado por
refer<65>ncia para a fun<75><6E>o de implementa<74><61>o
e fornece uma possibilidade para ele controlar quantas
vezes o bloco <20> mostrado. Por defini<6E><69>o
<parameter>$repeat</parameter> <20> <literal>true</literal> na primeira chamada da block-function
(a tag de abertura do bloco) e <literal>false</literal>
em todas as chamadas subsequentes <20> fun<75><6E>o de bloco
(a tag de fechamento do bloco). Cada vez que a
implementa<74><61>o da fun<75><6E>o retorna com o <parameter>&amp;$repeat</parameter>
sendo true, o conte<74>do entre {func} .. {/func} <20> avaliado
e a implementa<74><61>o da fun<75><6E>o <20> chamada novamente com
o novo conte<74>do do bloco no par<61>metro <parameter>$content</parameter>.
</para>
<para>
Se voc<6F> tem fun<75><6E>es de bloco aninhadas, <20> poss<73>vel
descobrir qual <20> a fun<75><6E>o de bloco pai acessando
a vari<72>vel <varname>$smarty->_tag_stack</varname>. Apenas fa<66>a um var_dump()
nela e a estrutura estaria vis<69>vel.
</para>
<para>
See also:
<link linkend="api.register.block">register_block()</link>,
<link linkend="api.unregister.block">unregister_block()</link>.
</para>
<example>
<title>fun<EFBFBD><EFBFBD>o de bloco</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: block.translate.php
* Type: block
* Name: translate
* Purpose: translate a block of text
* -------------------------------------------------------------
*/
function smarty_block_translate($params, $content, &amp;$smarty)
{
if (isset($content)) {
$lang = $params['lang'];
// do some intelligent translation thing here with $content
return $translation;
}
}</programlisting>
</example>
</sect1>
<sect1 id="plugins.compiler.functions"><title>Fun<EFBFBD><EFBFBD>es Compiladoras</title>
<para>
Fun<75><6E>es compiladoras s<> s<>o chamadas durante a compila<6C><61>o do template.
Elas s<>o <20>teis para inje<6A><65>o de c<>digo PHP ou conte<74>do est<73>tico time-sensitive
dentro do template. Se h<> ambos, uma fun<75><6E>o
compiladora e uma fun<75><6E>o customiz<69>vel
registrada sob o mesmo nome, a fun<75><6E>o compiladora tem preced<65>ncia.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>mixed <function>smarty_compiler_<replaceable>name</replaceable></function></funcdef>
<paramdef>string <parameter>$tag_arg</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
<20> fun<75><6E>o compiladora s<>o passados dois par<61>metros:
a tag string de argumento da tag - basicamente, tudo a partir
do nome da fun<75><6E>o at<61> o delimitador de fechamento, e o objeto da Smarty. <20> suposto que retorna o c<>digo PHP
para ser injetado dentro do template compilado.
</para>
<para>
See also
<link linkend="api.register.compiler.function">register_compiler_function()</link>,
<link linkend="api.unregister.compiler.function">unregister_compiler_function()</link>.
</para>
<example>
<title>fun<EFBFBD><EFBFBD>o compiladora simples</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: compiler.tplheader.php
* Type: compiler
* Name: tplheader
* Purpose: Output header containing the source file name and
* the time it was compiled.
* -------------------------------------------------------------
*/
function smarty_compiler_tplheader($tag_arg, &amp;$smarty)
{
return "\necho '" . $smarty-&gt;_current_file . " compiled at " . date('Y-m-d H:M'). "';";
}
?&gt;</programlisting>
<para>
Esta fun<75><6E>o pode ser chamada em um template da seguinte forma:
</para>
<programlisting>
{* esta fun<75><6E>o <20> executada somente no tempo de compila<6C><61>o *}
{tplheader}</programlisting>
<para>
O c<>digo PHP resultante no template compilado seria algo assim:
</para>
<programlisting>
&lt;php
echo 'index.tpl compiled at 2002-02-20 20:02';
?&gt;</programlisting>
</example>
</sect1>
<sect1 id="plugins.prefilters.postfilters">
<title>Prefiltros/Posfiltros</title>
<para>
Plugins Prefilter e postfilter s<>o muito similares
em conceito; onde eles diferem <20> na execu<63><75>o -- mais
precisamente no tempo de suas execu<63><75>es.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>string <function>smarty_prefilter_<replaceable>name</replaceable></function></funcdef>
<paramdef>string <parameter>$source</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
Prefilters s<>o usados para processar o fonte do template
imediatamente antes da compila<6C><61>o. O primeiro par<61>metro da
fun<75><6E>o de prefilter <20> o fonte do template, possivelmente modificado por alguns outros prefilters. O Plugin
<20> suposto retornar o fonte modificado. Note que este fonte n<>o <20> salvo em lugar nenhum, ele s<> <20> usado para
a compila<6C><61>o.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>string <function>smarty_postfilter_<replaceable>name</replaceable></function></funcdef>
<paramdef>string <parameter>$compiled</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
Postfilters s<>o usados para processar a sa<73>da compilada do template (o c<>digo PHP) imediatamente ap<61>s
a compila<6C><61>o ser feita e antes do template compilado ser
salvo no sistema de arquivo. O primeiro par<61>metro
para a fun<75><6E>o postfilter <20> o c<>digo do template compilado,
possivelmente modificado por outros postfilters.
O plugin <20> suposto retornar a vers<72>o modificada deste c<>digo.
</para>
<example>
<title>Plugin prefilter</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: prefilter.pre01.php
* Type: prefilter
* Name: pre01
* Purpose: Convert html tags to be lowercase.
* -------------------------------------------------------------
*/
function smarty_prefilter_pre01($source, &amp;$smarty)
{
return preg_replace('!&lt;(\w+)[^&gt;]+&gt;!e', 'strtolower("$1")', $source);
}
?&gt;</programlisting>
</example>
<para></para>
<example>
<title>Plugin postfilter</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: postfilter.post01.php
* Type: postfilter
* Name: post01
* Purpose: Output code that lists all current template vars.
* -------------------------------------------------------------
*/
function smarty_postfilter_post01($compiled, &amp;$smarty)
{
$compiled = "&lt;pre&gt;\n&lt;?php print_r(\$this-&gt;get_template_vars()); ?&gt;\n&lt;/pre&gt;" . $compiled;
return $compiled;
}
?&gt;</programlisting>
</example>
</sect1>
<sect1 id="plugins.outputfilters"><title>Filtros de sa<73>da</title>
<para>
Filtros de sa<73>da operam na sa<73>da do template, depois que o template <20> lido e executado, mas
antes a sa<73>da <20> mostrada.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>string <function>smarty_outputfilter_<replaceable>name</replaceable></function></funcdef>
<paramdef>string <parameter>$template_output</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
O primeiro par<61>metro para a fun<75><6E>o do filtro de sa<73>da <20> a sa<73>da do template que precisa ser processada, e
o segundo par<61>metro <20> a inst<73>ncia da Smarty invocando o plugin.
O plugin deve fazer o precessamento e
retornar os resultados.
</para>
<example>
<title>output filter plugin</title>
<programlisting>
/*
* Smarty plugin
* -------------------------------------------------------------
* File: outputfilter.protect_email.php
* Type: outputfilter
* Name: protect_email
* Purpose: Converts @ sign in email addresses to %40 as
* a simple protection against spambots
* -------------------------------------------------------------
*/
function smarty_outputfilter_protect_email($output, &amp;$smarty)
{
return preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!',
'$1%40$2', $output);
}
</programlisting>
</example>
</sect1>
<sect1 id="plugins.resources"><title>Recursos (Resources)</title>
<para>
Os plugins de Recursos s<>o como uma forma gen<65>rica de fornecer c<>digos fontes de template
ou componentes de script PHP para a Smarty. Alguns exemplos de recursos:
banco de dados, LDAP, mem<65>ria compartilhada, sockets, e assim por diante.
</para>
<para>
H<> um total de 4 fun<75><6E>es que precisam estar registradas
para cada tipo de recurso. Cada fun<75><6E>o receber<65>
o recurso requisitado como o primeiro par<61>metro e o objeto da Smarty como o <20>ltimo par<61>metro. O resto
dos par<61>metros dependem da fun<75><6E>o.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>bool <function>smarty_resource_<replaceable>name</replaceable>_source</function></funcdef>
<paramdef>string <parameter>$rsrc_name</parameter></paramdef>
<paramdef>string <parameter>&amp;$source</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>bool <function>smarty_resource_<replaceable>name</replaceable>_timestamp</function></funcdef>
<paramdef>string <parameter>$rsrc_name</parameter></paramdef>
<paramdef>int <parameter>&amp;$timestamp</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>bool <function>smarty_resource_<replaceable>name</replaceable>_secure</function></funcdef>
<paramdef>string <parameter>$rsrc_name</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>bool <function>smarty_resource_<replaceable>name</replaceable>_trusted</function></funcdef>
<paramdef>string <parameter>$rsrc_name</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
A primeira fun<75><6E>o deve devolver o recurso. Seu segundo par<61>metro <20> uma vari<72>vel passada por
refer<65>ncia onde o resultado seria armazenado.
A fun<75><6E>o deve retornar <literal>true</literal> se
ela est<73> apta a devolver com sucesso o recurso e
caso contr<74>rio retorna <literal>false</literal>.
</para>
<para>
A segunda fun<75><6E>o deve devolver a <20>ltima modifica<63><61>o do
recurso requisitado (como um timestamp Unix).
O segundo par<61>metro <20> uma vari<72>vel passada por refer<65>ncia onde o timestamp seria armazenado.
A fun<75><6E>o deve retornar <literal>true</literal>
se o timestamp poderia ser determinado com sucesso,
e caso contr<74>rio retornaria <literal>false</literal>.
</para>
<para>
A terceira fun<75><6E>o deve retornar <literal>true</literal> ou
<literal>false</literal>, dependendo do recurso requisitado
est<73> seguro ou n<>o. Esta fun<75><6E>o <20> usada
apenas para recursos de template mas ainda assim seria definida.
</para>
<para>
A quarta fun<75><6E>o deve retornar <literal>true</literal>
ou <literal>false</literal>, dependendo
do recurso requisitado ser confi<66>vel ou n<>o.
Esta fun<75><6E>o <20> usada apenas para componentes de
script PHP requisitados pelas tags <command>include_php</command> ou
<command>insert</command> com o atributo <structfield>src</structfield>.
Entretanto, ela ainda assim mesmo seria definida para os recursos de template.
</para>
<para>
Veja tamb<6D>m:
<link linkend="api.register.resource">register_resource()</link>,
<link linkend="api.unregister.resource">unregister_resource()</link>.
</para>
<example>
<title>Plugin resource (recurso)</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: resource.db.php
* Type: resource
* Name: db
* Purpose: Fetches templates from a database
* -------------------------------------------------------------
*/
function smarty_resource_db_source($tpl_name, &amp;$tpl_source, &amp;$smarty)
{
// do database call here to fetch your template,
// populating $tpl_source
$sql = new SQL;
$sql->query("select tpl_source
from my_table
where tpl_name='$tpl_name'");
if ($sql->num_rows) {
$tpl_source = $sql->record['tpl_source'];
return true;
} else {
return false;
}
}
function smarty_resource_db_timestamp($tpl_name, &amp;$tpl_timestamp, &amp;$smarty)
{
// faz o banco de dados chamar aqui para preencher $tpl_timestamp.
$sql = new SQL;
$sql->query("select tpl_timestamp
from my_table
where tpl_name='$tpl_name'");
if ($sql->num_rows) {
$tpl_timestamp = $sql->record['tpl_timestamp'];
return true;
} else {
return false;
}
}
function smarty_resource_db_secure($tpl_name, &amp;$smarty)
{
// assume que todos os templates s<>o seguros
return true;
}
function smarty_resource_db_trusted($tpl_name, &amp;$smarty)
{
// n<>o usado para templates
}
?&gt;</programlisting>
</example>
</sect1>
<sect1 id="plugins.inserts"><title>Inserts</title>
<para>
Plugins Insert s<>o usados para implementar fun<75><6E>es que s<>o invocadas por tags
<link linkend="language.function.insert"><command>insert</command></link>
no template.
</para>
<funcsynopsis>
<funcprototype>
<funcdef>string <function>smarty_insert_<replaceable>name</replaceable></function></funcdef>
<paramdef>array <parameter>$params</parameter></paramdef>
<paramdef>object <parameter>&amp;$smarty</parameter></paramdef>
</funcprototype>
</funcsynopsis>
<para>
O primeiro par<61>metro para a fun<75><6E>o <20> um array
associativo de atributos passados para o
insert. Ou acessa esses valores diretamente,
i.e. <varname>$params['start']</varname> ou usa
<varname>extract($params)</varname> para import<72>-los para dentro da tabela s<>mbolo.
</para>
<para>
A fun<75><6E>o insert deve retornar o
resultado que ser<65> substitu<74>do no lugar da tag
<command>insert</command> no template.
</para>
<example>
<title>Plugin insert</title>
<programlisting>
&lt;?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: insert.time.php
* Type: time
* Name: time
* Purpose: Inserts current date/time according to format
* -------------------------------------------------------------
*/
function smarty_insert_time($params, &amp;$smarty)
{
if (empty($params['format'])) {
$smarty->trigger_error("insert time: missing 'format' parameter");
return;
}
$datetime = strftime($params['format']);
return $datetime;
}
?&gt;</programlisting>
</example>
</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
-->

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="smarty.constants">
<title>Constantes</title>
<para></para>
<sect1 id="constant.smarty.dir">
<title>SMARTY_DIR</title>
<para>
Isso deve ser o caminho completo do path para a localiza<7A><61>o dos arquivos de classe da Smarty.
Se isso n<>o for definido, ent<6E>o a Smarty ir<69> tentar determinar
o valor apropriado automaticamente. Se definido, o path
deve finalizar com uma barra.
</para>
<example>
<title>SMARTY_DIR</title>
<programlisting>
// set path to Smarty directory
define("SMARTY_DIR","/usr/local/lib/php/Smarty/");
require_once(SMARTY_DIR."Smarty.class.php");</programlisting>
</example>
</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
-->