Fernando Mantoan Desenvolvimento e tecnologia da informação no geral

Arquitetura de Software com CodeIgniter – Integrando o Smarty

Postado em 01 de junho de 2009. Categorias: CodeIgniter, PHP | 6 Comentários

Neste terceiro artigo sobre uma proposta de arquitetura de software utilizando CodeIgniter e alguns outros frameworks, mostrarei na prática como fazer a integração do framework de templates Smarty com o CodeIgniter. Após fazer o download e instalar a última versão do framework CodeIgniter, é hora de fazer o download da última versão estável do Smarty, que pode ser encontrada no site oficial do framework. Após efetuar o download, basta descompactar o pacote baixado e copiar a pasta libs para a pasta application/libraries da instalação do CodeIgniter. Então é só renomear a pasta libs para smarty_libs, apenas para melhorar a organização dos diretórios.

Na arquitetura proposta, o Smarty estará disponível a partir da variável smartyview dos Controllers, assim é necessária a criação de arquivos para localizar e disponibilizar o Smarty como uma biblioteca do CodeIgniter. O primeiro arquivo a ser criado estará localizado na pasta application/libraries e se chamará smartyview.php. Ele terá o seguinte conteúdo:

<?php
if (!defined('BASEPATH')) die('Acesso direto ao script bloqueado.');
require_once BASEPATH . 'application/libraries/smarty_libs/Smarty.class.php';
/**
* Classe que extende smarty para definir algumas configurações básicas de inicialização
*
* @author Fernando
* @package libraries
*/
class SmartyView extends Smarty
{
	/**
	* Construtor da classe, define a pasta de compilação e a pasta de templates
	*
	* @access public
	* @author Fernando
	* @version 1.0
	*/
	public function SmartyView()
	{
		$this->compile_dir = BASEPATH . "application/views/templates_c";
		$this->template_dir = BASEPATH . "application/views";
		log_message('debug', 'Classe Smarty Inicializada');
	}
}
?>

Esta classe que herda de Smarty, é utilizada apenas a nível de inicialização das variáveis necessárias pelo framework. Ela define a pasta onde os templates compilados serão salvos, a pasta onde os templates (arquivos de View) estão localizados e grava no log do CodeIgniter uma informação de que a classe Smarty foi inicializada. É necessária a criação de uma pasta chamada templates_c dentro de application/views, com permissões 0755, ou 0777.

O segundo arquivo a ser criado é o arquivo de configurações para gerar uma instância da classe e marcá-la como inicializada. O arquivo é o smartyview.php localizado dentro de application/config, o código é o seguinte:

<?php
if (!defined('BASEPATH')) die('Acesso direto ao script bloqueado.');
if (!class_exists('SmartyView'))
{
	require_once APPPATH . 'libraries/smartyview' . EXT;
}
$obj =& get_instance();
$obj->smartyview = new SmartyView();
$obj->ci_is_loaded[] = 'smartyview';
?>

Ele inclui a classe SmartyView, criada anteriormente, pega a instância do objeto atual do CodeIgniter (Controller), armazena uma instância da classe SmartyView na variável smartyview e a marca como instanciada nas variáveis de controle do CodeIgniter. Estes são os passos necessários para que o framework Smarty funcione no CodeIgniter.

Agora para testar se tudo está funcionando, basta ir no controller welcome.php localizado em application/controllers, e colocar o seguinte código nele:

<?php
class Welcome extends Controller
{
	public function Welcome()
	{
		parent::Controller();
		$this->load->library('smartyview');
	}
	public function index()
	{
		$this->smartyview->assign('mensagem', 'Mensagem');
		$this->smartyview->display('index.tpl');
	}
}
?>

Agora é necessário criar o arquivo application/views/index.tpl e colocar o seguinte conteúdo nele:

<html>
	<head>
		<title>Arquitetura CI</title>
	</head>
	<body>
		<h1>{$mensagem}</h1>
	</body>
</html>

Se tudo der certo, basta acessar agora a URL definida na instalação do CodeIgniter, por exemplo http://localhost/codeigniter, e será exibida a mensagem “Mensagem”. Isto indica que o Smarty está funcionando perfeitamente, encerrando assim este artigo. No próximo artigo será feita a integração com o Doctrine, seguindo pela implementação da camada Facade e por algumas mudanças na nomenclatura dos Controllers. Até a próxima.



6 Comentários +

Responder

Anonimo

Postado em 22/08/2009 às 22:42

Simplesmente sensacional! Agradeço-te, Fernando, por ter postado esse artigo. Era exatamente o que eu estava procurando.
Parabéns!
P.S: Tem como integrar o Smarty com o ZEND e tb o CakePHP?

Responder

admin

Postado em 30/08/2009 às 11:24

Pois é, com o CakePHP é fácil de se encontrar material pelo Google, mas com as novas versões do Zend (1.8 acima) está bem complicado, principalmente por ele utilizar o arquivo de configuração para prover recursos para a aplicação. Já postei mensagens nos fóruns da Zend e etc. e ninguém enviou uma maneira legal de integrar os dois.

Responder

Jacque

Postado em 15/09/2009 às 13:29

Entendi tudo!
uheuhae
Parabéns pela certificação..

Responder

Ricardo Carlini

Postado em 15/12/2009 às 10:13

Opa,
bacana o teu artigo, estava justamente procurando uma forma de colocar o smary para conversar com o CI, e posteriormente com o Xajax…
Mas voltando ao assunto, do livro Smarty – PHP template Programing and Applications temos essa passagem:

Step 3: Set Up Smarty for Your Application
After we are sure that we can find the smarty.class.php file, we need to set up the folders for
our application. Every Smarty application needs four folders, which are named by default
templates, templates_c, configs, and cache.
Each of these folders can be defined by the Smarty class proprieties $template_dir, $compile_dir,
$config_dir, and $cache_dir. Every Smarty application should have its own folders.
For Linux, Smarty needs write access to $compile_dir and $cache_dir, so we have to allow the
web server user write access to these folders. Look at the httpd.conf (Apache web server

Não seria o caso da classe ter os atributos config_dir e cache_dir?

Mto boa a série de artigos

    Responder

    admin

    Postado em 15/12/2009 às 11:15

    Ricardo, é possível sim utilizar estes atributos, porém quando construi a arquitetura para implementar a aplicação apenas defini os atributos essenciais para o funcionamento do Smarty. Além de que nem todas as funcionalidades fornecidas pelo Smarty foram utilizadas. Fica a cargo de cada desenvolvedor verificar as necessidades e implementar o Smarty com tudo que ele pode oferecer. Abraços e obrigado pelo comentário.

Responder

gerson

Postado em 15/08/2010 às 03:03

olá, tentei fazer o tuto mas nao rolou, dá o erro que ele nao consegue encontrar o .tpl
o que pode ser???
A PHP Error was encountered
Severity: User Warning
Message: Smarty error: unable to read resource: “index.tpl”
Filename: libs/Smarty.class.php
Line Number: 1093

Deixe um Comentário