Iniciando O 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 embutido Fontes de template arbitrárias Funções de manipulação de cache customizadas Arquitetura de Plugin Instalação Requerimentos 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.