Introdução ao Smarty

36
Introdução ao Smarty Sapo Sessions 2009 Nelson Gomes [email protected] ZCE / ITIL V3 Foundation

Transcript of Introdução ao Smarty

Page 1: Introdução ao Smarty

Introdução ao Smarty

Sapo Sessions 2009Nelson [email protected] / ITIL V3 Foundation

Page 2: Introdução ao Smarty

Agenda

• Introdução• Instalação• Templates• Configuração• Debugging• MVC

• Caching• Segurança• Tuning• Novidades• Conclusão• Q&A

Page 3: Introdução ao Smarty

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.

Page 4: Introdução ao Smarty

Introdução: quem usa Smarty?

• Zend.• OpenX.• Xcart.• XOOPS CMS.• P4A – PHP for Applications.• PHPBugTracker.

• Se eles usam, alguma razão devem ter...

Page 5: Introdução ao Smarty

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.

Page 6: Introdução ao Smarty

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!

Page 7: Introdução ao Smarty

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!

Page 8: Introdução ao Smarty

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;

Page 9: Introdução ao Smarty

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, ...).

Page 10: Introdução ao Smarty

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}

Page 11: Introdução ao Smarty

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.

Page 12: Introdução ao Smarty

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="[email protected]" encode="hex"}

Page 13: Introdução ao Smarty

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"}

Page 14: Introdução ao Smarty

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

Page 15: Introdução ao Smarty

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.

Page 16: Introdução ao Smarty

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)

Page 17: Introdução ao Smarty

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}

Page 18: Introdução ao Smarty

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.

Page 19: Introdução ao Smarty

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.

Page 20: Introdução ao Smarty

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.

Page 21: Introdução ao Smarty

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}

Page 22: Introdução ao Smarty

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()}

Page 23: Introdução ao Smarty

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”}

Page 24: Introdução ao Smarty

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.

Page 25: Introdução ao Smarty

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.

Page 26: Introdução ao Smarty

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).

Page 27: Introdução ao Smarty

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.

Page 28: Introdução ao Smarty

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!

Page 29: Introdução ao Smarty

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');

Page 30: Introdução ao Smarty

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.

Page 31: Introdução ao Smarty

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...

Page 32: Introdução ao Smarty

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="[email protected]" encode="javascript"} {mailto address="[email protected]"} {mailto address="[email protected]" text="send me some mail"} {mailto address="[email protected]" encode="javascript"} {mailto address="[email protected]" encode="hex"} {mailto address="[email protected]" subject="Hello!"}

Page 33: Introdução ao Smarty

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).

Page 34: Introdução ao Smarty

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 (...)

Page 35: Introdução ao Smarty

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!!!

Page 36: Introdução ao Smarty

Q&A

Obrigado [email protected]