Introdução ao Smarty

877 views
800 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
877
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Bom dia a todos, O meu nome é Nelson Gomes, Estou a trabalhar no Sapo na parte de publicidade Sapo Ads, e quis hoje vir aqui hoje demonstrar-vos o que é o Smarty, para que serve e como se usa. Perguntas á audiência: 1. Quem daqui já usou PHP? 2. Quem daqui acha que sabe usar bem PHP? 3. Quem daqui já usou Smarty?
  • Na agenda para hoje temos Introdução O que é o Smarty, qual é o objectivo de usar Smarty, quem usa Smarty, comparação entre usar Smarty e não usar. Instalação Estrutura Directórios usada pelo Smarty, parametrização interna e tuning para ambientes de produção. Templates Como se usam templates smarty, tags smarty, variáveis. Configuração Não a configuração do Smarty, mas a componente de configuração do Smarty que permite guardar dados. Esta componente pode ser usada para gerar sites estáticos. Caching Usar a componente de caching do Smarty, para armazenar páginas ou partes de páginas. Segurança Usar o Smarty como forma de garantir que os conteúdos são seguros. Novidades Novidades no Smarty 3 Q&A Perguntas e questões
  • Para que servem e como o Smarty usa estas páginas? A pasta de templates tem todos os templates em uso no site; A pasta de templates compilados
  • Introdução ao Smarty

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

    ×