add portuguese docs

This commit is contained in:
mohrt
2003-12-23 15:53:39 +00:00
parent 5b255f9d1d
commit ae3b538314
11 changed files with 10544 additions and 0 deletions

1
NEWS
View File

@@ -1,3 +1,4 @@
- add cookie persistance to debug console (Monte)
- allow single-digit days and months without smarty_make_timestamp()
in html_select_date (messju)
- fix headers sent erroneously with cache_modified_check and fetch()

404
docs/pt_BR/appendixes.sgml Normal file
View File

@@ -0,0 +1,404 @@
<part id="appendixes"><!-- En Version: 1.12 -->
<title>Ap<41>ndices</title>
<chapter id="troubleshooting">
<title>Localiza<7A><61>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>
<chapter id="tips">
<title>Dicas &amp; Truques</title>
<para>
</para>
<sect1 id="tips.blank.var.handling">
<title>Manipula<6C><61>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<6C><61>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>
<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>
<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>
</part>

46
docs/pt_BR/common.dsl Normal file
View File

@@ -0,0 +1,46 @@
;; -*- Scheme -*-
;;
;; $Id$
;;
;; This file contains stylesheet customization common to the HTML
;; and print versions.
;;
;; Stylesheets Localization
(define %default-language% "pt_BR")
(define %use-id-as-filename% #t)
(define %gentext-nav-tblwidth% "100%")
(define %refentry-function% #t)
(define %refentry-generate-name% #f)
(define %funcsynopsis-style% 'ansi)
(define ($legalnotice-link-file$ legalnotice)
(string-append "copyright" %html-ext%))
(define %generate-legalnotice-link% #t)
(define %footnotes-at-end% #t)
(define %force-chapter-toc% #t)
(define newline "\U-000D")
(define %number-programlisting-lines% #f)
(define %linenumber-mod% 1)
(define %shade-verbatim% #t)
(define ($generate-book-lot-list$)
;; REFENTRY generate-book-lot-list
;; PURP Which Lists of Titles should be produced for Books?
;; DESC
;; This parameter should be a list (possibly empty) of the elements
;; for which Lists of Titles should be produced for each 'Book'.
;;
;; It is meaningless to put elements that do not have titles in this
;; list. If elements with optional titles are placed in this list, only
;; the instances of those elements that do have titles will appear in
;; the LOT.
;;
;; /DESC
;; AUTHOR N/A
;; /REFENTRY
(list (normalize "table")))
(define (php-code code)
(make processing-instruction
data: (string-append "php " code "?")))

5882
docs/pt_BR/designers.sgml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,398 @@
<part id="getting.started"><!-- En Version: 1.24 -->
<title>Iniciando</title>
<chapter id="what.is.smarty">
<title>O que <20> o Smarty?</title>
<para>
Smarty uma ferramenta de template para PHP. Mais especificamente, ela facilita
uma forma control<6F>vel de separar a aplica<63><61>o l<>gica e o conte<74>do de sua apresenta<74><61>o.
Isto <20> melhor descrito em uma situa<75><61>o onde o programador da aplica<63><61>o e o designer
do template executam diferentes fun<75><6E>es, ou na maioria dos casos n<>o s<>o a mesma pessoa.
Por exemplo, digamos que voc<6F> est<73> criando uma p<>gina que est<73> mostrando um artigo de
jornal. O autor, a manchete, a conclus<75>o e o corpo do artigo s<>o elementos de conte<74>do, eles
n<>o cont<6E>m informa<6D><61>o sobre como eles ser<65>o apresentados. Eles s<>o passados para o Smarty
pela aplica<63><61>o, ent<6E>o o designer de template edita o template e usa uma combina<6E><61>o de tags
HTML e tags de template para formatar a apresenta<74><61>o destes elementos (tabelas HTML, cores
de planos de fundo, tamanhos da fonte, folhas de estilos, etc.).
Quando o programador necessita
mudar a forma em que o conte<74>do do artigo <20>
devolvido (uma mudan<61>a da l<>gica da aplica<63><61>o.) Esta
mudan<61>a n<>o afeta o designer do template, o conte<74>do ainda chegar<61> no template exatamente da
mesma forma. De modo semelhante, se o designer de template quer redesenhar completamente
o template, isto n<>o requer mudan<61>as na l<>gica da aplica<63><61>o. Ent<6E>o o programador pode fazer
mudan<61>as na l<>gica da aplica<63><61>o sem precisar reestruturar os templates,
e o designer de template
pode fazer mudan<61>as no template sem quebrar a l<>gica da aplica<63><61>o.
</para>
<para>
Agora um resumo sobre o que o Smarty faz e N<>O faz. O Smarty n<>o tenta separar completamente
a l<>gica dos templates. N<>o h<> problema com a l<>gica em seus templates sob a condi<64><69>o de que
esta l<>gica seja estritamente para apresenta<74><61>o. Uma palavra de aviso: mantenha a l<>gica
fora dos templates, e a l<>gica da apresenta<74><61>o fora da aplica<63><61>o. Isto definitivamente
manter<65> as coisas mais manipul<75>veis
e escal<61>veis para o futuro pr<70>ximo.
</para>
<para>
Um dos aspectos <20>nicos sobre o Smarty <20> a compila<6C><61>o do template. Isto significa que o
Smarty l<> os arquivos de template e cria scripts PHP a partir deles. Uma vez criados, eles
s<>o executados. Ent<6E>o n<>o h<> interpreta<74><61>o de arquivo de
template custosa para cada pedido, e
cada template pode levar total vantagem de solu<6C><75>es de cache de compiladores PHP tais como
Zend Accelerator (http://www.zend.com) ou PHP Accelerator
(http://www.php-accelerator.co.uk).
</para>
<para>
Algumas das caracter<65>sticas do Smarty:
</para>
<itemizedlist>
<listitem><para>Ele <20> extremamente r<>pido.</para></listitem>
<listitem><para>Ele <20> eficiente visto que
o interpretador de PHP faz o trabalho mais chato.</para></listitem>
<listitem><para>Sem elevadas interpreta<74><61>es de template, apenas compila uma vez.</para></listitem>
<listitem><para>Ele est<73> atento para s<> recompilar os arquivos de template que
foram mudados.</para></listitem>
<listitem><para>Voc<6F> pode criar <link linkend="language.custom.functions">fun<75><6E>es customizadas
</link> e <link linkend="language.modifiers">modificadores de vari<72>veis
</link> customizados, de modo que a linguagem de template <20> extremamente extens<6E>vel.</para></listitem>
<listitem><para>Sintaxe de tag delimitadora de template configur<75>vel, assim voc<6F> pode usar
{}, {{}}, &lt;!--{}--&gt;, etc.</para></listitem>
<listitem><para>Os construtoress if/elseif/else/endif s<>o passados para o interpretador de PHP,
assim a sintaxe de express<73>o {if ...} pode ser tanto simples quanto complexa da forma que voc<6F>
queira.</para></listitem>
<listitem><para>Aninhamento ilimitado de sections, ifs, etc. permitidos.</para></listitem>
<listitem><para><3E> poss<73>vel embutir o c<>digo PHP diretamente em seus arquivos de template,
apesar de que isto pode n<>o ser necess<73>rio (n<>o recomendado)
visto que a ferramenta <20> t<>o customiz<69>vel.</para></listitem>
<listitem><para>Suporte de caching embutido</para></listitem>
<listitem><para>Fontes de template arbitr<74>rias</para></listitem>
<listitem><para>Fun<75><6E>es de manipula<6C><61>o de cache customizadas</para></listitem>
<listitem><para>Arquitetura de Plugin</para></listitem>
</itemizedlist>
</chapter>
<chapter id="installation">
<title>Instala<6C><61>o</title>
<sect1 id="installation.requirements">
<title>Requerimentos</title>
<para>
Smarty requer um servidor web rodando o PHP 4.0.6 superior.
</para>
</sect1>
<sect1 id="installing.smarty.basic">
<title>Instala<6C><61>o B<>sica</title>
<para>
Instale os arquivos da biblioteca do Smarty que est<73>o no diret<65>rio /libs/ da
distribui<75><69>o. Estes s<>o os arquivos PHP que voc<6F> N<>O EDITARIA. Eles s<>o comuns
a todas as aplica<63><61>es e eles s<> s<>o atualizados quando voc<6F> atualiza para uma nova
vers<72>o do Smarty.
</para>
<example>
<title>Arquivos da biblioteca do Smarty</title>
<screen>
Smarty.class.php
Smarty_Compiler.class.php
Config_File.class.php
debug.tpl
/core/*.php (todos eles)
/plugins/*.php (todos eles)</screen>
</example>
<para>
O Smarty utiliza uma constante do PHP chamada <link
linkend="constant.smarty.dir">SMARTY_DIR</link> que <20> o caminho para diret<65>rio da
biblioteca do Smarty. Basicamente, se sua aplica<63><61>o pode encontrar o arquivo
<emphasis>Smarty.class.php</emphasis>, voc<6F> n<>o precisa definir o
SMARTY_DIR, Smarty encontrar<61>-lo. Ent<6E>o, se <emphasis>Smarty.class.php</emphasis> n<>o est<73>
em seu include_path, ou voc<6F> n<>o fornece um caminho absoluto para ele em sua aplica<63><61>o, ent<6E>o
voc<6F> deve definir o SMARTY_DIR manualmente.
SMARTY_DIR <emphasis>deve</emphasis> incluir uma
barra de seguimento.
</para>
<para>
Aqui est<73> um exemplo de como voc<6F> cria uma inst<73>ncia do Smarty em seus scripts PHP:
</para>
<example>
<title>Cria uma inst<73>ncia Smarty do Smarty</title>
<screen>
require('Smarty.class.php');
$smarty = new Smarty;</screen>
</example>
<para>
Tente rodar o script acima. Se voc<6F> obtiver um erro dizendo que o arquivo
<emphasis>Smarty.class.php</emphasis> file could not be found, voc<6F> tem que fazer uma
das coisas a seguir:
</para>
<example>
<title>Fornecer um caminho absoluto para o arquivo da biblioteca</title>
<screen>
require('/usr/local/lib/php/Smarty/Smarty.class.php');
$smarty = new Smarty;</screen>
</example>
<example>
<title>Adicionar o diret<65>rio da biblioteca para o include_path do PHP</title>
<screen>
// Edite o seu arquivo php.ini, adicione o diret<65>rio da biblioteca do Smarty
// para o include_path e reinicie o servidor web.
// Ent<6E>o o c<>digo a seguir funcionaria:
require('Smarty.class.php');
$smarty = new Smarty;</screen>
</example>
<example>
<title>Defina a constante SMARTY_DIR manualmente</title>
<screen>
define('SMARTY_DIR','/usr/local/lib/php/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty;</screen>
</example>
<para>
Agora que os arquivos da biblioteca est<73>o no lugar, chegou a hora de configurar os
diret<65>rios do Smarty para a sua aplica<63><61>o. O Smarty requer quatro diret<65>rios que s<>o
(por defini<6E><69>o) chamados de <emphasis>templates</emphasis>,
<emphasis>templates_c</emphasis>, <emphasis>configs</emphasis> e
<emphasis>cache</emphasis>. Cada um destes s<>o defin<69>veis pelas propriedades da classe do Smarty
<emphasis>$template_dir</emphasis>,
<emphasis>$compile_dir</emphasis>, <emphasis>$config_dir</emphasis>, e
<emphasis>$cache_dir</emphasis> respectivamente. <20> altamente recomendado que voc<6F> configure
um grupo separado destes diret<65>rios
para cada aplica<63><61>o que utilizar<61> o Smarty.
</para>
<para>
Certifique-se que voc<6F> sabe a localiza<7A><61>o do document root do seu servidor web. Em nosso exemplo,
o document root <20> "/web/www.mydomain.com/docs/". Os diret<65>rios do Smarty
s<> s<>o acessados pela biblioteca do Smarty e nunca acessados diretamente pelo navegador. Ent<6E>o para
evitar qualquer preocupa<70><61>o com seguran<61>a,
<09> recomendado colocar estes diret<65>rios
<emphasis>fora</emphasis> do document root.
</para>
<para>
Para o nosso exemplo de instala<6C><61>o, n<>s estaremos configurando o ambiente do Smarty
para uma aplica<63><61>o de livro de visitas. N<>s escolhemos uma aplica<63><61>o s<> para o prop<6F>sito
de uma conven<65><6E>o de nomea<65><61>o de diret<65>rio. Voc<6F> pode usar o mesmo ambiente para qualquer
aplica<63><61>o, apenas substitua "guestbook" com o nome de sua aplica<63><61>o. N<>s colocaremos nossos
diret<65>rios do Smarty dentro de
"/web/www.mydomain.com/smarty/guestbook/".
</para>
<para>
Voc<6F> precisar<61> pelo menos de um arquivo dentro de seu document root, e que seja acessado pelo
navegador. N<>s chamamos nosso
script de "index.php", e o colocamos em um subdiret<65>rio dentro
do document root chamado "/guestbook/".
</para>
<note>
<title>Nota T<>cnica</title>
<para>
<09> conveniente configurar o servidor de forma que "index.php" possa ser identificado
como o <20>ndice de diret<65>rio padr<64>o, desta forma se voc<6F> acessa
"http://www.mydomain.com/guestbook/", o script index.php ser<65> executado
sem "index.php" na URL. No Apache voc<6F> pode definir isto adicionando
"index.php" no final de sua configura<72><61>o
DirectoryIndex (separe cada entrada com um espa<70>o.)
</para>
</note>
<para>
Vamos dar uma olhada na estrutura de arquivos at<61> agora:
</para>
<example>
<title>Exemple de estrutura de arquivo</title>
<screen>
/usr/local/lib/php/Smarty/Smarty.class.php
/usr/local/lib/php/Smarty/Smarty_Compiler.class.php
/usr/local/lib/php/Smarty/Config_File.class.php
/usr/local/lib/php/Smarty/debug.tpl
/usr/local/lib/php/Smarty/core/*.php
/usr/local/lib/php/Smarty/plugins/*.php
/web/www.mydomain.com/smarty/guestbook/templates/
/web/www.mydomain.com/smarty/guestbook/templates_c/
/web/www.mydomain.com/smarty/guestbook/configs/
/web/www.mydomain.com/smarty/guestbook/cache/
/web/www.mydomain.com/docs/guestbook/index.php</screen>
</example>
<para>
O Smarty precisar<61> escrever para o <emphasis>$compile_dir</emphasis> e
<emphasis>$cache_dir</emphasis>, ent<6E>o garanta que o usu<73>rio do servidor web possa
escrever neles. Este <20> geralmente o usu<73>rio "nobody" e o grupo "nobody" (ningu<67>m). Para
SO com X usu<73>rios, o usu<73>rio padr<64>o <20> "www" e o grupo "www". Se voc<6F> est<73> usando Apache, voc<6F>
pode olhar em seu arquivo httpd.conf (normalmente em "/usr/local/apache/conf/") para ver
qual o usu<73>rio e grupo est<73>o sendo usados.
</para>
<example>
<title>Configurando permiss<73>es de arquivos</title>
<screen>
chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/templates_c/
chmod 770 /web/www.mydomain.com/smarty/guestbook/templates_c/
chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/cache/
chmod 770 /web/www.mydomain.com/smarty/guestbook/cache/</screen>
</example>
<note>
<title>Nota T<>cnica</title>
<para>
chmod 770 ser<65> a seguran<61>a correta suficientemente restrita, s<> permite ao usu<73>rio "nobody" e
o grupo "nobody" acesso de leitura/escrita aos diret<65>rios. Se voc<6F> gostaria de abrir o acesso de leitura
para qualquer um (na maioria das vezes para sua pr<70>pria conveni<6E>ncia de querer ver estes
arquivos), voc<6F> pode usar o 775 ao inv<6E>s do 770.
</para>
</note>
<para>
N<>s precisamos criar o arquivoindex.tpl que o Smarty vai ler. Ele estar<61> localizado em seu
$template_dir.
</para>
<example>
<title>Editando /web/www.mydomain.com/smarty/guestbook/templates/index.tpl</title>
<screen>
{* Smarty *}
Ol<EFBFBD>, {$nome}!</screen>
</example>
<note>
<title>Nota T<>cnica</title>
<para>
{* Smarty *} <20> um coment<6E>rio de template. Ele n<>o <20> exigido, mas <20> uma pr<70>tica boa
iniciar todos os seus arquivos de template com este com este coment<6E>rio. Isto faz com
que o arquivo seja reconhecido sem levar em considera<72><61>o a sua extens<6E>o. Por exemplo,
editores de texto poderiam reconhecer
o arquivo e habilitar ilumina<6E><61>o de sintaxe especial.
</para>
</note>
<para>
Agora vamos editar index.php. N<>s criaremos uma inst<73>ncia do Smarty, daremos valor <20>s vari<72>veis
de template e mostraremos o arquivo index.tpl. Em nosso ambiente de exemplo,
"/usr/local/lib/php/Smarty" <20> o nosso include_path. Certifique-se de ter feito o mesmo, ou use
caminhos absolutos.
</para>
<example>
<title>Editando /web/www.mydomain.com/docs/guestbook/index.php</title>
<screen>
// ler a biblioteca do Smarty
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
$smarty->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
$smarty->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
$smarty->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';
$smarty->assign('nome','Taniel');
$smarty->display('index.tpl');</screen>
</example>
<note>
<title>Nota T<>cnica</title>
<para>
Em nosso exemplo, n<>s estamos configurando caminhos absolutos para todos os diret<65>rios
do Smarty. Se '/web/www.mydomain.com/smarty/guestbook/' est<73> dentro de seu include_path
do PHP, ent<6E>o estas configura<72><61>es n<>o s<>o necess<73>rias. Entretanto, isto <20> mais eficiente
e (a experi<72>ncia mostra) tem menos tend<6E>ncia a erros em rela<6C><61>o <20> defini<6E><69>o de caminhos
absolutos. Isto garante que o
Smarty est<73> pegando arquivos do diret<65>rio que voc<6F> deseja.
</para>
</note>
<para>
Agora l<> o arquivo index.php de seu navegador.
Voc<6F> veria "Ol<4F>, Taniel!"
</para>
<para>
Voc<6F> completou a configura<72><61>o b<>sica para o Smarty!
</para>
</sect1>
<sect1 id="installing.smarty.extended">
<title>Expandindo a configura<72><61>o</title>
<para>
Esta <20> uma continua<75><61>o da <link
linkend="installing.smarty.basic">instala<6C><61>o b<>sica</link>,
por favor leia ela primeiro!
</para>
<para>
Uma forma um pouco mais flex<65>vel de configurar o Smarty <20> expandir a classe e inicializar seu ambiente de
Smarty. Ent<6E>o, ao inv<6E>s de configurar caminhos de diret<65>rios repetidamente, preencher as mesmas vari<72>veis,
etc., n<>s podemos fazer isso para facilitar. Vamos criar um novo diret<65>rio "/php/includes/guestbook/" e criar um
novo arquivo chamado "setup.php". Em nosso ambiente de exemplo, "/php/includes" est<73> em nosso
include_path. Certifique-se de que voc<6F>
tamb<6D>m definiu isto, ou use caminhos de arquivos absolutos.
</para>
<example>
<title>Editando /php/includes/guestbook/setup.php</title>
<screen>
// l<> a biblioteca do Smarty
require('Smarty.class.php');
// O arquivo setup.php <20> uma boa forma para ler
// arquivos de bibliotecas da aplica<63><61>o exigida, e voc<6F> pode fazer
// isso corretamente aqui. Um exemplo:
// require('guestbook/guestbook.lib.php');
class Smarty_GuestBook extends Smarty {
function Smarty_GuestBook() {
// Construtor da Classe. Estes automaticamente s<>o definidos a cada nova inst<73>ncia.
$this->Smarty();
$this->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
$this->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
$this->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
$this->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';
$this->caching = true;
$this->assign('app_name','Guest Book');
}
}</screen>
</example>
<para>
Agora vamos alterar o arquivo index.php para usar o setup.php:
</para>
<example>
<title>Editando /web/www.mydomain.com/docs/guestbook/index.php</title>
<screen>
require('guestbook/setup.php');
$smarty = new Smarty_GuestBook;
$smarty->assign('nome','Taniel');
$smarty->display('index.tpl');</screen>
</example>
<para>
Agora voc<6F> ver que <20> completamente simples criar uma inst<73>ncia do Smarty, apenas use
Smarty_GuestBook que automaticamente inicializa tudo para a nossa aplica<63><61>o.
</para>
</sect1>
</chapter>
</part>

382
docs/pt_BR/html-common.dsl Normal file
View File

@@ -0,0 +1,382 @@
;; -*- Scheme -*-
;;
;; $Id$
;;
;; Returns the depth of the auto-generated TOC (table of contents) that
;; should be made at the nd-level
(define (toc-depth nd)
(if (string=? (gi nd) (normalize "book"))
3 ; the depth of the top-level TOC
1 ; the depth of all other TOCs
))
(element (funcdef function)
($bold-seq$
(make sequence
(process-children)
)
)
)
(define (is-true-optional nl)
(and (equal? (gi (parent nl)) (normalize "parameter"))
(equal? 0 (string-length (strip (data (preced nl)))))
(equal? 0 (string-length (strip (data (follow nl)))))
)
)
(define (has-true-optional nl)
(is-true-optional
(node-list-first-element
(select-elements
(descendants nl)
(normalize "optional"))
)
)
)
(define (count-true-optionals nl)
(let loop
((result 0)
(nl (select-elements (descendants nl) (normalize "optional")))
)
(if(node-list-empty? nl)
result
(if(is-true-optional(node-list-first nl))
(loop (+ result 1) (node-list-rest nl))
(loop result (node-list-rest nl))
)
)
)
)
;; there are two different kinds of optionals
;; optional parameters and optional parameter parts
;; an optional parameter is identified by an optional tag
;; with a parameter tag as its parent
;; and only whitespace between them
(element optional
;;check for true optional parameter
(if (is-true-optional (current-node))
;; yes - handle '[...]' in paramdef
(process-children-trim)
;; no - do '[...]' output
(make sequence
(literal %arg-choice-opt-open-str%)
(process-children-trim)
(literal %arg-choice-opt-close-str%)
)
)
)
;; now this is going to be tricky
(element paramdef
(make sequence
;; special treatment for first parameter in funcsynopsis
(if (equal? (child-number (current-node)) 1)
;; is first ?
(make sequence
;; start parameter list
(literal "(")
;; is optional ?
( if (has-true-optional (current-node))
(literal %arg-choice-opt-open-str%)
(empty-sosofo)
)
)
;; not first
(empty-sosofo)
)
;;
(process-children-trim)
;; special treatment for last parameter
(if (equal? (gi (ifollow (current-node))) (normalize "paramdef"))
;; more parameters will follow
(make sequence
;; next is optional ?
( if (has-true-optional (ifollow (current-node)))
;; optional
(make sequence
(literal " ")
(literal %arg-choice-opt-open-str%)
)
;; not optional
(empty-sosofo)
)
(literal ", " )
)
;; last parameter
(make sequence
(literal
(let loop ((result "")(count (count-true-optionals (parent (current-node)))))
(if (<= count 0)
result
(loop (string-append result %arg-choice-opt-close-str%)(- count 1))
)
)
)
( literal ")" )
)
)
)
)
(element function
(let* ((function-name (data (current-node)))
(linkend
(string-append
"function."
(string-replace
(string-replace function-name "_" "-")
"::" ".")))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
;; function names should be plain in FUNCDEF
((equal? parent-gi "funcdef")
(process-children))
;; if a valid ID for the target function is not found, or if the
;; FUNCTION tag is within the definition of the same function,
;; make it bold, add (), but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
function-name))
($bold-seq$
(make sequence
(process-children)
(literal "()"))))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-seq$
(make sequence
(process-children)
(literal
)
(literal "()"))))))))
(element command
(let* ((command-name (data (current-node)))
(linkend
(string-append
"language.function."
(string-replace
(string-replace command-name "_" ".")
"::" ".")))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
;; function names should be plain in FUNCDEF
((equal? parent-gi "funcdef")
(process-children))
;; if a valid ID for the target function is not found, or if the
;; FUNCTION tag is within the definition of the same function,
;; make it bold, add (), but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
command-name))
($bold-seq$
(make sequence
(literal "{")
(process-children)
(literal "}"))))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-seq$
(make sequence
(literal "{")
(process-children)
(literal "}"))))))))
(element classname
(let* ((class-name (data (current-node)))
(linkend
(string-append
"class."
(string-replace
(case-fold-down class-name) "_" "-")))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
;; function names should be plain in SYNOPSIS
((equal? parent-gi "synopsis")
(process-children))
;; if a valid ID for the target class is not found, or if the
;; CLASSNAME tag is within the definition of the same class,
;; make it bold, but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
class-name))
($bold-seq$
(process-children)))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-seq$
(process-children)))))))
(element constant
(let* ((constant-name (data (current-node)))
(linkend
(string-append "constant."
(case-fold-down
(string-replace constant-name "_" "-"))))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
; ;; constant names should be plain in FUNCDEF
; ((equal? parent-gi "funcdef")
; (process-children))
;; if a valid ID for the target constant is not found, or if the
;; CONSTANT tag is within the definition of the same constant,
;; make it bold, add (), but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
constant-name))
($bold-mono-seq$
(process-children)))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-mono-seq$
(process-children)))))))
(element example
(make sequence
(make element gi: "TABLE"
attributes: (list
(list "WIDTH" "100%")
(list "BORDER" "0")
(list "CELLPADDING" "0")
(list "CELLSPACING" "0")
(list "CLASS" "EXAMPLE"))
(make element gi: "TR"
(make element gi: "TD"
($formal-object$))))))
(element (paramdef parameter)
(make sequence
font-posture: 'italic
(process-children-trim)
)
)
(mode book-titlepage-recto-mode
(element authorgroup
(process-children))
(element author
(let ((author-name (author-string))
(author-affil (select-elements (children (current-node))
(normalize "affiliation"))))
(make sequence
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(literal author-name))
(process-node-list author-affil))))
)
(define (chunk-element-list)
(list (normalize "preface")
(normalize "chapter")
(normalize "appendix")
(normalize "article")
(normalize "glossary")
(normalize "bibliography")
(normalize "index")
(normalize "colophon")
(normalize "setindex")
(normalize "reference")
(normalize "refentry")
(normalize "part")
(normalize "sect1")
(normalize "sect2")
(normalize "section")
(normalize "book") ;; just in case nothing else matches...
(normalize "set") ;; sets are definitely chunks...
))
(define ($section-body$)
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
($section-separator$)
($section-title$)
(if (or (not (node-list-empty? (select-elements (children (current-node))
(normalize "sect2"))))
(not (node-list-empty? (select-elements (children (current-node))
(normalize "sect3")))))
(build-toc (current-node) 1)
(empty-sosofo))
(process-children)))

21
docs/pt_BR/html.dsl Normal file
View File

@@ -0,0 +1,21 @@
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets/html/docbook.dsl" CDATA DSSSL>
<!ENTITY html-common.dsl SYSTEM "html-common.dsl">
<!ENTITY common.dsl SYSTEM "common.dsl">
]>
<style-sheet>
<style-specification id="docbook-smarty-html" use="docbook">
<style-specification-body>
(define %html-ext% ".html")
&html-common.dsl;
&common.dsl;
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>

45
docs/pt_BR/manual.sgml Normal file
View File

@@ -0,0 +1,45 @@
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY preface SYSTEM "preface.sgml">
<!ENTITY getting.started SYSTEM "getting-started.sgml">
<!ENTITY smarty.for.designers SYSTEM "designers.sgml">
<!ENTITY smarty.for.programmers SYSTEM "programmers.sgml">
<!ENTITY appendixes SYSTEM "appendixes.sgml">
]>
<book id="index">
<bookinfo id="bookinfo">
<title>Smarty - a ferramenta para compilar templates para PHP</title>
<authorgroup id="authors">
<author>
<firstname>Monte</firstname><surname>Ohrt &lt;monte@ispi.net&gt;</surname>
</author>
<author>
<firstname>Andrei</firstname><surname>Zmievski &lt;andrei@php.net&gt;</surname>
</author>
</authorgroup>
<authorgroup id="translators">
<author>
<firstname>Fernando</firstname><surname>Correa da Concei<65><69>o &lt;fernandoc@php.net&gt;</surname>
</author>
<author>
<firstname>Marcelo</firstname><surname>Perreira Fonseca da Silva &lt;marcelo@php.net&gt;</surname>
</author>
<author>
<firstname>Taniel</firstname><surname>Franklin &lt;taniel@ig.com.br&gt;</surname>
</author>
<edition>Vers<72>o 2.0</edition>
<copyright>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<holder>ispi of Lincoln, Inc.</holder>
</copyright>
</bookinfo>
&preface;
&getting.started;
&smarty.for.designers;
&smarty.for.programmers;
&appendixes;
</book>

21
docs/pt_BR/php.dsl Normal file
View File

@@ -0,0 +1,21 @@
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets/html/docbook.dsl" CDATA DSSSL>
<!ENTITY html-common.dsl SYSTEM "html-common.dsl">
<!ENTITY common.dsl SYSTEM "common.dsl">
]>
<style-sheet>
<style-specification id="docbook-smarty-html" use="docbook">
<style-specification-body>
(define %html-ext% ".php")
&html-common.dsl;
&common.dsl;
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>

69
docs/pt_BR/preface.sgml Normal file
View File

@@ -0,0 +1,69 @@
<preface id="preface"><!-- En Version: 1.1 -->
<title>Pref<65>cio</title>
<para>
Esta <20> uma das d<>vidas mais frenquentes na "mailing list" do PHP:
Como eu posso fazer PHP scripts independentes do layout ? Enquanto
PHP est<73> contado como "HTML linguagem de blocos din<69>micos", ap<61>s estar
escrevendo alguns projetos que misturavam PHP e HTML livremente algu<67>m veio com a
id<69>ia que a separa<72><61>o do form e conte<74>do <20> uma boa pr<70>tica [TM]. Al<41>m disso,
em muitas empresas os pap<61>is de web designer e programador s<>o separados.
Consequentemente, a procura por
uma solu<6C><75>o de template continua.
</para>
<para>
Na minha pr<70>pria empresa por exemplo, o desenvolvimento de uma aplica<63><61>o
continua como segue: Ap<41>s a documenta<74><61>o necess<73>ria estar pronta, o web designer
faz a maquete da interface e entrega isso ao programador. O programador implementa
as regras de neg<65>cio no PHP e usa a maquete para criar o "esqueleto" do template.
O projeto est<73> ent<6E>o nas m<>os da pessoa respons<6E>vel pelo layout HTML designer/web page
que produz o template para sua gl<67>ria completa. O projeto deve ir e voltar
entre programa<6D><61>o/HTML v<>rias vezes. Desta maneira, <20> importante para ter
um bom suporte de template porque programadores n<>o querem fazer nada
com HTML e n<>o querem HTML designers fazendo besteiras no c<>digo PHP.
Designers precisam de suporte para arquivos de configura<72><61>o, blocos din<69>micos e
outras interfaces usadas, mas eles n<>o querem ocupar-se com
as complexidades da linguagem
de programa<6D><61>o PHP.
</para>
<para>
Olhando para muitas solu<6C><75>es de template para PHP dispon<6F>veis atualmente,
a maioria destes disponibiliza uma forma rudimentar de substitui<75><69>o de vari<72>veis
dentro de templates e fazem um form limitado de blocos din<69>micos de funcionalidades.
Mas minhas necessidades pr<70>prias requisitam um pouco mais do que isso.
N<>s n<>o queremos programadores mexendo com layout HTML em tudo, mas isso foi quase inevit<69>vel.
Por exemplo, se um designer quiser cores no background alternando-se em blocos din<69>micos,
isso tem que ser feito pelo programador antecipadamente. N<>s tamb<6D>m
precisamos que designers estejam habilitados a usar seus pr<70>prios arquivos de configura<72><61>o,
e colocar vari<72>veis deles dentro dos templates. A lista continua.
</para>
<para>
N<>s iniciamos escrevendo por acaso um template engine por volta de 1999.
Ap<41>s o t<>rmino, n<>s come<6D>amos a trabalhar num template engine
escrito em C que esperan<61>osamente foi aceito para ser incluso com PHP.
N<>s n<>o somente encontramos algumas complicadas barreiras t<>cnicas, mas
houve tamb<6D>m calorosos debates sobre exatamente o que um template engine devia
e n<>o devia fazer. Desta experi<72>ncia, n<>s decidimos que o template
engine deveria ser escrito em PHP como uma classe, para qualquer um usar da mesma forma
como eles v<>em. Ent<6E>o n<>s escrevemos um engine que o
<productname>SmartTemplate</productname> nunca veio a existir (note: essa
classe nunca foi enviada ao p<>blico). Ela foi uma classe que
fazia quase tudo que gostar<61>amos: substitui<75><69>o de vari<72>veis regular, suporte <20>
inclus<75>o de outros templates, integra<72><61>o com arquivos de configura<72><61>o, c<>digo PHP
embutido, funcionalidade 'if' limitada e muito mais blocos din<69>micos robustos
que poderia ser aninhados muitas vezes. Tudo isso com express<73>es regulares
e o c<>digo produzido ser<65> melhor, como n<>s diremos,
impenetr<74>vel. Isso era tamb<6D>m notoriamente lento em grandes aplica<63><61>es para todos
as interpreta<74><61>es e express<73>es regulares trabalhando em cada requisi<73><69>o.
O maior problema do ponto de vista de um programador foi toda a
necessidade de trabalhar no processamento de scripts PHP e processamento
de blocos din<69>micos de templates. Como n<>s fazemos isso facilmente?
</para>
<para>
Ent<6E>o vem a vis<69>o do que ultimamente virou a Smarty. N<>s sabemos qu<71>o r<>pido
<20> um c<>digo PHP sem o overhead da interpreta<74><61>o do template. N<>s tamb<6D>m sabemos
qu<71>o meticuloso e autorit<69>ria a linguagem PHP deve ser ao olhar de um designer,
e isso poderia ser mascarado com uma simples sintaxe de template.
Ent<6E>o o que acontece se n<>s combinarmos
estas duas for<6F>as? Desta maneira, Smarty nasceu...
</para>
</preface>

3275
docs/pt_BR/programmers.sgml Normal file

File diff suppressed because it is too large Load Diff