Objota O mundo orientado a objetos

Smarty 3.0 + MVC – Parte 1

Posted on julho 14, 2010

Iniciando meus post’s aqui no objota, vou trazer para vocês um tutorial de Smarty 3.0 com uma pitada de MVC (pois é quase impossível falar de Smarty sem falar de MVC ).

Para quem não conhece o Smarty aqui vai uma explicação rápida sobre esse fantástico template engine que simplifica e muito a organização e a separação da camada de controle da camada de visualização.

“O Smarty é um sistema de templates para PHP. Mais especificamente, ele fornece uma maneira fácil de controlar a separação da aplicação lógica e o conteúdo de sua apresentação. Isto é melhor descrito em uma situação onde o programador da aplicação e o designer do template executam diferentes funções, ou na maioria dos casos não são a mesma pessoa.”
Font:  http://www.smarty.net/manual/pt_BR/what.is.smarty.php

Tá e ai? Então é isso, o Smarty tem por objetivo separar seu código (lógica e conteúdo) da sua apresentação.  Essa separação é realizada através da criação de templates que serão lidos pelo Smarty e esse irá gerar um arquivo pré compilado (arquivo PHP que você não precisa se preocupar pois é gerenciado pelo Smarty).  Um dos recursos no Smarty que também é muito utilizado principalmente em sites que recebem grande volume de acessos é o caching, ou seja,  gera uma saída em HTML que possui um tempo de vida determinado na programação do controlador ou diretamente no config do smarty de acordo com as necessidades do sistema.

Bom então é basicamente isso, se você necessita de mais informações sobre o Smarty acesse o site oficial http://www.smarty.net/. Lá você encontra a documentação completa  da “Latest Stable Release” (Última versão estável em português).

Vamos a configuração da versão 3.0 do Smarty.

Para quem ainda não realizou o download da versão 3.0 aqui está o link http://www.smarty.net/download.php, procure pela versão 3.0 e faça o download.

Após o download vamos criar uma pasta no seu servidor (não cabe a este tutorial explicar como utilizar o servidor web) chamada “tutorial” para nossa aplicação no seu servidor XAMPP ou WAMP ou algum outro servidor que possa ler o seu PHP.  Para esse tutorial eu vou usar o XAMPP e criar a pasta tutorial dentro de 'htdocs' dessa forma eu vou acessar a minha aplicação através da URL http://localhost/tutorial/.

Podemos agora criar a estrutura de diretórios dentro da nossa pasta de aplicação tutorial.

- includes – Arquivos php, no caso iremos colocar o arquivo config
- framework - Aqui ficam todas as ferramentas e frameworks da aplicação
- model -A pasta model é responsável por armazenar as nossas classes de negócio
- view - Aqui irão ficar nossas classes ou classe que irá ser responsável por gerar o html
- controller – Controladores do sistema que receberá as requisições
- general – Aqui vamos criar duas pasta js e css
- css

-js

- lib – E finalmente aqui nossas bibliotecas genéricas, por exemplos arquivos de cálculos, ftp, etc.
- template – O nome já diz tudo, irá armazenar os templates do smarty

Coloque o conteúdo da pasta libs que está na pasta extraída do Smarty dentro de nossa pasta framework para ficar da seguinte maneira

Se você olhar dentro da pasta descompactada do smarty tem uma pasta chamada ‘demo’ que demonstra a utilização do Smarty. Se quiser pode dar uma olhada para ajudar no aprendizado.

Vamos agora criar um arquivo chamado config.inc.php dentro da pasta includes para realizar a configuração da nossa aplicação.
config.inc.php

<?php
//Essas configurações são responsáveis por fazer o mapeamento básico do site
define("HOME", getenv("DOCUMENT_ROOT").'/tutorial/' );
define("HOST", "http://localhost/tutorial/");
define("FRAMEWORK", HOME."framework/");

//configuração do Smarty
define("SMARTY_DIR", FRAMEWORK."smarty/");
define("TEMPLATES", HOME."template/");
define("TMP", FRAMEWORK."tmp/");
define("TMP_CACHE", FRAMEWORK."cache/");
//------------------------------------------

/*Aqui fica minha função de autoload para as classes do PHP,
  para quem não conhece essa função aqui no site nos temos um artigo falando sobre a função
*/
function __autoload ($className) {

	if ( file_exists(HOME."controller/{$className}.class.php") ) {
		require_once (HOME."controller/{$className}.class.php");
	}else if( file_exists(HOME."model/{$className}.class.php") ){
		require_once (HOME."model/{$className}.class.php");
	}else if( file_exists(HOME."view/{$className}.class.php") ){
		require_once (HOME."view/{$className}.class.php");
	}else if( file_exists(HOME."lib/{$className}.class.php") ){
		require_once (HOME."lib/{$className}.class.php");
	}else{

		/*Esses são os comandos que irão ser responsáveis por carregar os arquivos Sys do Smarty ou seja o autoload do Smarty
		  mais na frente vocês irão entender o porque eu tirei essa linha de comando do arquivo Smarty.class.php
		*/
		$_class = strtolower($className);
	    if (substr($_class, 0, 16) === 'smarty_internal_' || $_class == 'smarty_security') {
	        include SMARTY_SYSPLUGINS_DIR . $_class . '.php';
	    }

	}

}

