sexta-feira, 24 de abril de 2009

Integrando Smarty com Zend Framework

E ai pessoal...
Dando continuidade ao aprendizado do Zend Framework, escreverei como integrar o Zend framework com o Smarty Template Engine.

Com o smarty nós conseguimos separar nossas views(Front controllers) em templates. Apesar do Zend adotar o padrão MVC (Movel View Controller), nós temos algumas limitações visuais para organizar nosso código de forma que um webdesigner reconheça ou tenha uma grande noção do que está acontecendo em cada bloco de código de nossos arquivos de layout do sistema e, pelos seguidores do Smarty, não há outro template engine melhor que ele.

Um exemplo:
Toda vez que formos mostrar valores, fazer loops e decisões em nossas páginas e juntarmos tudo ao código HTML, nós temos um visual poluido de nossos arquivos deixando a manutenção mais exaustiva, sem contar que em alguns editores usados pelos webdesigners como o Dreamweaver, a tentativa de interpretação do código do dreamweaver muitas vezes desestrutura o layout do nosso site em fase de desenvolvimento.
Uma diferença de um código sem e com Smarty.
Sem Smarty: < ?php echo $nomedavariavel ? >
Com Smarty: {$nomedavariavel}

Eu li alguns artigos explicando como integrar o Smarty com o Zend...mas não gostei. Vou postar aqui da forma que eu achei menos confusa e mais fácil para manutenção:

INSTALANDO, INSTANCIANDO E CONFIGURANDO O SMARTY

Faça o download do smarty pelo link: http://www.smarty.net/download.php
Crie um diretório chamado Smarty dentro do diretório Library da sua aplicação ZF.
Copie o conteúdo da pasta Lib do arquivo de download(Smarty) para o novo diretório criado.

Dentro do diretório application do ZF, crie os seguintes diretórios: templates, templates_c e templates_cache.


include "Zend/Loader.php";
// Instancia as classes necessárias automaticamente (inclusive a do Smarty)
Zend_Loader::registerAutoload();

//Cria objeto do smarty e configura suas propriedades
$smarty = new Smarty();
$smarty->debugging = false;
$smarty->force_compile = true;
$smarty->caching = true;
$smarty->compile_check = true;
$smarty->cache_lifetime = -1;
$marty->template_dir = './application/templates/';
$smarty->compile_dir = './application/templates_c';
$smarty->cache_dir = './application/templates_cache';
//Registra o objeto criado. É por esse registro que iremos referenciar o objeto smarty em nossos controllers
Zend_Registry::set('smarty', $smarty);


Em seu controller, crie uma variável privada chamada $smarty:
class MeuController extends Zend_Controller_Action
{
private $smarty;
...
}


Chame o smarty da seguinte forma na function init() do seu controller:
public function init(){
$this->smarty = Zend_Registry::get('smarty');
}

E dentro de suas actions, passe os valores necessários para o smarty, Ex.:
public function indexAction()
{
//Cria uma variável chamada Hello com o valor Hello Word!
$this->smarty->assign('Hello', 'Hello Word!');
//Diz ao smarty qual é seu arquivo de template para ser renderizado
$this->smarty->display('arquivo_template.tpl');
}

Não esqueça de criar seu arquivo de template(dados html) dentro do diretório templates que criamos.
Caso esteja trabalhando com módulos no Zend, vc também pode fazer isso sem problemas que funciona da mesma forma.

PLUG-IN DO SMARTY PARA ECLIPSE

Como eu uso o Eclipse, existe um Suporte do Smarty para o eclipse PDT.
Vocês podem baixar nesse endereço: http://code.google.com/p/smartypdt/
Basta descompactar o arquivo no seu diretório do eclipse.
Ele é bom para verificar erros de sintaxe do Smarty e além disso, caso não tenhamos esse plugin, o eclipse fica mostrando aqueles warnings como se fossem erros de HTML.


Bom pessoal, é isso!
Hasta luego!!
;)

4 comentários:

Splinther disse...

Parabéns por esse tutorial,sempre utilizei o view do Zend para trabalhar com templates, mas ouço muito falarem de smarty...

Só uma coisa, dentro de meu projeto, todos as libraries do zf estao na pasta "Zend", criei a pasta Smarty la dentro. tudo certo, descompactei a lib do Smarty dentro. Só que quando se usa "$smarty = new Smarty();" com o "autoLoad", ele busca por um arquivo Smarty.php , quer deveria estar dentro da pasta Zend...

Se alguem tiver problemas com isso tbm, façam o seguinte :

$zendLibs = "Zend" // pasta onde se encontram os arquivos do zend framework,
$bar = "/" // separator;

include($zendLibs.$bar."Loader.php");
include($zendLibs.$bar."Smarty/Smarty.class.php");


Bom essa foi a solução que encontrei para resolver isso, mesmo usando Zend_Loader::loadClass("Zend_Smarty_Smarty.class") não resolveu, quem tiver outra solução posta ae...

Maurício Vinicius de O. Santos disse...

Vlw pelo comentário Splinther.
Pq você não coloca o Diretório Smarty dentro da library do seu projeto, ao invés de colocar dentro do diretório do Zend?
Eu fiz assim e não tive problemas, pois o meu include path esta apontando para o diretorio de library do meu projeto.
Abraços.

Lucas Pontes disse...

Olá, Muito obrigado pelo post

Pode me ajudar? Eu não entendi sobre esta parte de código que foi apresentada:


include "Zend/Loader.php";
// Instancia as classes necessárias automaticamente (inclusive a do Smarty)
Zend_Loader::registerAutoload();
....


Em qual arquivo eu encontro este código?
Obrigado

Gabriela disse...

É eu tbm não entendi onde seria para colocar esse código..seria em qual arquivo??

include "Zend/Loader.php";
// Instancia as classes necessárias automaticamente (inclusive a do Smarty)
Zend_Loader::registerAutoload();
....

Poderiam ajudar o quanto antes...estou precisando mesmo...Flw