View
710
Download
2
Category
Preview:
Citation preview
Introdução ao Smarty
Sapo Sessions 2009Nelson Gomesnelson.gomes@co.sapo.ptZCE / ITIL V3 Foundation
Agenda
• Introdução• Instalação• Templates• Configuração• Debugging• MVC
• Caching• Segurança• Tuning• Novidades• Conclusão• Q&A
Introdução: o que é e para que serve?
• Motor de Templating para PHP.
• Permite separar a apresentação da lógica, facilitando a reutilização do código e das páginas.
• Fornece aos designers uma linguagem simplificada para trabalhar.
• Permite usar templates como funções (passar argumentos a um template).
• Fornece mecanismos de cache, display e de output.
Introdução: quem usa Smarty?
• Zend.• OpenX.• Xcart.• XOOPS CMS.• P4A – PHP for Applications.• PHPBugTracker.
• Se eles usam, alguma razão devem ter...
Introdução: comparativo entre usar e não usar Smarty?
• O OsCommerce é um MAU exemplo de como não se deve usar PHP (exemplo01.php).
• Vendem-se templates para OsCommerce, nos quais a lógica da aplicação é completamente subvertida.
• Tal subversão acontece porque não houve uma separação código-apresentação.
Conclusão: uma confusão!
Lógica e apresentação inutilizáveis.Código ilegível e de difícil manutenção.Não existe separação entre código e apresentação.(…) más práticas!É exactamente neste ponto que o Smarty dá o seu contributo!
Instalação: estrutura Smarty
• Uma instalação Smarty tem tipicamente, as seguintes pastas:
/templates – pasta de templates; /templates_c – pasta de templates compilados; /configs – pasta de configuração; /cache – pasta de cache; /plugins_dir – pasta de plugins.
• Todos estes defaults são modificáveis!
Instalação: estrutura Smarty
• Pastas como as de cache e de templates compilados necessitam de permissões de escrita para o Smarty funcionar.
• Para customizar as pastas: $smarty->template_dir = TEMPLATES_DIR; $smarty->compile_dir = COMPILE_DIR; $smarty->config_dir = CONFIG_DIR; $smarty->cache_dir = CACHE_DIR;
Templates: output do Template
• O 'Hello World' em Smarty (exemplo02.php).• Como alterar as pastas por defeito
(exemplo03.php).
• Output directo VS output controlado:
$smarty->display('helloworld.tpl'); echo $smarty->fetch('helloworld.tpl');
• Ter acesso ao output facilita a sua colocação em cache (FS, memcached, MySQL, ...).
Templates: variáveis Smarty
• Variáveis disponibilizadas pelo Smarty: (exemplo04.php):
{$smarty.now} {$smarty.const} – acesso a constantes PHP. {$smarty.capture} – variável com o conteúdo de um bloco
capturado {capture}{/capture}. {$smarty.conf} – iremos falar mais à frente. {$smarty.template} – template corrente.
{$smarty.get}, {$smarty.post}, {$smarty.request}, {$smarty.cookie}
{$smarty.env}, {$smarty.server}
Templates: passagem variáveis
• Passagem de variáveis a um template (exemplo04_1.php):
$smarty->assign('nome', $valor);
• Ao contrário das variáveis disponibilizadas pelo Smarty estas são acedidas directamente pelo nome.
• Podem ser passados tipos simples, arrays ou objectos.
Templates: funções
Funções em Smarty são representadas por tags Smarty, e facilitam tarefas frequentes. Têm argumentos como qualquer função.
• Podem ser adicionadas novas funções.{assign}, {counter}, {fetch}, {htmlimage}, {mailto}, {popup}, {math}, {mailto},(...)
{image file="/path/from/pumpkin.jpg"}{assign var="name" value="Bob"}{fetch file="http://www.weather.pt" assign="weather"}{math equation="(( x + y ) / z )" x=2 y=10 z=2}{mailto address="me@domain.com" encode="hex"}
Templates: modificadores
• Modificadores Smarty permitem transformar a apresentação dos dados.
• O Smarty tem um conjunto de modifiers substancial, sendo no entanto, expansíveis.
• Os modifiers são semelhantes aos pipes Unix, são concatenáveis e podem ter argumentos:
{“Exemplo Modifier”|lower|truncate:30|spacify}
{$number|string_format:"%.2f"}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
Templates: modifiers
• Alguns modifiers disponíveis:
capitalize (primeira maiúscula) count_caracters
count_caracters cat (concatena)
count_paragraphs count_sentences
count_words date_format
default (valor p defeito de uma var) escape
indent (indenta o texto) lower
nl2br regexp_replace
replace spacify
string_format strip
strip_tags truncate
upper wordwrap
Templates: novos modifiers
• Exemplo modifier.sapo.php:
<?php function smarty_modifier_sapo($string) { return str_replace('google','sapo', $string); } ?>
{“o google é o maior”|sapo}
• Basta colocá-los na pasta de plugins para ficarem disponíveis.
Configuração
• Ficheiros de configuração Smarty permitem usar conteúdos em larga escala.
• Podem ser usado para parametrizar páginas com conteúdos ou funcionalidades, mas pode também ser usado para conteúdos estáticos.
• Evitam a necessidade de ter uma base de dados.
• Os dados destes ficheiros são acessíveis dentro dos templates directamente:
{config_load} e {$smarty.conf} (exemplo06.php)
Templates – Funções Comuns
• Outras funções/tags usadas em Smarty
{* comentários *}
{literal}{/literal} {php} {/php} {if} {else} {/if} {foreach} {/foreach} {include} {configload} {includephp} {strip}{/strip}
Templates – {* comentários *}
• Quando compilados são removidos tornando o resultado final mais pequeno.
• São mais seguros que os comentários HTML que passam informação para o browser.
• Devem ser usados para documentar a implementação do template.
Templates – {literal}{/literal}
• Tags literal usadas para forçar o output de algo que pudesse ser confundido com tags Smarty (JS, CSS).
• Para incluir no output as próprias tags Smarty que de outra forma não seria possível.
• Para dizer ao Smarty para fazer o output sem parsing.
Templates – {php}{/php}
• Permitem a colocação de código PHP dentro dos templates.
• Deve evitar-se:o Código dentro dos templates;o Funções dentro de templates;o Manter a separação apresentação-lógica.
• Quando necessário pode-se extender o próprio Smarty:o Criando novas tags Smarty;o Acrescentando modifiers.
Templates – {if}{else}{/if}
• Permitem dar lógica aos templates de acordo com os dados:o Esconder conteúdos de acordo com a lógica de
negócio;o Mostrar conteúdos a utilizadores logados VS não
logados por exemplo:
{if $gender eq "male"} Exmo. Sr.
{else} Exma. Sra.
{/if}
Templates – {foreach}{/foreach}
• Permite iterar sobre arrays de dados;
• Pode ser recursivo (array de arrays);
{foreach from=$smarty.server item=arr key=nom} {foreach from=$arr item=valor key=nome} {$nome}={$valor}{/foreach}{/foreach}
• Pode ser um array de objectos.{$valor->getNome()}
Templates – {include}
• Permite incluir outros templates dentro do template.
• Permite a passagem de variáveis aos templates incluídos.
• Permite a inclusão de partes comuns a todas as páginas, facilitando a gestão da apresentação de um site (exemplo07.php).
{include file=”exemplo.tpl” title=”Exemplo de tabela” bgcolor=”#FF0000”}
Debugging
• O Smarty tem uma ferramenta de debug.
• Esta ferramenta de debug não é mais do que um... template (debug.tpl), que pode ser substituído por outro à medida.
• Como se usa (exemplo07.php)? $smarty->debugging=true;
• Podendo assim analisar de perto o que o Smarty está a fazer, e quanto tempo demorou a fazê-lo.
Model-View-Controller
• Pattern de desenvolvimento que tenta separar a lógica de negócio, os dados e a apresentação.
• Tem como objectivos principais:o a reutilização do código;o redução da complexidade subjacente.
• Smarty pode ser usado com Frameworks MVC para PHP:o Zend Framework, LightVC, Symfony, (...).
• Ou podemos simplesmente criar a nossa.
Smarty em MVC
• Processar o pedido Web (Model).
• Identificar o fluxo decorrente do processamento do pedido (Controller).
• Obter dados necessários à página a ser gerada.• Libertar a sessão.• Fazer o display da página (View).
Caching
• O Smarty por defeito não faz caching.
• A cache deve ser usada com bom senso:o Fazer caches muito pequenas não compensa;
o Páginas com dados pessoais não podem usar cache directamente, podem usar caches parciais;
o O TTL (time to live) da cache deve ser um compromisso sobre o tempo que é aceitável ter um conteúdo desactualizado.
Caching
• A cache é tão útil quanto maior for o número de acessos:o Sites com poucos hits pouco beneficiam da cache;
o O primeiro hit é o que gera a cache, logo o mais lento;
o No entanto, não há dúvidas que o uso de caches acelera a Internet e diminui a carga dos servidores;
o Podemos usar a cache Smarty (FS), ou usar mecanismos externos como memcached ou MySQL, que pode elevar o caching à farm inteira!
Caching
• Usar cache em Smarty:
$smarty->caching=true;$smarty->cache_lifetime=600;
• Ou na funções display, fetch:$smarty->display('template.tpl', 'keycache');
$smarty->fetch('template.tpl', 'keycache');
Segurança - Conteúdos
• O PHP é seguro! Os programadores é que não são...
o Input vindo do utilizador deve ser tratado como inseguro, SEMPRE.
o Alguns dos problemas segurança: Cross site scripting (injecção scripts). Colocação de Exploits no browser. Cross-site request forgery. Session Hijacking. Personal Data Harvesting. Phishing Attacks. E-mail Harvesting.
Segurança - Conteúdos
• Como pode o Smarty ajudar a resolver este tipo de problemas?o Ao fazer o html escaping de conteúdo nos
templates! (seguranca01.php); (html,htmlall,url,quotes,hex,hexentity,javascript)
$default_modifiers = array(’escape:"htmlall"’)
o Segurança por defeito!
o Evitam-se javascripts e outro tipo de surpresas inconvenientes...
Segurança - Conteúdos
• Como evitar a recolha de emails do site?
o Obfuscando os emails que aparecem nas páginas! (none, hex, javascript) (seguranca02.php)
o Deve-se usar sempre hex ou javascript! {mailto address="me@domain.com" encode="javascript"} {mailto address="me@domain.com"} {mailto address="me@domain.com" text="send me some mail"} {mailto address="me@domain.com" encode="javascript"} {mailto address="me@domain.com" encode="hex"} {mailto address="me@domain.com" subject="Hello!"}
Tuning Smarty
• Em ambientes de produção:o Usar cache ao máximo;o Desabilitar o compile_check do Smarty;o Usar o force_compile para regerar um template.
• Não abusar de {includes} Smarty, o filesystem é lento, seja qual o sistema que usemos!
• A pasta de cache deve ser limpa periodicamente, pois pode tornar-se factor de lentidão.
• Libertar a sessão ASAP, pois liberta outros requests PHP que estejam bloqueados a aguardar pela sessão (session_write_close).
Novidades
• Smarty 3 beta está a chegar:
o Melhorias de velocidade (2-5x em média);o Cache por template, variável e funções;o Smart JS/CSS (remoção necessidade {literal});o Herança de Templates;o In-template Functions;o {nocache}o Template Munging???o Melhorias na syntaxe dos Templates;o (...)
Conclusão
• Apenas vimos a ponta do potencial do Smarty.
• O Smarty não é a única ou a melhor solução existente, mas é uma boa ferramenta.
• Combinado com outras ferramentas existentes, permite criar soluções eficientes e robustas:o Log4php.o Doctrine ou outros ORM.o Frameworks MVC.o Engines CMS
• E especialmente é Open Source!!!
Q&A
Obrigado nelson.gomes@co.sapo.pt
Recommended