//Nessa linha vamos carregar nossa class Smarty que irá gerenciar toda as saidas de HTML do site
require_once(HOME.'framework/smarty/Smarty.class.php');

?>

Agora vamos a explicação do que fizemos nesse arquivo.
No comando define: para quem não conhece esse comando ele é responsável pela declaração de constantes.

Na função "function __autoload ($className) {}":  Esse fantástico recurso permite que você possa carregar suas classes automaticamente, então como esse arquivo será carregado em todas as páginas a função autoload será responsável por carregar as classes do nosso sistema, que poderão ficar nas pastas controller, model, view e lib.

Da linha 32 à linha 35: Essas linhas foram retiradas do arquivo Smarty.class.php que está presente na função de autoload do Smarty, porém se deixarmos ele controlar o autoload não iremos conseguir carregar nossas classes. Essa configuração será necessária para todos que estão seguindo esse tutorial, então vá até o arquivo Smarty.class.php que está dentro da sua pasta smarty presente em framework e então vá até a linha 97 e remova a seguintes linhas de código:

config.inc.php

if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) {
    $registeredAutoLoadFunctions = spl_autoload_functions();
    if (!isset($registeredAutoLoadFunctions['spl_autoload'])) {
        spl_autoload_register();
    }
} else {
    spl_autoload_register('smartyAutoload');
}

Ufa! Nosso arquivo de config está OK! Mas agora temos que fazer a nossa classe de visualizacao para iniciar corretamente o Smarty.

Ué mas porque?

1 - Precisamos extender a classe Smarty evitando assim que futuras atualizações não possa causar problemas no nosso sistema que está o utilizando, dessa forma é necessários criar uma nova classe.

2 - Nessa classe podemos criar nosso proprios métodos para manipulação de templates e coisas relavantes a saida HTML. Então segue o código já pronto da classe que eu fiz que extende a classe Smarty. Detalhe no método getInstance que será explicado nos próximos artigos onde falaremos mais de MVC Essa classe vai ficar dentro da nossa pasta view.

Visao.class.php


<?php
/***************************************************************************
 *
 *   Copyright PEDRO LUCAS DA SILVA JUNIOR
 *   Site da empresa: http://www.webleaders.com.br/
 *
 ***************************************************************************
 *
 *	 Classe para controle do framework Smarty
 *
 ***************************************************************************/

class Visao extends Smarty{

	private static $instancia;

	public function Visao(){

		parent::__construct();

		$this->template_dir	= TEMPLATES;
		$this->compile_dir		= TMP;
		$this->cache_dir    	= TMP_CACHE;
		$this->caching = false;
		$this->variavel('host',HOST);

	}

	/**
	 * Atribuir um valor a variável de template
	 *
	 * @param string $nome
	 * @param mixed $valor
	 */
	public function variavel($nome,$valor){
		$this->assign($nome,$valor);
	}

	/**
	 * mostrar na tela
	 *
	 * @param string $template
	 * @param int $id
	 */
	public function visualizar($template,$id=""){
		$this->display($template,$id);
	}

	public static function getInstance() {

		if (! isset ( self::$instancia )) {

			try {
				self::$instancia = new Visao ();
			} catch ( Exception $e ) {
				echo 'Temporáriamente indisponível';
				exit ();
			}

		}

		return self::$instancia;

	}

}

Pronto!! Agora já podemos usar o Smarty com tudo configurado.  Só para sentir o gostinho do que virá nos próximos artigos, vamos criar um arquivo com o nome de index.php na raiz da nossa aplicação e outro com o nome de index.tpl dentro da pasta template e coloque os seguinte códigos.

index.php

<?php
require_once("includes/config.inc.php");

$smarty = new Visao();

$smarty->variavel("titulo","Olá mundo");
$smarty->variavel("mensagem","Olá mundo");

$smarty->visualizar("index.tpl");

?>

index.tpl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<title>{$titulo}</title>
	<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
	<meta name="content-language" content="pt-br" />
</head>

<body>

{$mensagem}

</body>
</html>

