Este artigo detalha o processo de integração e configuração do Smarty, uma popular ferramenta de template, com o framwork CodeIgniter 3. Ele serve como um guia para desenvolvedores que buscam separar a lógica de negócios da apresentação em seus projetos CI3, utilizando um motor de templates robusto.
Passo 1: Preparação da Biblioteca Smarty
Para começar, faça o download da biblioteca Smarty. Recomenda-se a versão 3.1.x ou superior. Após o download, extraia o conteúdo e copie a pasta "libs" (que contém os arquivos principais do Smarty) para o diretório application/libraries do seu projeto CodeIgniter. Em seguida, localize o arquivo Smarty.class.php dentro da pasta application/libraries/libs e renomeie-o para Smarty.php.
Passo 2: Configuração do Carregamento Automático da Biblioteca
Para que o CodeIgniter carregue automaticamente a bbilioteca Smarty, edite o arquivo application/config/autoload.php e adicione a entrada para a biblioteca Smarty à matriz $autoload['libraries']:
<?php
// application/config/autoload.php
$autoload['libraries'][] = 'smarty/Smarty'; // 'smarty' é o nome da pasta 'libs' renomeada. 'Smarty' é o arquivo Smarty.php.
Passo 3: Definição das Configurações do Smarty
Crie um novo arquivo de configuração para o Smarty em application/config/smarty.php. Este arquivo definirá os diretórios essenciais para o funcionamento do Smarty, como o caminho para os templates e para os arquivos compilados.
<?php
// application/config/smarty.php
defined('BASEPATH') OR exit('No direct script access allowed');
// Caminho para os diretórios do Smarty
$config['smarty_template_path'] = APPPATH . "views/templates/";
$config['smarty_compile_path'] = APPPATH . "views/templates_c/";
$config['smarty_cache_path'] = APPPATH . "cache/smarty/"; // Opcional: diretório de cache
$config['smarty_caching'] = false; // Opcional: desabilitar ou habilitar cache (true/false)
$config['smarty_debug'] = false; // Opcional: modo de depuração (true/false)
Após criar este arquivo, certifique-se de que o CodeIgniter também o carregue automaticamente, adicionando-o à matriz $autoload['config'] em application/config/autoload.php:
<?php
// application/config/autoload.php
$autoload['config'][] = 'smarty';
Crie os diretórios application/views/templates/ e application/views/templates_c/, e opcionalmente application/cache/smarty/, concedendo permissões de escrita a eles.
Passo 4: Criação de um Helper para Gerenciamento do Smarty
Para facilitar o acesso e a configuração da instância do Smarty em seus controladores, é recomendável criar um helper. Crie o arquivo application/helpers/smarty_helper.php com o seguinte conteúdo:
<?php
// application/helpers/smarty_helper.php
defined('BASEPATH') OR exit('No direct script access allowed');
if ( ! function_exists('obter_gerenciador_templates'))
{
/**
* Retorna uma instância do objeto Smarty configurado.
* @return Smarty O objeto Smarty.
*/
function obter_gerenciador_templates()
{
$CI =& get_instance();
// A biblioteca Smarty deve ser carregada via autoload.
// Se por algum motivo não estiver, carregue-a aqui:
// if (!isset($CI->smarty)) { $CI->load->library('smarty/Smarty'); }
$smarty_instance = $CI->smarty;
// Configura diretórios e opções a partir do arquivo 'smarty.php'
$smarty_instance->setTemplateDir($CI->config->item('smarty_template_path'));
$smarty_instance->setCompileDir($CI->config->item('smarty_compile_path'));
$smarty_instance->setCacheDir($CI->config->item('smarty_cache_path'));
$smarty_instance->setCaching($CI->config->item('smarty_caching'));
$smarty_instance->setDebugging($CI->config->item('smarty_debug'));
return $smarty_instance;
}
}
Passo 5: Utilização Básica do Smarty em um Controlador
Agora você pode usar o Smarty em qualquer controlador do CodeIgniter. Primeiro, carregue o helper que você criou e, em seguida, obtenha a instância do Smarty para atribuir variáveis e renderizar seus templates.
<?php
// application/controllers/Paginas.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Paginas extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->helper('smarty_helper'); // Carrega o helper Smarty
}
public function exibir_pagina_exemplo() {
$template_engine = obter_gerenciador_templates();
// Atribui dados que estarão disponíveis no template Smarty
$template_engine->assign('titulo_pagina', 'Exemplo de Página com Smarty');
$template_engine->assign('mensagem', 'Bem-vindo à página renderizada com Smarty no CodeIgniter!');
$template_engine->assign('ano_atual', date('Y'));
// Renderiza o template Smarty
$template_engine->display('exemplo_view.tpl');
}
}
Crie o arquivo do template exemplo_view.tpl em application/views/templates/:
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{$titulo_pagina}</title>
</head>
<body>
<h1>{$mensagem}</h1>
<p>Este conteúdo foi processado pelo Smarty.</p>
<footer>
© {$ano_atual} Meu Site. Todos os direitos reservados.
</footer>
</body>
</html>
Para visualizar, acesse http://seu_projeto_ci/paginas/exibir_pagina_exemplo no seu navegador.
Passo 6: Registro de Funções e Blocos Personalizados no Smarty
O Smarty permite estender sua funcionalidade através de funções e blocos personalizados, que são úteis para encapsular lógica de apresentação complexa ou repetitiva.
Implementando uma Função Personalizada
Crie um novo helper, por exemplo, application/helpers/template_funcoes_helper.php, para hospedar suas funções PHP que serão registradas no Smarty.
<?php
// application/helpers/template_funcoes_helper.php
defined('BASEPATH') OR exit('No direct script access allowed');
if ( ! function_exists('obter_saudacao_personalizada'))
{
/**
* Função Smarty para retornar uma saudação simples.
* @param array $params Parâmetros passados para a função Smarty.
* @param Smarty_Internal_Template $smarty Objeto do template Smarty.
* @return string A saudação formatada.
*/
function obter_saudacao_personalizada($params, $smarty)
{
$nome = isset($params['nome']) ? $params['nome'] : 'Visitante';
return "Olá, {$nome}! É bom vê-lo aqui.";
}
}
No seu controlador, carregue este novo helper e registre a função com o Smarty:
<?php
// application/controllers/ExemploRecursosSmarty.php
defined('BASEPATH') OR exit('No direct script access allowed');
class ExemploRecursosSmarty extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->helper('smarty_helper');
$this->load->helper('template_funcoes_helper'); // Carrega o helper com as funções personalizadas
}
public function demonstrar_funcoes() {
$template_engine = obter_gerenciador_templates();
// Registrar a função Smarty personalizada
$template_engine->registerPlugin('function', 'saudar_usuario', 'obter_saudacao_personalizada');
$template_engine->assign('usuario_logado', 'Maria');
$template_engine->display('demonstracao_funcoes.tpl');
}
}
No template demonstracao_funcoes.tpl (em application/views/templates/), você pode chamar a função:
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Demonstração de Funções Smarty</title>
</head>
<body>
<h1>Exemplo de Função Personalizada</h1>
<p>{$smarty.now|date_format:"%d/%m/%Y %H:%M:%S"}</p> <!-- Exemplo de modificador Smarty -->
<p>{saudar_usuario nome=$usuario_logado}</p>
<p>{saudar_usuario nome='João'}</p>
<p>{saudar_usuario}</p>
</body>
</html>
Registrando um Bloco Personalizado
Blocos personalizados são úteis quando você precisa processar o conteúdo que está entre as tags de abertura e fechamento do bloco. Adicione a seguinte função ao seu helper template_funcoes_helper.php:
<?php
// application/helpers/template_funcoes_helper.php (continuação)
if ( ! function_exists('processar_bloco_info_detalhada'))
{
/**
* Função de bloco Smarty para exibir informações detalhadas.
* @param array $params Parâmetros passados para o bloco (ex: id, categoria).
* @param string $content Conteúdo entre as tags do bloco.
* @param Smarty_Internal_Template $template Objeto do template Smarty.
* @param bool $repeat Se true, é a chamada de abertura do bloco; se false, é a de fechamento.
* @return string O conteúdo processado para exibição.
*/
function processar_bloco_info_detalhada($params, $content, $template, &$repeat)
{
// Esta função é chamada duas vezes:
// 1. Na abertura da tag (repeat é TRUE), $content é NULL.
// 2. No fechamento da tag (repeat é FALSE), $content contém o que foi entre as tags.
if (!$repeat) { // Segunda chamada (fechamento da tag)
$id = isset($params['id']) ? $params['id'] : 'N/A';
$categoria = isset($params['categoria']) ? $params['categoria'] : 'Geral';
$data_criacao = isset($params['data']) ? $params['data'] : 'Desconhecida';
$saida = "<div style='border: 1px solid #ccc; padding: 10px; margin: 10px 0;'>\n";
$saida .= "<h3>Item {$id} - Categoria: {$categoria}</h3>\n";
$saida .= "<p>Criado em: {$data_criacao}</p>\n";
if (!empty($content)) {
$saida .= "<div>" . trim($content) . "</div>\n"; // Conteúdo entre as tags
}
$saida .= "</div>\n";
return $saida;
}
return null; // Primeira chamada (abertura da tag), retorna vazio ou null
}
}
No controlador ExemploRecursosSmarty, adicione outro método para demonstrar o bloco:
<?php
// application/controllers/ExemploRecursosSmarty.php (continuação)
public function demonstrar_blocos() {
$template_engine = obter_gerenciador_templates();
$template_engine->registerPlugin('block', 'item_com_detalhes', 'processar_bloco_info_detalhada');
$template_engine->display('demonstracao_blocos.tpl');
}
Crie o template demonstracao_blocos.tpl em application/views/templates/:
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Demonstração de Blocos Smarty</title>
</head>
<body>
<h1>Exemplo de Bloco Personalizado Smarty</h1>
{item_com_detalhes id=101 categoria='Produtos' data='2023-01-15'}
<p>Este é o conteúdo do item 101, com informações adicionais sobre o produto. <strong>Detalhes importantes aqui.</strong></p>
{/item_com_detalhes}
{item_com_detalhes id=205 categoria='Serviços' data='2023-03-20'}
<ul>
<li>Serviço de consultoria.</li>
<li>Suporte técnico premium.</li>
</ul>
{/item_com_detalhes}
{item_com_detalhes id=310 categoria='Outros' data='2023-05-01' /} <!-- Bloco auto-fechado sem conteúdo -->
</body>
</html>