mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-04 18:34:27 +02:00
add portuguese docs
This commit is contained in:
1
NEWS
1
NEWS
@@ -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
404
docs/pt_BR/appendixes.sgml
Normal 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 & 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 "&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 &nbsp; quando uma vari<72>vel est<73> vazia</title>
|
||||
<programlisting>
|
||||
|
||||
{* A forma mais longa *}
|
||||
|
||||
{if $title eq ""}
|
||||
&nbsp;
|
||||
{else}
|
||||
{$title}
|
||||
{/if}
|
||||
|
||||
|
||||
{* A forma mais simples *}
|
||||
|
||||
{$title|default:"&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
|
||||
----------
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>{$titulo|default:"BC News"}</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
|
||||
footer.tpl
|
||||
----------
|
||||
</BODY>
|
||||
</HTML></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 < $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"}
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
|
||||
|
||||
<!-- begin new wml deck -->
|
||||
<wml>
|
||||
<!-- begin first card -->
|
||||
<card>
|
||||
<do type="accept">
|
||||
<go href="#two"/>
|
||||
</do>
|
||||
<p>
|
||||
Bem-vindo ao WAP com Smarty!
|
||||
Pressione OK para continuar...
|
||||
</p>
|
||||
</card>
|
||||
<!-- begin second card -->
|
||||
<card id="two">
|
||||
<p>
|
||||
Bem f<>cil isso, n<>o <20>?
|
||||
</p>
|
||||
</card>
|
||||
</wml></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 & 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,&$ticker_name,&$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
|
||||
---------------
|
||||
|
||||
<?php
|
||||
// configura nossa fun<75><6E>o para buscar os dados armazenados
|
||||
function fetch_ticker($symbol,&$ticker_name,&$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);
|
||||
?>
|
||||
|
||||
|
||||
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&r=1&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
46
docs/pt_BR/common.dsl
Normal 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
5882
docs/pt_BR/designers.sgml
Normal file
File diff suppressed because it is too large
Load Diff
398
docs/pt_BR/getting-started.sgml
Normal file
398
docs/pt_BR/getting-started.sgml
Normal 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
|
||||
{}, {{}}, <!--{}-->, 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
382
docs/pt_BR/html-common.dsl
Normal 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
21
docs/pt_BR/html.dsl
Normal 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
45
docs/pt_BR/manual.sgml
Normal 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 <monte@ispi.net></surname>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Andrei</firstname><surname>Zmievski <andrei@php.net></surname>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<authorgroup id="translators">
|
||||
<author>
|
||||
<firstname>Fernando</firstname><surname>Correa da Concei<65><69>o <fernandoc@php.net></surname>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Marcelo</firstname><surname>Perreira Fonseca da Silva <marcelo@php.net></surname>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Taniel</firstname><surname>Franklin <taniel@ig.com.br></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
21
docs/pt_BR/php.dsl
Normal 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
69
docs/pt_BR/preface.sgml
Normal 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
3275
docs/pt_BR/programmers.sgml
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user