Usando o Smarty de forma simples e prática
Tudo bem pessoal.
É o seguinte muitas vezes tentei desenvolver usando o Smarty que é um ótimo framework, mas achava ele pouco prático e chato de mexer, chamadas de pagina com includes, criação de variáveis, sempre ter que usar o delimitadores para apresentar as variáveis, resumindo tedioso pois consumia muito tempo para coisas simples. (Opinião minha)
Então um certo dia decide fazer um Upgrade no Smarty para poder usar este excelente framework de forma mais prática, criei uma classe que otimiza e facilita tudo, uso ela a mais de 1 ano e hoje vou publica-la, como facilita minha vida pode facilitar de muitos outros.
Para este post não ficar gigante vou postar somente o script da classe, quem quiser ver mais detalhes é só me perguntar por aqui ou acessar http://classmain.com/usando-o-smarty-de-forma-simples-e-pratica/
<?php
/**
* Como usar a classe SmartyStructure
*
* Mellhor forma de usar a class SmartyStructure, crie uma classe, exemplo, LayoutController.php que extende a classe SmartyStructure, desta forma dentro
* da classe LayoutController você pode definir as variáveis globais a serem usadas dentro de todo o sistema
*
*
* ###########################################################################################
* #######################--DEFINE DOS DIRETÓRIOS DO SMARTY--#################################
* ###########################################################################################
*
* if (!defined('SMARTY_TEMPLATES')) define('SMARTY_TEMPLATES', 'Application/View/templates/');
* if (!defined('SMARTY_TEMPLATES_C')) define('SMARTY_TEMPLATES_C', 'Application/View/templates_c/');
* if (!defined('SMARTY_LAYOUT')) define('SMARTY_LAYOUT', 'Application/View/layout/');
* if (!defined('SMARTY_CACHE')) define('SMARTY_CACHE', 'Application/View/cache/');
* if (!defined('SMARTY_CONFIGS')) define('SMARTY_CONFIGS', 'Application/View/configs/');
* if (!defined('SMARTY_CSS_DIR')) define('SMARTY_CSS_DIR', 'common/smarty_css/'); # Armazena o diretório arquivos CSS otimizados
* if (!defined('SMARTY_JS_DIR')) define('SMARTY_JS_DIR', 'common/smarty_js/'); # Armazena o diretório arquivos JS otimizados
*
* #Classe principal responsável por organizar o sistema de template
*
* class LayoutController extends SmartyStructure{
*
* #Recebe uma instância da classe de layout
* public $smarty;
*
* public function __construct(){
*
* parent::__construct();
*
* # Informa que não é para usar cache, este método deve ser o primeiro a ser chamado
* # Quando o sistema estiver pronto comente esta linha para usar o Cache de arquivos já criados aumentando a performance do site
* $this->not_cache_template();
*
* # Variáveis de uso do Smarty
* $this->setDelimiterSmarty( '}-', '-{' );
* $this->compile_check = true;
* $this->debugging = false;
* $this->setTemplateDir( SMARTY_TEMPLATES );
* $this->setCompileDir( SMARTY_TEMPLATES_C );
* $this->setCacheDir( SMARTY_CACHE );
* $this->setConfigDir( SMARTY_CONFIGS );
* $this->setLayoutDir( SMARTY_LAYOUT );
* $this->setDirCssOptimized( SMARTY_CSS_DIR );
* $this->setDirJsOptimized( SMARTY_JS_DIR );
* $this->favicon = '';
*
* $this->setCss( 'style.css' );
* $this->setJavaScript( 'script.js', false );
* $this->setJavaScript( 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js', false );
*
* # Crie quantas meta tags que precisar
* $this->newMetaTag( '<!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->' );
*
* # Título global para páginas que não tem um título definido
* $this->title = 'Título das páginas';
*
* # Variáveis globais
* $this->setVar( 'HOST', HOST );
* $this->setVar( 'IMG', IMG );
*
* }
*
* public function __set( $name, $value ){}
* public function __get( $name ){}
* public function __call( $method, $arguments ){ RedirectUrl::url( HOST ); }
*
* }
*
*
* # Exemplo de classe responsável pela página Index
* class IndexController extends LayoutController{
*
* public function __construct(){
*
* parent::__construct;
*
* $this->setCss( 'http://SUA URL/common/css/novo_estilo.css', true, 'original' );
*
* $this->setJavaScript( 'http://SUA URL/common/js/novo_javascript.js', true, 'minifier' );
*
* $this->setNameTemplate( 'tpl_index' );
*
* # Você pode adicionar quantos templates quiser, abaixo exemplo adicionando um TOPO - CORPO - RODAPÉ
* # Obs.: Não adicione tags de criação do HTML, exemplo, <html> - <head> - <body>
* $this->setLayout( 'HeaderLayout' );
* $this->setLayout( 'IndexLayout' );
* $this->setLayout( 'FooterLayout' );
*
* $this->setVar( 'nome', 'Wesley David Santos' ); # Como são criadas as variáveis usadas dentro do Layout
*
* $this->not_cache_template(); # Quando adicionado sempre é usado um novo arquivo, usar somente no desenvolvimento do projeto
* $this->display();
* }
*
* }
*
*
*
* ############# MODELO LAYOUT ################
*
* Obs.: O layout deve possuir uma função com o mesmo nome do arquivo
*
* IndexLayout.php
*
* <?php
*
* function IndexLayout(){
*
* $printText = new PrintText(); # Classe para concatenar textos
*
* $printText->setPrint( '<p>Adicione aqui o layout do seu template</p>' );
* $printText->setPrint( "<p> Nome: " . varSmarty( '$nome' ) . "</p>" ); # Esta linha informa como uma váriavel ou funções do Smarty devem ser usadas. Sempre use aspas simples
* return $printText->getPrint();
*
* }
*
**/
#################################################################################################################
#################################################################################################################
/**
* @function varSmarty
* @action Transforma todas as variáveis usadas no layout para o modelo do Smarty
* @author Wesley David Santos
* @email wesleydavidsantos@gmail.com
* @package Smarty/SmartyStructure.php
* @version 1
* @date 22/11/2012
*/
function varSmarty( $var ){
$var = trim( $var );
if( SmartyStructure::$leftDelimiterSmarty == '' ) trigger_error('Delimitador esquerdo do Smarty não indentificado (Smarty/Structure/functions)');
if( SmartyStructure::$rightDelimiterSmarty == '' ) trigger_error('Delimitador direito do Smarty não indentificado (Smarty/Structure/functions)');
/* retorna a variável com os delimitadores */
return SmartyStructure::$leftDelimiterSmarty . $var . SmartyStructure::$rightDelimiterSmarty;
}
#################################################################################################################
#################################################################################################################
/**
* Classe usada para concatenar dados e retornar a informação
*
* @link http://www.classmain.com/
* @author Wesley David Santos
* @email wesleydavidsantos@gmail.com
* @package Smarty/Structure
* @version 1
* @date 22/11/2012
*/
class PrintText{
private $print;
public function __construct(){$this->print = '';}
/**
* Armazena as informações para impressão
*/
public function setPrint( $param ){$this->print .= $param;}
/**
* Retorna os dados para impressão
*/
public function getPrint(){
$print = $this->print; /** Informação que será impressa **/
$this->print = ''; /** Esvazia a variável **/
return $print;
}
}
#################################################################################################################
#################################################################################################################
/**
* File: Structure.php
* Classe principal que recebe as demais partes do site (Head | Body | JavaScript) e gera o código HTML final
*
* @link http://www.classmain.com/
* @author Wesley David Santos
* @email wesleydavidsantos@gmail.com
* @package Smarty/Structure
* @version 1
* @date 21/09/2013
*/
if (!defined('SMARTY_STRUCTURE')) {
define('SMARTY_STRUCTURE_DIR', SMARTY_DIR . 'Structure' . DS);
}
require_once(dirname(__FILE__) . '/Smarty.class.php');
class SmartyStructure extends Smarty{
/**#@--VARIABLES INTERNAL--@#*/
/**
* Armazena o nome dos atributos internos que vão diretamente no TEMPLATE
*/
private $varInternal = array('title', 'typeCharset', 'contentLanguage', 'replyTo', 'description', 'keywords', 'googleWebMasterCode', 'bingWebMasterCode', 'FB_title', 'FB_description', 'FB_url', 'FB_image', 'FB_siteName', 'FB_type', 'alexaVerifyID', 'favicon' , 'metaTags', 'typeCharsetJavaScript');
/**#@--VARIABLES--@#*/
/**
* Informa a URL atual do site
* @var String - URL
*/
private $urlServer;
/**
* Informa o tipo de arquivo HTML que deve ser criado
* @var Integer
* 1 - HTML5
* 2 - HTML 4.01 Strict
* 3 - HTML 4.01 transitional
* 4 - HTML 4.01 Frameset
* 5 - XHTML 2.0
* 6 - XHTML 1.1
* 7 - XHTML 1.0 Strict
* 8 - XHTML 1.0 Transitional
* 9 - XHTML 1.0 Frameset
* 10 - HTML 3.2
* 11 - HTML 2.0
* @default 1
*/
private $htmlDoctype='1';
/**
* Informa o diretório para criação de Templates
* @var String
*/
private $template_dir;
/**
* Informa o diretório onde fica armazenado os Layouts
* @var String
*/
private $layout_dir;
/**
* Informa o diretório onde irá ser armazenados os CSS otimizados
* @var String
*/
private $css_optimized_dir;
/**
* Informa o diretório onde irá ser armazenados os JS otimizados
* @var String
*/
private $js_optimized_dir;
/**
* Nome dado ao arquivo de template que será criado
* @var String
*/
private $nameTemplate;
/**
* Tipo de extensão do template que será criado
* @var String
*/
private $extensionTemplate;
/**
* Armazena os nomes de todos os layouts a serem usados em um único template
* @var Array
*/
private $page=array();
/**
* Informa se o arquivo Template deve ser sobrescrito
* @var Boolean
* @default TRUE
*/
private $cache=true;
/**#@--STRUCTURE HTML--@#*/
/**
* URL do favicon
* @var String
*/
public $favicon;
/**
* Informa o tipo de codificação a ser usada
* @var String
* @default UTF-8
*/
public $typeCharset='UTF-8';
/**
* Informa o tipo de codificação a ser usada nos arquivos de JavaScript
* @obs Só serve para o JS Assíncrono
* @var String
* @default UTF-8
*/
public $typeCharsetJavaScript='UTF-8';
/**
* Declara a linguagem natural do documento
* @var String
* @default pt-br
*/
public $contentLanguage='pt-br';
/**
* E-mail para contato
* @var Srting
*/
public $replyTo;
/**
* Título da pagina
* @var String
*/
public $title;
/**
* Descrição da pagina
* @var String
*/
public $description;
/**
* Palavras chaves referentes a página
* @var String
*/
public $keywords;
/**
* Informa se é para o navegador armazenar a página em cache
* @var String
* @types Public - Private - No-Cache - No-Store
*/
public $pragma;
/**
* Direito autoral da página
* @var String
*/
public $copyRight;
/**
* A data e a hora depois dos quais o documento deve ser considerado como expirado.
* "0" é considerada como "agora".
* @var String
*/
public $expiresPage;
/**
* Especifica um tempo em segundos para o browser atualizar a página, opcionalmente pode-se adicionar uma URL para a qual será redirecionado.
* @var Array
* @example array('time'=>15, 'redirect'=>'http://www.classmain.com');
*/
private $refreshPage=array();
/**
* Especifica informações de indexação para os robôs de busca
* @var String
* @types All - Index - Follow - NoIndex - NoFollow - None - NoArchive (Apenas Google)
* @default Index
*/
public $robots='Index';
/**
* Título da pagina usado pelo Facebook
* @var String
*/
public $FB_title;
/**
* Descrição da pagina usado pelo Facebook
* @var String
*/
public $FB_description;
/**
* URL da pagina que deve ser informada ao Facebook
* @var String
*/
public $FB_url;
/**
* Imagem da página que deve ser selecionada pelo Facebook
* @var String
*/
public $FB_image;
/**
* Nome do site que deve ser informado ao Facebook
* @var String
*/
public $FB_siteName;
/**
* Tipo do site que deve ser informado ao Facebook
* @var String
*/
public $FB_type;
/**
* Código do WebMaster fornecido pelo google - [http://www.google.com/webmasters/](http://www.google.com/webmasters/)
* @var String
*/
public $googleWebMasterCode;
/**
* Código do WebMaster fornecido pelo Bing - [http://www.bing.com/toolbox/webmaster](http://www.bing.com/toolbox/webmaster)
* @var String
*/
public $bingWebMasterCode;
/**
* Código de identificação do Alexa - [http://www.alexa.com/](http://www.alexa.com/)
* @var String
*/
public $alexaVerifyID;
/**
* Armazena as meta tags criadas pelo desenvolvedor
* @var String
*/
private $metaTags='';
/**
* Armazenas as URLs dos CSS da página
* @var Array
*/
private $cssLink;
/**
* Armazenas as URLs dos JS da página
* @var Array
*/
private $javaScriptLink;
/**
* Tipos usados para otimização de arquivos
* @var Array
*/
private $list_type_optimized = array('minifier', 'formatter', 'original');
/**
* Delimitador usado pelo Smarty para identificar funções e variáveis
* @var Right
*/
public static $rightDelimiterSmarty = '}-';
/**
* Delimitador usado pelo Smarty para identificar funções e variáveis
* @var Esquerda
*/
public static $leftDelimiterSmarty = '-{' ;
/**
* Inicializa alguns atributos do Smarty
*/
public function __construct(){
parent::__construct();
# Seta os delimitadores do Smarty
$this->setDelimiterSmarty( '}-', '-{' );
$this->typeCharset = 'UTF-8';
$this->contentLanguage = 'pt-br';
$this->robots = 'Index';
}
/**
* Método responsável por informar os delimitadores usados pelo Smarty para identificação de variáveis
* @var String $right - Delimitador do lado direito
* @var String $left - Delimitador do lado esquerdo
*/
public function setDelimiterSmarty( $right, $left ){
$right = trim( $right );
$left = trim( $left );
if( empty( $right ) || empty( $left ) ) trigger_error( 'Delimitadores inválidos' );
SmartyStructure::$rightDelimiterSmarty = $right; /* Delimitador direito para identificação de variáveis */
SmartyStructure::$leftDelimiterSmarty = $left; /* Delimitador esquerdo para identificação de variáveis */
# Atibutos do Smarty
$this->left_delimiter = SmartyStructure::$leftDelimiterSmarty;
$this->right_delimiter = SmartyStructure::$rightDelimiterSmarty;
}
/**
* Informa o tipo de arquivo HTML que deve ser criado
* @var String
* 1 - HTML5
* 2 - HTML 4.01 Strict
* 3 - HTML 4.01 transitional
* 4 - HTML 4.01 Frameset
* 5 - XHTML 2.0
* 6 - XHTML 1.1
* 7 - XHTML 1.0 Strict
* 8 - XHTML 1.0 Transitional
* 9 - XHTML 1.0 Frameset
* 10 - HTML 3.2
* 11 - HTML 2.0
* @default 1
*/
public function setHtmlDoctype( $number_type ){
if( is_numeric( $number_type ) && $number_type > 0 && $number_type < 12 ) $this->htmlDoctype = $number_type;
}
/**#@--STRUCTURE--@#*/
/**
* Método usado para informar o diretório para armazenar os templates criados
* @param $template_dir - Caminho completo do diretório
*/
public function setTemplateDir($template_dir){
$this->template_dir = $template_dir;
parent::setTemplateDir( $template_dir );
}
/**
* Método usado para informar o diretório onde fica os layouts
* @param $layout_dir - Caminho completo do diretório
*/
public function setLayoutDir($layout_dir){
$this->layout_dir = $layout_dir;
}
/**
* Informa o diretório onde irá ser armazenados os CSS e JS otimizados
* @param String
*/
public function setDirCssOptimized($dir_css_optimized){
$this->css_optimized_dir = $dir_css_optimized;
}
/**
* Informa o diretório onde irá ser armazenados os CSS e JS otimizados
* @param String
*/
public function setDirJsOptimized($dir_js_optimized){
$this->js_optimized_dir = $dir_js_optimized;
}
/**
* Método que armazena os nomes dos Layouts a serem usados em um único template
* @param $file - Nome do Layout
* @param $extension - Extensão do layout
*/
public function setLayout( $file, $extension='php' ){
$extension = trim($extension);
if( !empty( $extension ) ){
$this->page[] = array('file'=>$file, 'extension'=>$extension);
}else{
trigger_error( 'Extensão do layout <strong>'.$file.'</strong> inválido' );
}
}
/**
* Método usado para informar o nome do template a ser criado
* @param $name_template - Nome do arquivo com extensão
* @param $extension - Extensão do template
*/
public function setNameTemplate($name_template, $extension='tpl' ){
$extension = trim($extension);
if( empty( $extension ) ) trigger_error( 'Extensão do template inválido' );
$this->nameTemplate = $name_template;
$this->extensionTemplate = $extension;
}
/**
* Cria variáveis para o template
* @param string $name
* @param mixed $value
*/
public function setVar( $name, $value ){
parent::assign( $name, $value);
}
/**
* Não usar cache nos arquivos de template
*/
public function not_cache_template(){
$this->cache = false;
}
/**
* Retorna o caminho completo até o template
* @return String
*/
private function template(){
return $this->template_dir . $this->nameTemplate . '.' . $this->extensionTemplate;
}
/**
* Verifica se vai usar o template já criado ou deverá criar um novo
*/
private function getCache(){
return (file_exists( $this->template() ) && $this->cache) ? true : false;
}
/**#@--HTML--@#*/
/**
* Especifica um tempo em segundos para o browser atualizar a página, opcionalmente pode-se adicionar uma URL para a qual será redirecionado.
* @param $ime - Integer
* @param $redirect - URL
* @example array('time'=>15, 'redirect'=>'http://www.classmain.com');
*/
public function setRefreshPage( $time, $redirect ){
if(filter_var($url, FILTER_VALIDATE_URL) === FALSE) trigger_error('URL de Refresh inválida <strong>'.$redirect.'</strong>');
if(!is_numeric( $time )) trigger_error('Tempo de redirecionamento inválido <strong>'.$time.'</strong>');
$this->refreshPage = array('time'=>$time, 'redirect'=>$redirect);
}
/**
* Método usado para ser incorporado ao HTML meta tags adicionais, deve ser informado todas as informações que compõem a meta tag
* @param $meta_tag - String
*/
public function newMetaTag( $meta_tag ){
//if( !isset( $this->metaTags[ md5($meta_tag) ] ) ) $this->metaTags[ md5( $meta_tag ) ] = $meta_tag;
$this->metaTags .= $meta_tag;
}
/**
* Armazenas as URLs dos CSS da página
* @param $link - Contem o caminho para o CSS
* @param $optimize - Informa se o arquivo pode ser otimizado
* @param $type_optimize - Tipo de otimização. minifier (Única linha) - formatter (Estrutura mas sem identação) - original (Não alterado)
* @obs Os CSS que podem ser otimizados são reescritos e agrupados em um único arquivo
*/
public function setCss( $link, $optimize=true, $type_optimize='minifier' ){
if( $this->getCache() ) return ''; /* Se existir cache não cria o arquivo */
if( !isset( $this->cssLink[ 'list_link' ] ) ) $this->cssLink[ 'list_link' ] = array();
if( isset( $this->cssLink[ 'list_link' ] ) && !in_array( $link, $this->cssLink[ 'list_link' ] ) ){
# Adicionar a lista para verificar a redundância
$this->cssLink[ 'list_link' ][] = $link;
if( $optimize ){
# Verifica o tipo de otimização
if( in_array( strtolower($type_optimize), $this->list_type_optimized ) )
$this->cssLink['optimize'][strtolower($type_optimize)][ md5( $link ) ] = $link;
else
$this->cssLink['optimize']['minifier'][ md5( $link ) ] = $link;
}else{
$this->cssLink['normal'][ md5( $link ) ] = $link;
}
}
}
/**
* Armazenas as URLs dos JS da página
* @param $link - Contem o caminho para o JS
* @param $optimize - Informa se o arquivo pode ser otimizado
* @param $type_optimize - Tipo de otimização. minifier (Única linha) - formatter (Estrutura mas sem identação) - original (Não alterado)
* @obs Os JS que podem ser otimizados são reescritos e agrupados em um único arquivo
*/
public function setJavaScript( $link, $optimize=true, $type_optimize='minifier', $charset='UTF-8' ){
if( $this->getCache() ) return ''; /* Se existir cache não cria o arquivo */
if( !isset( $this->javaScriptLink[ 'list_link' ] ) ) $this->javaScriptLink[ 'list_link' ] = array();
if( isset( $this->javaScriptLink[ 'list_link' ] ) && !in_array( $link, $this->javaScriptLink[ 'list_link' ] ) ){
# Adicionar a lista para verificar a redundância
$this->javaScriptLink[ 'list_link' ][] = $link;
if( $optimize ){
# Verifica o tipo de otimização
if( in_array( strtolower($type_optimize), $this->list_type_optimized ) )
$this->javaScriptLink['optimize'][strtolower($type_optimize)][ md5( $link ) ] = $link;
else
$this->javaScriptLink['optimize']['minifier'][ md5( $link ) ] = $link;
}else{
$this->javaScriptLink['normal'][ md5( $link ) ] = array('url'=>$link, 'charset'=>$charset);
}
}
}
/**
* Método responsável por otimizar os arquivos CSS e JS
* @param $type_arq String - css | js
*/
private function optimizeArq( $type_arq ){
if( !in_array( $type_arq, array( 'css', 'js' ) ) ) trigger_error( 'Tipo de arquivo para otimização no formato inválido - ' . $type_arq );
# Recebe o array com os links
if( $type_arq == 'css' ){
$list_arq = $this->cssLink;
$dir_optimized = $this->css_optimized_dir;
}else{
$list_arq = $this->javaScriptLink;
$dir_optimized = $this->js_optimized_dir;
}
if( !isset( $list_arq['optimize'] ) ) return '';
if( !file_exists( $dir_optimized ) ) trigger_error( 'Diretório do <strong>'.$type_arq.' otimizado</strong> não encontrado' );
# Caminho completo do arquivo a ser criado
$arq = $dir_optimized . $this->nameTemplate . '_optimized.' . $type_arq; # Cria o diretório para armazenar o CSS optimized;
# Cria um novo arquivo para escrita
$fp = fopen( $arq , 'w'); /* "w" apaga o arquivo anterior e cria um novo */
fclose($fp); /* Fecha o arquivo */
# Informa se foi encontrado algum arquivo para ser otimizado
$type_return = false;
#Classe para concatenação de textos
$printText = new PrintText();
# Pecorre todos os tipos de otimização
foreach( $this->list_type_optimized as $type_optimized ){
# Verifica se o tipo de otimização existe
if( isset( $list_arq['optimize'][ $type_optimized ] ) ){
$type_return = true;
foreach( $list_arq['optimize'][ $type_optimized ] as $file ){
$f=fopen($file,'rb');
if($f){
while(!feof($f)){
switch ( $type_optimized ) {
case 'minifier': $printText->setPrint( trim( str_replace(PHP_EOL,"",fgets($f)) ) );
break;
case 'formatter': $txt = trim( str_replace(PHP_EOL,"",fgets($f)) );
if( $txt != '') $printText->setPrint( $txt . PHP_EOL );
break;
case 'original': $printText->setPrint( fgets($f) );
break;
}
}
# Adiciona uma linha entre os arquivos
if( $type_optimized == 'original' ) $printText->setPrint( PHP_EOL );
}
fclose($f);
}
unset( $list_arq['optimize'][ $type_optimized ] );
}
}
if( $type_return ){
$fp = fopen( $arq , 'a');/* "a" abre o arquivo para escrita */
fwrite($fp, $printText->getPrint() ); /* Escreve no arquivo */
fclose($fp); /* Fecha o arquivo */
}
if( !$type_return ) return '';
chmod($arq, 0777);
return $arq;
}
/**
* Método que monta o cabeçalho interno do Site
* @param $obj HeadViewStructure
*/
private function head(){
if( $this->getCache() ) return ''; /* Se existir cache não cria o arquivo */
/**
* Classe para concatenação de textos
*/
$printText = new PrintText();
# Informa as meta tags
if(!empty( $this->title ) ) $printText->setPrint( "<title>".varSmarty( '$smarty_var_internal["title"]')."</title>" );
if(!empty( $this->typeCharset ) ) $printText->setPrint( "<meta http-equiv='Content-Type' content='text/html; charset=".varSmarty( '$smarty_var_internal["typeCharset"]')."' />" );
if(!empty( $this->contentLanguage ) ) $printText->setPrint( "<meta http-equiv='Content-Language' content='".varSmarty( '$smarty_var_internal["contentLanguage"]')."' />" );
if(!empty( $this->replyTo ) ) $printText->setPrint( "<meta name='reply-to' content='".varSmarty( '$smarty_var_internal["replyTo"]')."'/>" );
if(!empty( $this->description ) ) $printText->setPrint( "<meta name='description' content=\"".varSmarty( 'str_replace(\'"\', "\'", $smarty_var_internal["description"])')."\"/>" );
if(!empty( $this->keywords ) ) $printText->setPrint( "<meta name='keywords' content=\"".varSmarty( 'str_replace(\'"\', "\'", $smarty_var_internal["keywords"])')."\" />" );
if(!empty( $this->googleWebMasterCode ) ) $printText->setPrint( "<meta name='google-site-verification' content='".varSmarty( '$smarty_var_internal["googleWebMasterCode"]')."' />" );
if(!empty( $this->bingWebMasterCode ) ) $printText->setPrint( "<meta name='msvalidate.01' content='".varSmarty( '$smarty_var_internal["bingWebMasterCode"]')."' />" );
if(!empty( $this->FB_title ) ) $printText->setPrint( "<meta property='og:title' content=\"".varSmarty( '$smarty_var_internal["FB_title"]')."\" />" );
if(!empty( $this->FB_description ) ) $printText->setPrint( "<meta property='og:description' content=\"".varSmarty( 'str_replace(\'"\', "\'", $smarty_var_internal["FB_description"])')."\" />" );
if(!empty( $this->FB_url ) ) $printText->setPrint( "<meta property='og:url' content='".varSmarty( '$smarty_var_internal["FB_url"]')."' />" );
if(!empty( $this->FB_image ) ) $printText->setPrint( "<meta property='og:image' content='".varSmarty( '$smarty_var_internal["FB_image"]')."' />" );
if(!empty( $this->FB_siteName ) ) $printText->setPrint( "<meta property='og:site_name' content=\"".varSmarty( 'str_replace(\'"\', "\'", $smarty_var_internal["FB_siteName"])')."' />" );
if(!empty( $this->FB_type ) ) $printText->setPrint( "<meta property='og:type' content='".varSmarty( '$smarty_var_internal["FB_type"]')."' />" );
if(!empty( $this->alexaVerifyID ) ) $printText->setPrint( "<meta name='alexaVerifyID' content='".varSmarty( '$smarty_var_internal["alexaVerifyID"]')."' />" );
if(!empty( $this->favicon )) $printText->setPrint( "<link href='".varSmarty( '$smarty_var_internal["favicon"]')."favicon.ico' rel='shortcut icon' type='image/x-icon'/>" );
# Adiciona as metaTags informadas pelo usuário
$printText->setPrint( varSmarty( '$smarty_var_internal["metaTags"]' ) );
/**
* Pecorre o array com todos os CSS que não foram otimizados
*/
if( isset( $this->cssLink['normal'] ) ) foreach( $this->cssLink['normal'] as $css ){ $printText->setPrint( "<link href='" . $css . "' rel='stylesheet' type='text/css' />" ); }
/**
* Cria o arquivo de CSS otimizado
*/
$css_optimized = $this->optimizeArq( 'css' );
if( $css_optimized != '' ) $printText->setPrint( "<link href='" . $this->urlServer . $css_optimized . "' rel='stylesheet' type='text/css' />" );
return $printText->getPrint();
}
/**
* Método que adiciona cada tela de layout informada ao corpo do site, a ordem em que as páginas foram adicionadas será seguida
* Primeiro realiza o include o arquivo que contém o layout depois chama a função que tem o mesmo nome do layout
* @obs Dentro do layout deve conter uma função com o mesmo nome do arquivo
* @return String
*/
private function body(){
if( $this->getCache() ) return ''; /* Se existir cache não cria o arquivo */
if( sizeof( $this->page ) == 0 ) trigger_error( 'Nenhum <strong>layout</strong> foi adicionado. Ex.: setLayout( $file, $extension="php" )' );
/**
* Classe para concatenação de textos
*/
$printText = new PrintText();
/**
* Primeiro inclui o arquivo que contém a página depois chama a função que tem o mesmo nome do layout
*/
foreach( $this->page as $layout ){
# Verifica se o layout se encontra em uma subPasta
$arq = explode( '/', $layout['file'] );
if( sizeof( $arq ) > 0 ){
$function = array_pop( $arq );
$arq = implode( '/', $arq ) . '/';
}else{
$function = $layout['file'];
}
$file = $arq . $function .'.'. str_replace( '.', '', $layout['extension'] );
include_once( $this->layout_dir . $file );
$printText->setPrint( $function() );
}
return $printText->getPrint();
}
/**
* Método que retorna os links do javaScript
* @return String
*/
private function javaScript(){
if( $this->getCache() ) return ''; /* Se existir cache não cria o arquivo */
# Classe para concatenação de textos
$printText = new PrintText();
/**
* Pecorre o array com todos os JS que não foram otimizados
*/
if( isset( $this->javaScriptLink['normal'] ) ) foreach( $this->javaScriptLink['normal'] as $js ){ $printText->setPrint( "<script type='text/javascript' src='" . $js['url'] . "' charset='".$js['charset']."' ></script>" ); }
$js_optimized = $this->optimizeArq( 'js' );
if( $js_optimized != '' ){
# Classe para concatenação de textos
$printText_js = new PrintText();
$printText_js->setPrint( "(function() { ");
$printText_js->setPrint( "var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;");
$printText_js->setPrint( "ga.src = '". $this->urlServer . $js_optimized . "';");
$printText_js->setPrint( "var s = document.getElementsByTagName('script')[0];");
$printText_js->setPrint( "s.parentNode.insertBefore(ga, s);");
$printText_js->setPrint( "})();");
# Caminho completo do arquivo a ser criado
$arq = $this->js_optimized_dir . $this->nameTemplate . '_js_sincrono.js';
# Cria um novo arquivo para escrita
$fp = fopen( $arq , 'w'); /* "w" apaga o arquivo anterior e cria um novo */
fwrite($fp, $printText_js->getPrint() ); /* Escreve no arquivo */
fclose($fp); /* Fecha o arquivo */
$printText->setPrint( "<script async defer type='text/javascript' src='" . $this->urlServer . $arq . "' charset='".varSmarty( '$smarty_var_internal["typeCharsetJavaScript"]')."' ></script>" );
}
return $printText->getPrint();
}
/**
* Método usado para criar o HTML final do template
*/
private function writeHtml(){
/**
* Classe para concatenação de textos
* Classe para criar arquivos
*/
$printText = new PrintText();
switch ( $this->htmlDoctype ) {
case 1: $printText->setPrint( "<!DOCTYPE HTML>" );
break;
case 2: $printText->setPrint( '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' );
break;
case 3: $printText->setPrint( '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' );
break;
case 4: $printText->setPrint( '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">' );
break;
case 5: $printText->setPrint( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 2.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml2.dtd">' );
break;
case 6: $printText->setPrint( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">' );
break;
case 7: $printText->setPrint( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' );
break;
case 8: $printText->setPrint( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' );
break;
case 9: $printText->setPrint( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">' );
break;
case 10: $printText->setPrint( '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">' );
break;
case 11: $printText->setPrint( '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">' );
break;
}
$printText->setPrint( '<html>' );
$printText->setPrint( "<head>" );
$printText->setPrint( $this->head() );
$printText->setPrint( "</head>" );
$printText->setPrint( "<body>" );
$printText->setPrint( $this->body() );
$printText->setPrint( "</body>" );
$printText->setPrint( $this->javaScript() );
$printText->setPrint( "</html>" );
/**
* Cria um novo arquivo HTML
*/
$fp = fopen($this->template(), 'w');/* "w" apaga o arquivo anterior e cria um novo */
fwrite($fp, $printText->getPrint() ); /* Escreve o XML no arquivo */
fclose($fp); /* Fecha o arquivo */
chmod($this->template(), 0777);
}
/**
* Método usado para gerar e apresentar o layout criado
*/
public function display(){
# Informa o nome da URL que esta sendo usada
//$this->urlServer = ( strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http://' : 'https://' ) . $_SERVER['SERVER_NAME'] . DS;
$this->urlServer = HOST;
# Verifica se deve usar o arquivo já criado
if( !$this->getCache() ){
if( !isset( $this->template_dir ) ) trigger_error( 'Informe o diretório do <strong>template</strong>' );
if( !isset( $this->layout_dir ) ) trigger_error( 'Informe o diretório do <strong>layout</strong>' );
if( !isset( $this->css_optimized_dir ) ) trigger_error( 'Informe o diretório do <strong>CSS optimizado</strong>' );
if( !isset( $this->js_optimized_dir ) ) trigger_error( 'Informe o diretório do <strong>JavaScript optimizado</strong>' );
if( !isset( $this->nameTemplate ) ) trigger_error( 'Informe o nome do template' );
if( !isset( $this->template_dir ) ) trigger_error( 'Informe o diretório do template' );
if( !file_exists( $this->template_dir ) ) trigger_error( 'Diretório do <strong>Template</strong> não encontrado' );
if( !file_exists( $this->layout_dir ) ) trigger_error( 'Diretório do <strong>Layout</strong> não encontrado' );
$this->writeHtml();
}
# Cria as variáveis internas
foreach( $this->varInternal as $var ) $variables_internal[$var] = $this->$var;
$this->setVar( 'smarty_var_internal', $variables_internal );
parent::display( $this->template() );
}
}Discussão (1)
Carregando comentários...