Integrando Smarty como Motor de Templates no CodeIgniter 3

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>
       &copy; {$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>

Tags: CodeIgniter Smarty TemplateEngine PHP WebDevelopment

Publicado em 7-30 07:19