Quarta-feira, 04 de Janeiro, 2006 | 35 comentários | 
Quando se descobre o Smarty, é quase inviável viver sem ele. Neste artigo, mostro o seu funcionamento e exemplos do uso de métodos. Você notará um ganho de produtividade geral no desenvolvimento de aplicações.
O Smarty é uma classe de templates. Funciona de uma forma que separe interface da lógica de programação e tem por objetivo, facilitar e melhorar o desenvolvimento de qualquer aplicação em PHP.
Por ser muito difundido no mundo inteiro, e estar ligado ao site oficial do PHP, o Smarty tem uma comunidade grande de desenvolvedores. Isso ajuda no suporte e discussão de melhorias.
A sua última versão (até a escrita deste artigo) é a 2.6.11 (changelog), lançada em Dezembro de 2005.
Além das funcionalidades que comentei no post anterior (Como desenvolvedor melhor na Web), listo outras:
[update] Faça o download do Smarty. Descomprima todas as pastas. Verifique uma pasta "demo", é uma demonstração do funcionamento dele. Coloque a pasta "libs" dentro do "demo". No final você vai ter uma organização de diretórios, igual descrita abaixo. Não esqueça de dar permissão ao diretório "templates_c".
A árvore padrão de diretório do Smarty está organizada da seguinte maneira:
Esta arquitetura pode ser alterada pelo usuário, lembrando que, depois de alterado os nomes, você deverá modificar algumas linhas do Smarty.class.php (classe principal):
Smarty.class.php:
var $template_dir = 'templates'; var $compile_dir = 'templates_c'; var $config_dir = 'configs';
Programar usando Smarty é ainda mais simples. Todo arquivo PHP deve apontar pra um template. O acesso a banco de dados, críticas mais complexas, e outras lógicas ficam no arquivo PHP (como antes). O que muda aqui é a simplicidade da sintaxe dos templates, facilitando mudanças no futuro pelo Designer ou Programador: cada um altera seu arquivo.
Como o tópico sugere, vou direto ao assunto. Vejam um exemplo muito simples do uso dos templates no Smarty.
index.php:
<?php
/**
* Define a pasta onde está o Smarty
* esta constante pode ficar em arquivo separado por exemplo
*/
define('PATH_SMARTY', '/path/to/smarty');
/**
* Inclui classe principal do Smarty
*/
require PATH_SMARTY.'/Smarty.class.php';
/**
* Instancia Smarty e seta propriedades
*
* compile_check = avisa ao Smarty para mostrar erros de compilação
* debugging = em fase de desenvolvimento é bom deixar como true,
* uma vez que abre um popup com todas as informações da página gerada
*/
$smarty = new Smarty;
$smarty->compile_check = true;
$smarty->debugging = false;
/**
* Assign é um metodo do Smarty para criar uma
* nova variavel que será usada no Template
*
* sintaxe: assign->('nome_variavel', 'valor');
*/
$smarty->assign('nome', 'Ciro');
$smarty->assign('sobrenome', 'Feitosa');
/**
* Mostra o Template na tela
* observe que até aqui nada foi exibido, só processado
*/
$smarty->display('index.tpl');
?>
index.tpl:
{config_load file=test.conf}
<html>
<body>
{$nome} {$sobrenome}
</body>
</html>
Ao rodar o index.php pela primeira vez, automaticamente o Smarty criará um cache do conteúdo gerado no diretório /templates_c.
Neste exemplo simplérrimo, deu pra perceber quão simples é a sintaxe utilizada pelo Smarty não é?! Apresentarei agora, métodos que deverão ser usados nos arquivos de templates.
A variável reservada $smarty, traz opções de tratar as informações vindas pelo método GET, POST, ou por Cookies, Sessions, etc. Veja exemplos de chamadas:
{* mostra o valor de page da URL (GET) http://www.domain.com/index.php?page=foo *}
{$smarty.get.page}
{* mostra a variável "page" de um formulário (POST) *}
{$smarty.post.page}
{* mostra o valor do cookie "username" *}
{$smarty.cookies.username}
{* mostra a variável do servidor "SERVER_NAME" *}
{$smarty.server.SERVER_NAME}
{* mostra a variável de ambiente do sistema "PATH" *}
{$smarty.env.PATH}
{* mostra a variável de session do php "id" *}
{$smarty.session.id}
{* mostra a variável "username" da união de get/post/cookies/server/env *}
{$smarty.request.username}
Assim, na chamada dos formulários você deve inserir no campo value: $smarty.post.nome_do_campo. Exemplo:
formulario.tpl:
Nome: <input type="text" name="nome" value="{$smarty.post.nome}" /><br />
Estado: <select name="estado">{html_options options=$estados selected=$smarty.post.estado}</select>
A documentação do Smarty é excelente. Portanto, não tentarei reexplicar o que já existe, mas mostrar rapidamente funções úteis no dia-a-dia.
Para ajudar no entendimento, usarei formulários. Acredito que este seja o uso em que mais ajuda, quando você usa Smarty. Pressupõe que você já tenha incluído a classe do Smarty e instanciado (reveja o exemplo no tópico "Mãos à obra"). Não observem validações de código xHTML, pois não é a idéia central aqui.
São usadas, principalmente, para se modificar uma string. Funções do tipo capitalizar, contar caracteres, contar parágrafos, mudar para maiúsculas, indentar linhas, etc.
Veja um exemplo da função cat, que funciona concatenando 2 strings (veja todas as funções modificadoras de variável).
index.tpl:
<html>
<body>
{$nome|cat:" é o dono deste Blog."}
</body>
</html>
São funções utilizadas internamente pelos templates. Laços (loops), condicionais (if, else), inclusões (includes). Veja a lista completa de funções internas.
As funções condicionais, assim como em qualquer linguagem, são utilizadas quando se tem uma condição. Imagine que você possui um sistema com login feito em sessão. Se o usuário tiver logado, mostra o nome dele, caso contrário, mostra "Visitante". Veja como fazer isso usando os templates do Smarty:
{if $smarty.session.nome != ''}
{$smarty.session.nome}
{else}
Visitante
{/if}
Foram criadas afim de se criar de forma automatizada, alguns trabalhos repetitivos. Em se tratando de formulários, é possível gerar checkboxes, menus drop-downs, radios, e menus drop-downs de data e hora, tudo isso podendo vir de um array estático ou dinâmico (preenchido via banco de dados, por exemplo).
Imagine que você tenha um array com os estados brasileiros (num arquivo .PHP) e deseja gerar um menu drop-down na tela. Use o método html_options. Além desta, existe dezenas de funções personalizadas.
formulario.php:
$arrayEstados = array(
'AC' => 'Acre',
'AL' => 'Alagoas',
'AM' => 'Amazonas',
'AP' => 'Amapá',
'BA' => 'Bahia',
'CE' => 'Ceará',
'DF' => 'Distrito Federal',
'ES' => 'Espírito Santo',
'GO' => 'Goiás',
'MA' => 'Maranhão',
'MG' => 'Minas Gerais',
'MS' => 'Mato Grosso do Sul',
'MT' => 'Mato Grosso',
'PA' => 'Pará',
'PB' => 'Paraíba',
'PE' => 'Pernambuco',
'PI' => 'Piauí',
'PR' => 'Paraná',
'RJ' => 'Rio de Janeiro',
'RN' => 'Rio Grande do Norte',
'RO' => 'Rondônia',
'RR' => 'Roraima',
'RS' => 'Rio Grande do Sul',
'SC' => 'Santa Catarina',
'SE' => 'Sergipe',
'SP' => 'São Paulo',
'TO' => 'Tocantins'
);
$smarty->assign('estados',$arrayEstados);
$smarty->display('formulario.tpl');
formulario.tpl:
<html>
<body>
<select name="estado">{html_options options=$estados}</select>
</body>
</html>
É notável o aumento da produtividade utilizando este sistema de templates. Além do mais, quando se trabalha em equipe, Designer e Programador com funções distintas, e neste caso, trabalhando juntos. Se o Designer quiser alterar um label de um campo do formulário, por exemplo, só precisará mexer no template.
Para maiores informações, por favor visite o site oficial do Smarty.
Nossa, que coincidência, estava procurando ontem mesmo sobre esse assunto, rs.
Excelente artigo para quem estava curioso, como eu. Servirá como base para começar a fuçar neste universo. Gostei mesmo, parabéns Ciro.
Só fiquei um pouco em dúvida sobre instalação do smarty: é só unzipar e pronto, correto?
Se futuramente vc puder colocar alguns exemplos mais complexos e ousados, seria muito interessante!!!
Abraço amigo! Valew
Cara... Perfeito isso ae hein. Não li tudo ainda, to escrevendo umas paradas aqui, mas já favoritei para ler isso... Parece ser muito interessante... To começando a me interessar pela parte de desenvolvimento...
Parabéns ae Ciro... Aquele abraço
Felipe,
Fiz um update no post, e acrescentei informações sobre a instalação. É super simples.
Abraço!
Parabéns pelo artigo, bastante didático e motivador.
Felicidades em 2006!
Foz do Iguaçu-PR
Oi Ciro,
Achei 2 errinhos/faltas no seu post:
1) Estrutura de diretórios
Os diretório templates,configs e templates_c devem ser criados para cada aplicação/site pois se deixar em um lugar único terá de separar os arquivos qdo for implementar o site de cada cliente (no caso de vários clientes).
2) Arquivo index.tpl
Na primeira linha deste arquivo existe uma chamada ao arquivo conf, que você não postou, nem onde ele deve ser gravado (pasta configs).
O uso do arquivo conf é opcional, mas ao não utilizar retirar chamada da primeira linha do arquivo index.tpl.
Envio esta mensagem só pra ajudar minimamente neste tutorial que está muito bom.
Alberto
Alberto,
Bem interessante sua observação.
Mas eu preferi omitir, pra tornar ainda mais fácil de entender.
Abraço!
Sinceramente eu não gosto do Smarty.
É fantástico o ganho de produtividade com smarty. Eu o descobri quando comecei a trabalhar com o cms Xoops que usa e abusa de smarty na programação de todos os módulos e temas. Realmente fantástico. Quem quiser dar uma lida pode baixar um pdf em inglês (http://xoops-tips.com/xoopsfiles/smarty-xoops.pdf).
Até mesmo em aplicações ou sites pequenos uso o smarty, facilita bastante, quando comecei a trabalhar com essa ferramenta, mudei até o meu modo de programação.. e cada dia q passa descubro coisas novas com isso.. relamente é útil..
Eu estou tentando criar um grafico on-line, ha cada 30 min atualiza informações no banco de dados e plota a informação no gráfico.
Eu estou filtrando as informações pelo Indice(\"que é uma informação que eu criei) e pela hora.
se o indice for >=2 eu tenho que validar de que horário ele está rodando.
Alguem poderia me dar uma força?
include (\"jpgraph-1.20.3/jpgraph-1.20.3/src/jpgraph.php\");
include (\"jpgraph-1.20.3/jpgraph-1.20.3/src/jpgraph_bar.php\");
//conexão Banco de Dados
$hostname=\"localhost\";
$database=\"ozonio\";
$username=\"root\";
$password=\" \";
$con= mysql_connect($hostname,$username);
$arq=\"DUV\";
$dia=\'061\';
$ano=\'06\';
$eqp=\'056\';
$file=$arq.$dia.$ano.\".\".$eqp;
//ABRE O ARQUIVO TXT
$ponteiro = fopen (\"C:\\Arquivos de programas\\EasyPHP1-8\\www\\duv.txt\", \"r\");
//LÊ O ARQUIVO ATÉ CHEGAR AO FIM
while (!feof ($ponteiro)) {
//LÊ UMA LINHA DO ARQUIVO
$linha = fgets($ponteiro, 4096);
//IMPRIME NA TELA O RESULTADO
// echo $linha.\"\";
$parte = explode(\' \',$linha);
for ($i=0; $i= 01 && $Rond = 30 && $Rond yaxis->scale->SetGrace(10);
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
$b1plot = new BarPlot($data0);
$b1plot->SetFillColor(\"green\");
$ab1plot = new AccBarPlot(array($b1plot));
$b2plot = new BarPlot($data1);
$b2plot->SetFillColor(\"yellow\");
$ab2plot = new AccBarPlot(array($b2plot));
$b3plot = new BarPlot($data2);
$b3plot->SetFillColor(\"orange\");
$ab3plot = new AccBarPlot(array($b3plot));
$b4plot = new BarPlot($data3);
$b4plot->SetFillColor(\"red\");
$ab4plot = new AccBarPlot(array($b4plot));
$b5plot = new BarPlot($data4);
$b5plot->SetFillColor(\"blue\");
$ab5plot = new AccBarPlot(array($b5plot));
$b6plot = new BarPlot($data5);
$b6plot->SetFillColor(\"black\");
$ab6plot = new AccBarPlot(array($b6plot));
/// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($ab1plot,$ab2plot,$b3plot,$b4plot,$ab5plot,$ab6plot));
// ...and add it to the graph
$graph->Add($gbplot);
$graph->title->Set(\"Laboratório de Ozônio\");
$graph->xaxis->title->Set(\"Horas\");
$graph->yaxis->title->Set(\"Indice\");
$graph->xaxis->SetTickLabels($datax);
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
}
}
}
fclose ($ponteiro);
?>
Trabalho ja a algum tempo com smarty e tenho varios sistemas que o usam.
Porem no momento estou passando uma loja virtual em PHP comum para smarty e existe uma página administrativa muito complexa, ao aplicar o smarty percebi que o template ficou tao complexo qto a pagina PHP, cheio de IFs Loops etc.
Queria saber se neste caso mesmo assim é viavel o uso do smarty, pois apesar de separar a programação complexa (como acesso a banco, regsitro de sessions etc) a página HTML (template) ficou muito complexa, e um designer comum não a entenderia, nao viabiizando a divisao do trabalho entre programador / designer.
Mesmo assim é aconselhavel o uso do smarty?
[]s
@Fabio: Neste caso, você pode inserir as lógicas (IFs, ELSEs, etc.) no seu PHP e adicionar o resultado à uma variável do smarty (método assign). Assim, o designer só precisaria imprimir uma única variável na tela.
Certo ....
Fiz exatamente assim como voce disse, mas a estrutura da página é muito complexa, tenho que repetir TDs e TRs, aparecer buttons, forms e textbox de acordo com o numero de resultados, posso ate guardar a quantidade de loops em uma variavel e assign p o smarty template, mas mesmo assim terei de usar muitos loops e Ifs, para escrever as celulas da table, escrever os forms (se for para escrever), setar links e chamadas a JS em buttons (que a quantidade eh dinamica) ... estou quase concluindo esta página, porem ela ficou complexa para um simples designer.
Trabalho ha 1 ano com smarty, tenho muitas aplicacoes, inclusive ja converti toda loja virtual para o smarty, falta apenas esta página que trada todos os niveis da compra, realmente é muito complexa.
Mas valeu a força, acho que para estruturas muito complexas a essencia do smarty não condiz.
[]s
Ciro,
Resolvi meu problema.
Como voce naum pode me ajudar, resolvi postar aqui para as pessoas que usam ou usarao smarty em suas aplicacoes PHP complexas, visto que o Smarty é realmente o que há de bom !!!
Depois de muito estudo, descobri que para resolver meu problema deveria criar arrays para apresentar dados de quantidade dinamica, sendo que no template uso sections gigantescos sem comprometer o serviço do designer.
E mesmo usando as logicas IF ELSE mais complexas no PHP, tive que usar alguns IFs ELSEs no template, mas de forma limitada, sem comprometer a interface do template, fazendo assim com que o designer nao se confunda ao abrir um template (no meu caso nao uso TPL e sim HTML)
Quem se interessar nos codigos entre em contato comigo em pvt no email buganca@gmail.com
Vlwww
Tentei falar com meu host para instalar o Smarty no servidor e eles falaram que não tem como, por causa da segurança.
complicado.
abraços
Esse smarty facilita muito a programação além de permitir uma melhor organizacao da codificacao
Pq O Smarty sempre gera um Session Id em todos os Arquivos... tenho Um Formulário que logo apos o fechamentod a abertura ta tag ele adiciona um input Hidden contendo a session IDque faz com que meu formulário não passe na W3c, alguem sabe como desligar isso?
@ Rene:
Sobre o assunto, isso não está relacionado ao Smarty, mas ao PHP mesmo. Nas configurações do PHP você consegue definir se quer que mostre o ID da sessão criada ou não. Assim, se estiver num form, por exemplo, sempre vai criar o campo hidden PHPSESSID (se estiver setado pra criar).
mto legal hem cara...
Necessito de uma ajuda dos senhores usuários do Smarty.
Pelo que entendi, esta ferramenta é para ser usada pelos desenvolvedores em seu respectivo ambiente e não deve ser colocada no site de um provedor de hospedagem. Certo ?
Me corrijam se eu estiver errado.
Bom dia Ciro Feitosa. Estou tentando instalar o Smarty e não estou conseguindo. Segui os passos acima. Estou trabalhando com o pacote. EASY1-7.
E ai Ciro, blz ?
Legal seu artigo, mas gostaria que você explicasse quando é ou não vantagem de se usar o Smarty e Acoplar a aplicação aos objetos existentes em uma aplicação.
Aguardo sua resposta
Wellington Rodrigues
http://desenvolvendosites.com
opa ciro... firme?
me ocorreu a seguinte dúvida...
se eu tiver vários arquivos de template (.tpl) que formam o layout...?
eu fiz um pequeno teste aqui e o meu arquivo index que chama os templates soh pega o primeiro arquivo de template que eu chamo quando eu dou o $smarty->display(\\\'arquivo.tpl)... ou seja mais ou menos assim...
$smarty->display(\\\'index.tpl\\\'); (que vai montar meu layout) (soh esse pega as variaveis do smarty)
$smarty->display(\\\'menu.tpl\\\');
$smarty->display(\\\'conteudo.tpl\\\');
$smarty->display(\\\'cabecalho.tpl\\\');
$smarty->display(\\\'rodape.tpl\\\');
como eh que vou jogar os dados do meu bd no menu, conteudo, cabecalho e rodape....
valeu... agradeço qquer ajuda...
eduardo.
Muito interessante esse tal de Smarty
![]()
É um bom artigo Ciro, ensina que caminhos seguir para aprender a usar Smarty.
Um abraço,
Elaine.
Primeiramente parabéns pelo artigo que está muito bom.
Minha dúvida é a seguinte, como trabalhar com Smarty+Ajax, é possível, existe um framework pronto?
Valeu
Como fazer while dentro de while com smarty?
tentei de tudo.....
Olá ciro mais uma vez... desculpa cara, mas tu é a unica pessoa que responde minhas duvidas sobre Smarty....
Seguinte, poistei ni Imasters uma duvida minha bem detalhada, Trata-se de While dentro de While, e no template Sections dentro de sections...
Como voce sugeriu não funcionou...
Segue o POST
http://forum.imasters.com.br/index.php?showtopic=213700
Ciro, tenho uma pergunta que me intriga a muito tempo.
Quando estou trabalhando como designer e vou criar um template, utilizo muito imagens. Coloco elas utilizando o dreamweaver, de forma que eu possa visualizar como ficou.
Porem quando vou utilizar o template, ele não encontra a imagem, pois essa está na pasta do template. E incrivelmente, o path da imagem assume o path da pagina php e não do template.
Como posso resolver isso, para visualizar a imagem no template utilizando o dreamweaver e para que a pagina php busque a imagem no path do template e não no path da pagina php?
Muito obrigado Ciro
ciro, to com uma baita dor de cabeca aqui por causa do smarty...rsrsr
eh q eu tenho q passar um array de smarty pra um array de javascript....
assim.....tenho la meu array {$nome_menu} isso eh um array de strings,....
so que eu nao consigo passar isso pra um js....
fiz assim...
var i = 0;
var menu = new Array(50);
for (var i=0; i< {$size}; i++)
menu[i]= \\\'{$nome_menu[i]}\\\';
so que essa variavel \\\'i\\\' em nome_menu nao funciona....so funciona se eu colocar uma constante ai....
pode me dar uma maozinha????
vlw
ademir
ciro tu ja fez uso do code -igniter ou cake para ver quem e quem junto com smart ???
eu to usando code igniter achei bem legal
mais boa materia meu velho
kakaroto
http://www.obsidian.com.br
ciro, eu gostaria de saber se há como utilizar o smarty juntamente com o jpgraph, tenho q fazer um aplicativo aqui, busco os dados de um banco, informacoes sobre quantidade de ligacoes por dia, so com o jpgraph e com php eu consigo fazer numa boa....o problema comeca quando eu tenho q mandar isso pro template....
existe alguma forma de se fazer isso com jpgraph ????
abraços
ademir
Olá Ciro, blz?
Kra, sua matéria sobre Smarty é muito interessante, gostaria de convidá-lo a fazer um cadastro no meu site e publicar suas dicas lá tb, o site é http://www.websapiens.net
Um abraço,
Diego Soares
Ciro,
Parabéns por este artigo e também pela grande ajuda que está prestando a comunidade de programadores PHP. Vejo no Smarty um grande ganho de produtividade sim, embora ainda não me acostumei a utilizá-lo sempre.
Meu post aqui é somente para te parabenizar!!!!
Conte comigo amigo!
Bacana esse seu artigo. Venho primeiramente agradecer pela força. Sou iniciante e fiz toda instalação usando MDB2 ao invés de DB. Mas após colocar a estrutura do smarty, ocorre este erro: Fatal error: Smarty error: the $compile_dir \\\'templates_c\\\' does not exist, or is not a directory. in C:\\\\Arquivos de programas\\\\EasyPHP 2.0b1\\\\www\\\\demo\\\\libs\\\\Smarty.class.php on line 1095.
Mas eu criei a pasta templates_c na pasta demo. Não entendi. Se puder me ajudar.
Aí, Marcelo, pra mim tava dando esse erro também.
É que eu copiei o exemplo do manual, e esqueci de substituir o caminho nas variáveis... saca como eram as linhas do exemplo:
$smarty->template_dir = \'d:/inetpub/wwwroot/smarty/templates\';
$smarty->config_dir = \' d:/inetpub/wwwroot/smarty/config\';
$smarty->cache_dir = \'d:/smarty/smarty_cache\';
$smarty->compile_dir = \'d:/smarty/smarty_templates_c\';
E SACA COMO ELAS FICARAM (pra mim... veja aí como deve ser pra você)
$smarty->template_dir = \'C:\\Arquivos de programas\\EasyPHP1-8\\www\\hunter\\smarty\\templates\';
$smarty->config_dir = \'C:\\Arquivos de programas\\EasyPHP1-8\\www\\hunter\\smarty\\config\';
$smarty->cache_dir = \'C:\\Arquivos de programas\\EasyPHP1-8\\smarty\\cache\';
$smarty->compile_dir = \'C:\\Arquivos de programas\\EasyPHP1-8\\smarty\\templates_c\';
Espero que funcione pra você.
Me bati na net e não achei resposta. Acabei de perceber o erro, depois de algumas horas marcando bobeira
Abraços.
Charles.
As imagens que aparecem são Gravatars. Ao registrar um, sempre que comentar em algum blog que suporte essa funcionalidade, sua imagem aparecerá ao lado. Se você ainda não tem um gravatar, crie aqui.
English Version © Copyright 2004-2008 Ciro Feitosa - Todos os Direitos Reservados