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