No arquivo index.php quando nós criamos uma instância da classe Visao, perceba que não foi necessário informar o arquivo, pois quando o PHP percebe que ainda não foi carregada a classe é enviado um pedido para a classe __autoload passando como parametro o nome da classe.

No próximo artigo iremos mais a fundo com os novos recurso do Smarty 3.0 e sobre MVC, tudo isso no nosso caminho que vamos percorrer para chegar no nosso último tutorial onde iremos criar um pequena aplicação utilizando tudo o que foi estudado nos artigos.

Obrigado galera e até a próxima!

Dúvidas e opiniões por favor postem nos comentários que eu irei responder sem sombra de dúvidas.

Arquivos do tutorial: Arquivos do tutorial Smarty + MVC

Posted by Pedro

Comentários (17) Trackbacks (0)
  1. Cara, achei bem legal esse tutorial, mas não achei o link do próximo.

    Ele ainda não está pronto ?

    • Então Thiago, eu estava focado em escrever sobre Objective-C e acabei esquecendo de terminar essa segunda parte. Ele está na metade, mas vou terminar sim, ainda esse mês.

  2. Olá Pedro!

    Gostaria de agradecer por compartilhar sua experiença na integração do Smarty com o View do MVC.

    Cara, estava tentando fazer isso desde das 5 horas da tarde! Encontrei o blog e em apenas 30 minutos consegui adptar.

    Ps. Sua estrutura disponível para download está muito banca.

  3. Pedro, você conseguiu terminar a segunda parte deste tutorial? Estou aguardando anciosamente. Obrigado até aqui. Paranbéns!

  4. Gostei muito deste tutorial. Principalmente porque já faz a integração com o conceito de MVC. Estou esperando a continuação. Parabéns e continue com este trabalho maravilhoso.

  5. E ai man gosta do segundo tuto =D
    Grato

  6. Cara funciona no linux????

  7. Pedro fiz passo a passo porém no linux não aparece nada mas no windows aparece certinho, o que pode ser????

    • Pode ser que a configuração do php seja diferente.. ou pode ser um simples cache ( lembre-se o smarty faz cache ele tem uma flag que controla isso ), por exemplo se ele fez cache do seu tpl quando ele estava em branco ou incompleto, pode ser que esteja vendo cache disso.
      todavia… habilite as flags de erro do php.. poder ser que estela como off.

  8. Pedro fiz passo a passo porém no linux não aparece nada mas no windows aparece certinho, o que pode ser????

  9. Cara tu postou a primeira parte em 2010. Estamos em 2012 e vc ainda não concluiu a continuação deste post?

    • Desculpe pelo atraso, mas este colaborador do blog está com falta de tempo para completar este artigo.
      Mas só gostaria de visar que tudo o que ele pretendia mostrar neste artigo era somente uma compilação de tudo o que temos de contéudo PHP neste blog.
      se vc fuçar ele, irá descobrir que tem tudo o que é necessário para montar a sua própria plataforma: conexão (DB), sessão (login), visão (smarty) , e configuração.
      Creio que ele não irá concluir ainda este ano, mas obrigado pela observação.

  10. Bom Dia!

    Pedro e no caso se fosse para trabalhar com dados vindo do banco de dados?
    Como fariamos?

    • <?php
      $hostname = "localhost";
      $user = "usuario";
      $pass = "senha";
      $dbase = "agenda";// nome da base de dados que vc criou no phpMyAdmin

      $db = mysql_connect($hostname,$user,$pass); //Abre a conexão com o banco Mysql
      mysql_select_db($dbase);//Seleciona um determinado banco..

      $sql = mysql_query("SELECT id, nome FROM contato",$db); //Executo a query retornado o resultado da busca

      //enquanto houver resultados o while vai estar em loop
      $dados = array();
      while($linha = mysql_fetch_array($sql)){

      //para ver os resultados um a um
      //echo 'id: ' . $linha['id'] . ' – nome:' . $linha['nome'] . '’;

      //no caso do smarty
      $dados[] = $linha
      }

      $smarty->assign(‘dados’, $dados);
      $smarty->display(‘tela.tpl’);
      //sendo assim lá no template ‘tela’ eu posso usar esse array de dados
      //em uma estrutura foreach, que o smarty também possui.

      ?>

  11. Achei, muito interessante as explicações do tutorial Smarty 3.0 + MVC – Parte 1, eu até entendi, muito legal!!! Mas seria possivel uma ajuda onde eu usasse a mesma idéia, só que criando uma estrutura para multi-apps!!!(Multiplas aplicações Web) eu até montei um esbolso multi-apps em cima da sua explicação mas não estou conseguin muito fazer funcionar !!! seria possivel trocar alguns email para uma ajuda!!! eu envio para você a estrutra que montei e como pretendo trabalhar!!!


Leave a comment

Sem trackbacks