Dicas & Truques Manipulaçã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 "&nbsp;" 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 &nbsp; quando uma variável está vazia {* A forma mais longa *} {if $title eq ""} &nbsp; {else} {$title} {/if} {* A forma mais simples *} {$title|default:"&nbsp;"} 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.