Recursos Interessantes do Smarty

Hoje falarei sobre alguns recursos interessantes do gerenciador de templates Smarty (http://www.smarty.net).

Assumo que o leitor já conhece a sintaxe básica do Smarty, como rodar um template, qual estrutura de diretórios utilizar e como alterar o include_path para facilitar as configurações do gerenciador. Se não souber, veja esta seção: http://www.smarty.net/manual/pt_BR/installation.php

1. Formatação de Datas
2. Definindo Valores Padrões
3. Formatando Números
4. Truncando Textos
5. Salvando textos em Variáveis
6. Loops (Estruturas de Repetição)
7. Contadores
8. Alternando Valores em um Loop
9. Populando Elemenos de Formulários
10. Gerando Tabelas HTML
11. Escondendo dos Bots de Spam Endereços de E-Mail

1. Formatação de Datas

O Smarty possui um modificador de variável chamado date_format. Ele se assemelha à função strftime(), do PHP.

index.php

1
$Smarty->assign('data', '2009-05-15');

index.tpl

1
2
3
{$data}
{$data|date_format}
{$data|date_format:"%d/%m/%Y"}

Saída:

2009-05-15
May 15, 2009
15/05/2009

Veja mais detalhes e todos os especificadores de formatação em http://www.smarty.net/manual/pt_BR/language.modifier.date.format.php

2. Definindo Valores Padrões

Para verificar se um valor é diferente de NULL (vazio), costuma-se fazer uma condicional (if). Por exemplko:

1
<img src="{if $foto != ''}{$foto}{else}semfoto.gif{/if}" />

Porém, isto pode ser simplificado para:

1
<img src="{$foto|default:"semfoto.gif"}" />

Mais informações: http://www.smarty.net/manual/pt_BR/language.modifier.default.php

3. Formatando Números

Podemos usar string_format para formatar um número, usando as mesmas regras da função printf().

index.php

1
$Smarty->assign('numero', 42.757428942);

index.tpl

1
2
3
4
5
{$numero}
{$numero|string_format:"%.2f"}
{$numero|string_format:"%07.3f"}
{$numero|string_format:"%d"}
{$numero|string_format:"%05d"}

Saída:

42.757428942
42.76
042.757
42
00042

Mais detalhes: http://www.smarty.net/manual/pt_BR/language.modifier.string.format.php

4. Truncando Textos

Muitas vezes deseja-se truncar um texto para uma certa quantidade de caracteres ou palavras. Geralmente usa-se substr(). O inconveniente dessa função é que ela corta palavras. Há como contornar isso somente com PHP, mas o Smarty facilita ainda mais nesse caso.

index.php

1
$Smarty->assign('texto', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in enim est. Nam placerat adipiscing pretium. Sed at est odio. Vestibulum metus sapien, tincidunt et viverra eget, bibendum molestie justo.');

index.tpl

1
2
3
4
5
{$texto}
{$texto|truncate}
{$texto|truncate:87}
{$texto|truncate:87:"(continua)"}
{$texto|truncate:87:"...":true}

Saída:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in enim est. Nam placerat adipiscing pretium. Sed at est odio. Vestibulum metus sapien, tincidunt et viverra eget, bibendum molestie justo.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in enim est....
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in enim est. Nam...
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in enim est.(continua)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in enim est. Nam plac...

Mais informações http://www.smarty.net/manual/pt_BR/language.modifier.truncate.php

5. Salvando textos em Variáveis

É possível salvar um texto gerado pelo Smarty em uma variável. Uma aplicação para isso é numa paginação, por exemplo, onde a barra com os números das páginas é exibida mais de uma vez.

index.php

1
$Smarty->assign('paginas', array(1, 2, 3, 4, 5, 6));

index.tpl

1
2
3
4
5
6
7
8
9
10
11
12
{capture name="barra_pag"}
{foreach from=$paginas item=i}
 {$i} 
{/foreach}
{/capture}
 
 
{$smarty.capture.barra_pag}
 
conteúdo da página
 
{$smarty.capture.barra_pag}

Saída:

1 2 3 4 5 6

conteúdo da página

1 2 3 4 5 6 

[cta id=’1240′]

6. Loops (Estruturas de Repetição)

As duas estruturas de repetição do Smarty são foreach e section. A principal diferença entra as duas é que section permite modificar o incremento do contador, como num loop while.

index.php

1
$Smarty->assign('array', range(1, 20));

index.tpl

1
2
3
4
5
6
7
8
9
10
11
12
{foreach from=$array item=i key=k}
{$k} => {$i}
{/foreach}
 
 
{section name=cont loop=$array step=2}
{$array[cont]}
{/section}
 
{section name=cont loop=$array step=2 start=5}
{$array[cont]}
{/section}

Saída:

0 => 1
1 => 2
2 => 3
3 => 4
4 => 5
5 => 6
6 => 7
7 => 8
8 => 9
9 => 10
10 => 11
11 => 12
12 => 13
13 => 14
14 => 15
15 => 16
16 => 17
17 => 18
18 => 19
19 => 20


1
3
5
7
9
11
13
15
17
19

6
8
10
12
14
16
18
20

Mais informações:
http://www.smarty.net/manual/pt_BR/language.function.section.php
http://www.smarty.net/manual/pt_BR/language.function.foreach.php

7. Contadores

O Smarty tem um recurso próprio para usar contadores dentro de templates. É o counter.

Este exemplo não requer a exibição do script PHP. Basta dar um display() no tenplate, não sendo necessário atribuir valor a variáveis de templates.

index.tpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{counter start=0 skip=1}
{counter}
{counter}
 
{counter start=7 skip=4}
{counter}
{counter}
{counter}
 
{counter start=77 skip=7 direction=down}
{counter}
{counter}
{counter}
{counter}

Saída:

0
1
2

7
11
15
19

77
70
63
56
49

8. Alternando Valores em um Loop

Uma dúvida muito frequente em fóruns é como alternar cores de linhas de tabelas. Há diversas formas de solucionar esse problema apenas com PHP, mas, novamentem o Smarty facilita o trabalho. Usaremos a função cycle.

index.php

1
$Smarty->assign('array', range(1, 10));

index.tpl

1
2
3
4
5
6
7
<table border="1" width="40" cellpadding="2" cellspacing="1">
{foreach from=$array item=i}
  <tr style="background: {cycle values="#ccc,#666"}">
    <td>{$i}</td>
  </tr>
{/foreach}
</table>

Saída:

1
2
3
4
5
6
7
8
9
10

9. Populando Elemenos de Formulários

Há três elementos de formulário que geralmente são populados com valores personalizados, geralmente provenientes de bases de dados: checkboxes, radios e options. O Smarty possui funções específicas para esses três elementos.

Populando checkboxes

index.php

1
2
3
$Smarty->assign('check_id', array('v1', 'v2', 'v3', 'v4', 'v5'));
$Smarty->assign('check_value', array('valor 1', 'valor 2', 'valor 3', 'valor 4', 'valor 5'));
$Smarty->assign('check_selected', 'v3');

index.tpl

1
{html_checkboxes name=opcoes values=$check_id output=$check_value selected=$check_selected}

Populando radios

index.php

1
2
3
$Smarty->assign('radio_id', array('v1', 'v2', 'v3', 'v4', 'v5'));
$Smarty->assign('radio_value', array('valor 1', 'valor 2', 'valor 3', 'valor 4', 'valor 5'));
$Smarty->assign('radio_selected', 'v3');

index.tpl

1
{html_radios name=opcoes values=$radio_id output=$radio_value checked=$radio_selected}

Populando options

index.php

1
2
3
$Smarty->assign('op_id', array('v1', 'v2', 'v3', 'v4', 'v5'));
$Smarty->assign('op_value', array('valor 1', 'valor 2', 'valor 3', 'valor 4', 'valor 5'));
$Smarty->assign('op_selected', 'v3');

index.tpl

1
2
3
<select name="opcoes">
{html_options  values=$op_id output=$op_value selected=$op_selected}
</select>

Saídas das três funcções:



















Há dois casos particulares para a criação de options: para data e para hora. O Smarty também tem funções específicas para isso.

Para esse caso, não é necessário definir variáveis no script PHP. Basta dar um display() no template.

index.tpl

1
{html_select_date start_year="-100" month_format="%m" field_order="DMY" field_separator="/"}

Saída:

//

html_select_time fica para vocês. =P

Mais informações:
http://www.smarty.net/manual/pt_BR/language.function.html.checkboxes.php
http://www.smarty.net/manual/pt_BR/language.function.html.radios.php
http://www.smarty.net/manual/pt_BR/language.function.html.options.php
http://www.smarty.net/manual/pt_BR/language.function.html.select.date.php
http://www.smarty.net/manual/pt_BR/language.function.html.select.time.php

10. Gerando Tabelas HTML

É possível gerar tabelas HTML a partir de arrays usando html_table.

index.php

1
$Smarty->assign('info', range(1, 30));

index.tpl

1
{html_table loop=$info cols=5 table_attr='border="2"' tr_attr='style="background: #ccc"'}

Mais informações:
http://www.smarty.net/manual/pt_BR/language.function.html.table.php

11. Escondendo dos Bots de Spam Endereços de E-Mail

Colocar endereços de e-mail em páginas HTML acarreta uma grande dor de cabeça: os bots de spam logo aparecem para indexar o e-mail em suas listas de destinatários. Uma boa maneira de esconder dos bots os endereços é codificando-os em hexadecimal, por exemplo, ou em JavaScript. O Smarty possui a função mailto.

index.tpl

1
2
{mailto address="email@site.com"}
{mailto address="email@site.com" encode="hex"}

Saída:

email@site.com
email@site.com

Descobri esse recurso recentemente. Até então eu usava um programa em C que convertia um caractere em hexadecimal. Tinha que fazer isso para cada e-mail que colocasse no site. Agora não preciso mais. =D

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.