Dicas & TruquesManipulação de Variável Vazia
Quando você quer algumas vezes imprimir um valor que você definir para uma variável vazia
ao invés de imprimir nada, tal como imprimindo " " a fim de que plano de fundo de tabelas
funcionem corretamente. Muitos usariam uma instrução {if} para manipular isto, mas há um
macete com o Smarty, usando o modificador de variável
default.
Imprimindo   quando uma variável está vazia
{* A forma mais longa *}
{if $title eq ""}
 
{else}
{$title}
{/if}
{* A forma mais simples *}
{$title|default:" "}Manipulação do valor padrão de Variável
Se uma variável é usada freqüentemente em seus templates, aplicando o modificador
default toda vez que ela é mencionado pode evitar um bit desagradável. Você pode remediar isto
pela atribuição de um valor padrão para a variável com a função
assign.
Atribuindo o valor padrão para uma variável de template
{* faça isto em algum lugar no topo de seu template *}
{assign var="titulo" value=$titulo|default:"sem título"}
{* Se o $titulo estava vazio, ele agora contém o valor "sem titulo" quando você exibí-lo *}
{$title}Passando a variável titulo para o template de cabeçalho
Quando a maioria de seus templates usam os mesmos cabeçalhos e mesmos rodapés, é
comum dividi-los um em cada template e então incluí-los. Mas o que fazer se o
cabeçalho precisa ter um titulo diferente, dependendo de que página ele está vindo?
Você pode passar o titulo para o
cabeçalho quando ele é incluído.
Passando a variável titulo para o template de cabeçalho
mainpage.tpl
------------
{include file="header.tpl" titulo="Página Principal"}
{* O corpo do template vem aqui *}
{include file="footer.tpl"}
archives.tpl
------------
{config_load file="archive_page.conf"}
{include file="header.tpl" titulo=#archivePageTitle#}
{* O corpo do template vem aqui *}
{include file="footer.tpl"}
header.tpl
----------
<HTML>
<HEAD>
<TITLE>{$titulo|default:"BC News"}</TITLE>
</HEAD>
<BODY>
footer.tpl
----------
</BODY>
</HTML>
Quando a página principal é atraída, o título da "Página Principal" é passado para o template
header.tpl, e será subseqüencialmente usado com o título. Quando a página de arquivamento é atraída,
o título será "Archives". Note no exemplo de archive, nós estamos usando uma variável do arquivo
archives_page.conf ao invés de uma variável codificada rígida.
Também note que "BC news" é exibida se
a variável $titulo não está definida,
usando o modificador de variável default.
Datas
Como uma regra básica, sempre passe datas para o smarty como timestamps. Isto permite ao
desenhista de template utilizar date_format
para controle completo sobre a formatação de data,
e também facilita a comparação de datas se
necessário.
NOTA: No Smarty 1.4.0, você pode passar datas para o Smarty como timestamps unix,
mysql, ou qualquer outra data interpretável por strtotime().
Usando date_format
{$startDate|date_format}
SAÍDA:
Jan 4, 2001
{$startDate|date_format:"%Y/%m/%d"}
SAÍDA:
2001/01/04
{if $date1 < $date2}
...
{/if}
Quando usando {html_select_date} em um template, o programador normalmente vai querer converter
a saída de um formulário de volta para o formato de timestamp. Aqui está uma função para ajudar
com isso.
Convertendo elementos em forma de data de volta para um timestamp
// isto assume que a forma de seus elementos são nomeadas como
// startDate_Day, startDate_Month, startDate_Year
$startDate = makeTimeStamp($startDate_Year,$startDate_Month,$startDate_Day);
function makeTimeStamp($year="",$month="",$day="")
{
if(empty($year))
$year = strftime("%Y");
if(empty($month))
$month = strftime("%m");
if(empty($day))
$day = strftime("%d");
return mktime(0,0,0,$month,$day,$year);
}WAP/WML
Os templates WAP/WML requerem um cabeçalho de Content-Type de PHP para ser passado junto com
template. A forma mais fácil de fazer isto seria escrever uma função customizada que imprime
o cabeçalho. Se você está usando sistema de caching, esse não funcionará, então nós faremos isso
usando a tag de insert (lembre que tags de insert não são "cached!") Certifique-se que não há saída
para o navegador antes do template,
senão o cabeçalho irá falhar.
Usando insert para escrever um cabeçalho WML Content-Type
// esteja certo que o apache está configurado para as extensões .wml !
// ponha esta função em algum lugar de sua aplicação, ou em Smarty.addons.php
function insert_header() {
// esta função espera o argumento $content
extract(func_get_arg(0));
if(empty($content))
return;
header($content);
return;
}
// seu template Smarty _deve_ começar com a insert tag, olha o exemplo:
{insert name=header content="Content-Type: text/vnd.wap.wml"}
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<!-- begin new wml deck -->
<wml>
<!-- begin first card -->
<card>
<do type="accept">
<go href="#two"/>
</do>
<p>
Bem-vindo ao WAP com Smarty!
Pressione OK para continuar...
</p>
</card>
<!-- begin second card -->
<card id="two">
<p>
Bem fácil isso, não é?
</p>
</card>
</wml>Templates componentizados
Esta dica é um pouco de hack, mas ainda é uma idéia limpa.
Use-a por seu próprio risco. ;-)
Tradicionalmente, programar templates em suas aplicações segue esta forma:
Primeiro, você acumula suas variáveis dentro de sua aplicação PHP, (talvez com requisições
de banco de dados.) Então, você instancia seu objeto Smarty, atribui valores às variáveis
e exibe o template. Por exemplo nós temos um registrador de estoque em nosso template.
Nós coletaríamos os dados estocagem em nossa aplicação, então damos valor a estas variáveis
no template e o exibimos. Agora isso seria legal
se você adicionasse este registrador de
armazenamento (stock ticker) para qualquer aplicação simplesmente incluindo o template, e sem
se preocupar com a busca de dados mais a frente?
Você pode embutir o PHP dentro de seus templates com as tags {php}{/php}.
Com isto, você pode configurar templates independentes, tendo a sua própria
estrutura de dados para dar valor às suas próprias variáveis. Com a lógica embutida
dessa forma, você pode manter a lógica do template & junto. Desta maneira não é
importante de onde o fonte do
template está vindo, ele está sempre junto como um componente.
Template componentizado
{* Smarty *}
{php}
// configurar nossa função para buscar dados armazenados
function fetch_ticker($symbol,&$ticker_name,&$ticker_price) {
// ponha a lógica aqui que procura $ticker_name
// e $ticker_price de algum recurso
}
// chama a função
fetch_ticker("YHOO",$ticker_name,$ticker_price);
// passando valores às variáveis de template
$this->assign("ticker_name",$ticker_name);
$this->assign("ticker_price",$ticker_price);
{/php}
Nome do Estoque: {$ticker_name} Preço do Estoque: {$ticker_price}
No Smarty 1.5.0, há até uma forma mais limpa. Você pode incluir o php em seus templates com
a tag {include_php ...}.
Desta forma você pode manter a lógica do PHP separada da lógica do
template. Veja a função include_php para
mais informação.
Template componentizado com include_php
load_ticker.php
---------------
<?php
// configura nossa função para buscar os dados armazenados
function fetch_ticker($symbol,&$ticker_name,&$ticker_price) {
// ponha aqui a lógica que procura $ticker_name
// e $ticker_price de algum recurso
}
// chama a função
fetch_ticker("YHOO",$ticker_name,$ticker_price);
// passar valores para as variáveis de template
$this->assign("ticker_name",$ticker_name);
$this->assign("ticker_price",$ticker_price);
?>
index.tpl
---------
{* Smarty *}
{include_php file="load_ticker.php"}
Nome do Estoque: {$ticker_name} Preço do Estoque: {$ticker_price}Ofuscando endereços de E-mail
Você deseja saber como seu endereço de E-mail consegue entrar em tantas listas de email de spam?
A única forma de spammers coletar endereços de E-mail é de páginas da web. Para ajudar a combater
este problema, você pode fazer o seu endereço de E-mail aparecer em javascript misturado no
código HTML, mesmo assim ele aparecerá e funcionará corretamente no navegador. Isto é feito com
o plugin mailto.
Exemplo de ofuscamento de um Endereço de E-mail
index.tpl
---------
envia inquisição para
{mailto address=$EmailAddress encode="javascript" subject="Olá"}
Nota técnica
Este método não é 100% a prova de falha. Um spammer poderia criar um programa
para coletar o e-mail e para decodificar estes valores, mas não é muito comum.