A maioria das pessoas que aprendem PHP começam, normalmente, a construir as suas aplicações Web de forma bastante rudimentar. Isto é normal, pois ao longo do tempo com que trabalham com PHP, os programadores vão-se habituando, aprendendo novas técnicas e desenvolvendo o seu próprio estilo de programar.
Este estilo desenvolvido reflecte-se maioritariamente na estrutura da aplicação desenvolvida. Isto porque cada aplicação tem as suas funcionalidades, e estas reflectem-se na necessidade de uma estrutura sólida capaz de suportar aplicações mais robustas, extensíveis e seguras. No entanto, há estruturas padrões e versáteis que são dadas como ideais para a construção de aplicações, e criam-se então frameworks capazes de tornarem estas estruturas disponíveis para qualquer programador construir qualquer aplicação sem se ter de preocupar muito com a estrutura base da aplicação.
Em PHP usam-se muitas aplicações que seguem a lógica do padrão de arquitectura de software MVC, que pretende separar a lógica do padrão da lógica de apresentação. Models e Views, tendo pelo meio os Controllers. Mas não é necessariamente obrigatório usar frameworks MVC nem sequer aplicar o padrão MVC para criar aplicações que separem a lógica da aplicação da lógica da apresentação. Cada programador pode criar a sua aplicação de modo a separar estas duas camadas, mas isso nem sempre é um trabalho fácil quando bem feito, e quando mal feito pode resultar no aparecimento de graves falhas na aplicação e de grandes quebras de performance. Assim sendo, porque não usar uma framework poderosa, robusta e simples de usar que já exista e nos simplifique o trabalho? É aqui que o Smarty entra.
Introdução
Neste pequeno artigo vamos usar a versão 3.0.7 do Smarty que pode ser descarregada aqui. Vamos também usar a versão 5.3.0 do PHP.
O Smarty permite-nos chamar determinados ficheiros e imprimi-los no ecrã, substituindo certos valores pelos obtidos e/ou gerados pela nossa aplicação, mostrando ao utilizador final, dados dinâmicos.
A diferença entre o método de templates em PHP ou Samrty é a mais fácil adaptação do visual da aplicação, sem que o designer tenha de saber a linguagem de programação (PHP) e tornando o template mais fácil de entender. Este método torna também pequenos pedaços de texto (possivelmente HTML) sejam reutilizados mais facilmente, evitando partes de código duplicadas na aplicação.
O Smarty não necessita de nenhuma configuração do sistema, tornando-o assim extremamente simples de instalar em qualquer Sistema Operativo, dado que os passos de instalação baseiam-se apenas na criação e edição de pastas e ficheiros.
Instalar o Smarty
Depois de termos feito o download da última versão do Smarty, descomprimimo-la e copiamos os ficheiros para uma pasta no nosso projecto (na raiz do projecto ou possivelmente numa pasta chamada smarty). Neste artigo usaremos uma pasta dentro do nosso projecto chamada smarty. Portanto, apenas temos de copiar os conteúdos da pasta libs para dentro da pasta smarty. Depois, no decorrer do desenvolvimento do nosso projecto apenas vamos ter de especificar a localização de certas pastas necessárias ao funcionamento do Smarty, tais como a pasta de cache e dos templates.
Primeiro Projecto em Smarty
Portanto, agora que temos os ficheiros que necessitamos, vamos começar a trabalhar com a biblioteca. Tudo gira à volta de uma classe, chamada Smarty, mas para isso necessitamos de incluir o ficheiro.
require('C:caminhoAbsolutoParaOProjectosmar tySmarty.class.php');
Depois necessitamos de instanciar a classe para uma variável, algo simples.
$smarty = new Smarty();
Agora só temos de definir alguns directórios, necessários para o funcionamento da biblioteca. Primeiro, vamos criar quatro pastas dentro da pasta smarty
: cache
, configs
, templates
, templates_c
. Depois adicionamos o seguinte código ao ficheiro.
//Define as pastas. O seu caminho deve ser absoluto. $smarty- >setTemplateDir('C:caminhoAbsolutoParaOProje ctosmartytemplates'); $smarty- >setCompileDir('C:caminhoAbsolutoParaOProjec tosmartytemplates_c'); $smarty- >setCacheDir('C:caminhoAbsolutoParaOProjecto smartycache'); $smarty- >setConfigDir('C:caminhoAbsolutoParaOProject osmartyconfigs');
Feito isto, podemos começar a usar o Smarty à vontade. Apesar de o Smarty ser muito bom, ele não adivinha os valores que a página vai ter, pelo que temos de ser nós a dar-lhos. Isto é bastante simples, apenas temos de chamar uma função e especificar o nome da variável que queremos substituir no template e o seu respectivo valor. Adicionemos então o seguinte código:
$smarty->assign("value", "Artigo de introdução ao Smarty");
Isto vai fazer com que as variáveis definidas no template com o nome value sejam substituídas pela respectiva string. Mas também é possível passar arrays. Para isso usamos a mesma função, a diferença estará no template.
$array = new Array( 1 => "Introdução ao Smarty", 2 => "Instalar o Smarty", 3 => "Primeiro Projecto em Smarty"); $smarty->assign("chapters", $array);
Depois apenas temos de mostrar o template formatado.
$smarty->display("index.tpl");
O ficheiro index.tpl
apenas terá de conter o seguinte texto:
<html> <head> <title>Smarty</title> </head> <body> <h1>{$value}</h1> <h2>Capítulos:</h2> <ul> {foreach $chapters as $chapter} <li>{$chapter}</li> {/foreach} </ul> </body> </html>
Sintaxe do Templates
A sintaxe usada na construção dos templates em Smarty é bastante simples e flexível, completamente abstraída da linguagem (PHP). Os ficheiros são HTML com pequenas partes específicas do Smarty. Para aumentar a performance da aplicação e evitar gastos de tempo desnecessários ao fazer parse dos ficheiros de template de cada vez que uma página é vista, o Smarty “compila” os templates para ficheiros PHP, aumentando assim drasticamente a performance. Quando um template é editado, o Smarty detecta-o e recompila o template, não sendo por isso necessária preocupação ao modificar os templates.
A sintaxe do Smarty é de tal maneira poderosa que é possível incluir lógica dentro dos templates, no entanto esta lógica deverá ser direccionada para a apresentação. Com isto pretendo dizer que a sintaxe do Smarty suporta excepções, ciclos, variáveis, includes e um sem-número de outras coisas fascinantes que não seriam possíveis de abordar apenas num artigo. Por isso, aqui vamos apenas abordar os aspectos mais importantes e mais comuns. Basicamente, com o Smarty, temos o HTML, no qual podemos adicionar as partes do código que serão interpretadas pelo motor. Estas partes do código estão, geralmente, entre chavetas ({
e }
), no entanto isto pode ser mudado. Para isso, basta-nos usar as seguintes linhas de código:
$smarty->left_delimiter = "({"; $smarty->right_delimiter = "})";
Podemos personalizar os delimitadores que quisermos. Os delimitadores servem para delimitar cada tag Smarty, pelo que cada tag Smarty imprime o valor de uma variável ou chama uma determinada função. Essa função pode ser interna, ou seja, definida pelo próprio Smarty, ou externa, definida por nós e criada através de plugins. Aqui vamos ver algumas das funções internas do Smarty, mas também algumas funções externas que vêm já definidas com o motor.
Variáveis
As variáveis são, provavelmente, a coisa mais simples, básica e necessária para o Smarty, pois elas são o método convencional e mais usado para introduzir dados no template, e consequentemente, mostra-los. As variáveis para o Smarty, no PHP, podem ser definidas usando a seguinte função.
$smarty->(“nome”, $conteudo);
A parte do nome é o nome que será usado no template para se referenciar à variável, enquanto que o conteúdo é aquilo que a variável vai conter. As variáveis podem ser simples, como strings e integers ou arrays e objectos. Quando a variável é uma simples string, para a mostrarmos no HTML, basta:
{$nome}
No entanto podemos querer usar arrays, e para isso teremos de usar funções como Smarty. Para imprimirmos objectos, é simples e bastante similar ao PHP.
{$name->someproperty} {$name->anothervar}
For
Muitas vezes podemos querer mostrar uma lista, ou algo cujo número de itens não é estático/previamente definido. Isso significa que temos de usar ciclos no próprio template para percorrer um array fornecido pelo script PHP. Para isso usamos o ciclo for
ou o foreach
. A sua sintaxe é a seguinte:
{for $index=1 to 20 max=3} - {$index}<br /> {forelse} Sem items. {/for}
Isto irá imprimir:
- 1<br /> - 2<br /> - 3<br />
O parâmetro max
é opcional, e o bloco do forelse
também. Este é mais importante quando temos valores dinâmicos no inicio e no fim do ciclo, pois estes podem ser nulos ou inválidos (o inicio ser maior que o fim).
Foreach
O foreach
é mais indicado quando o próprio PHP nos retorna um array. Este pode ou não ser associativo. Por exemplo, para imprimir um array associativo, definimos no PHP:
$utilizador = array('Nome Real' => 'Pedro Silva', 'Nickname' => 'Scorch', 'E-mail' => 'xpto@email.net'); $smarty->assign('utilizador', $utilizador);
Depois escrevemos o seguinte código no template:
{foreach $utilizador as $var} <b>{$var@key}:</b> {$var}<br /> {/foreach}
Isto irá imprimir:
<b>Nome Real:</b> Pedro Silva<br /> <b>Nickname:</b>Scorch<br /> <b>E-mail:</b>xpto@email.net<br />
A lógica é muito similar à do PHP.
If, Elseif e Else
Como não podia deixar de ser, o Smarty suporta estruturas condicionais. Uma vez que os templates são compilados para scripts PHP, estas estruturas são extremamente poderosas e muito similares às nativas do PHP. Este é um exemplo simples:
{if $var == '1'} Condição if verdadeira. {elseif $name == '2'} Condição elseif verdadeira. {else} É o que sobra. {/if}
Para uma lista completa de exemplos e das propriedades da estrutura condicional, podem visitar aqui.
Cycle
Esta é uma função muito útil que permite obter valores de forma cíclica. Por exemplo, temos um ciclo for com 10 iterações, e temos uma função cycle
com 3 valores, por exemplo: Um, Dois e Três, ou seja, ele vai obter os valores pela seguinte ordem: Um Dois Três Um Dois Três Um Dois Três Um
. Mas vamos ver um exemplo.
{for $index=1 to 20 max=3} - {cycle name="ciclo_1" values="Um,Dois,Três"} <br /> {/for}
O parâmetro name
é opcional, e permite-nos ter mais que um ciclo ao mesmo tempo. O parâmetro values
deve conter os valores a percorrer, separados por vírgulas e sem espaços. Apesar da vírgula ser o valor por defeito, pode-se sempre definir um separador através do parâmetro delimiter
. O conjunto de todos os parâmetros pode ser visto aqui.
Esta função é particularmente interessante quando imprimimos os dados numa tabela ou noutra forma qualquer de listagem, e queremos que a cor de fundo, por exemplo, mude ciclicamente em cada item. Por exemplo, o primeiro ficará branco, o segundo cinzento, o terceiro branco e o quarto cinzento, até ao fim da lista.
Conclusão
Smarty é um sistema de templates em PHP, que permite uma variedade enorme de funcionalidades e tem uma grande performance, uma vez que os templates são convertidos para código PHP. A lista completa de funções e documentação pode ser encontrada aqui, em Inglês.