Criando plugins para a biblioteca de templates Smarty do PHP

16 Março 2017

Introdução ao Smarty

A biblioteca de template Smarty é mais uma ferramenta para auxiliar a separação de camadas de uma aplicação PHP. Mais especificamente, essa biblioteca normalmente é utilizada para fazer a separação entre arquivos das camadas Controller e View.

O Smarty processa arquivos de template, tipicamente com extensão .tpl, injetando variáveis PHP e retornando o conteúdo renderizado. Um arquivo simples de template do Smarty tem a seguinte forma:

<!DOCTYPE html>
<html>
<body>
<h1>{$titulo}</h1>
<p>Olá, {$nome}</p>
</body>
</html>

Ao renderizar o template acima, o Smarty irá substituir as tags {$titulo} e {$nome} para os valores correspondentes designados com as chamadas aos métodos $smarty->assign(‘titulo’, …) a partir do controller.

Reaproveitando templates Muitas vezes nos vemos repetindo muitas e muitas vezes o mesmo trecho de código HTML. Para casos mais simples, podemos dividir um único arquivo de template em vários diferentes, assim poderemos reaproveitar o código. Por exemplo:

{* Template header.tpl *}
<!DOCTYPE html>
<html>
<body>
{* Template footer.tpl *}
</body>
</html>
{* Template principal *}
{include file="header.tpl"}
<h1>{$titulo}</h1>
<p>Olá, {$nome}</p>
{include file="footer.tpl"}

Por que plugins?

Em determinadas ocasições, a tag {include file=""} pode não ser suficiente para renderizar algum conteúdo dinamicamente. Nesses casos, podemos lançar da mão de plugins, isto é, extensões para o Smarty.

No exemplo acima, poderíamos criar um plugin implementando uma nova tag chamada {header} e outra chamada {footer}, de forma que o template principal seria dado por:

{* Template principal *}
{header}
<h1>{$titulo}</h1>
<p>Olá, {$nome}</p>
{footer}

A conversão do header e do footer para plugins em vez de subtemplates nesse caso específico não é vantajosa, mas em casos mais complexos isso é interessante pois nos permite executar código PHP toda vez que as tags {header} e {footer} sejam incluídas no template do Smarty.

Suponha, por exemplo, que no {header} você queira sempre exibir uma mensagem customizada de acordo com a hora do dia (“bom dia”, “boa tarde”, “boa noite”). Esse é um caso simples do papel do plugin.

Criando um plugin

$smarty->registerPlugin('function', 'header', function () {
    $hora = date('H:i');
    if ($hora < 6) {
        $frase = "Boa noite";
    } elseif ($hora < 12) {
        $frase = "Bom dia";
    } elseif ($hora < 19) {
        $frase = "Boa tarde";
    } else {
        $frase = "Boa noite";
    }
    $smarty->assign('frase', $frase);
    return $smarty->fetch('header.tpl');
});