Criando sua Classe de Templates
Usando clases
Primeiro, mudamos nosso arquivo de templates:
conteúdo de mypage.tpl:
Veja!!!! Já estamos usando uma variável {title}, como um template de verdade. E criamos um novo arquivo, que conterá a classe, e que poderá ser acessado como se fosse uma biblioteca:
conteúdo de ClassTempl.inc:
Explicando isto:
Primeiro, criamos uma classe (P_Tpl), e três métodos adicionais:
P_Tpl
É somente o construtor da classe.
Observação OOP: Quando chamamos uma classe (para instanciar um novo objeto), a função que tem igual nome que a classe (se existe), é automaticamente chamada. A esta função (ou método), chamamos de "construtor da classe", e permite, entre outras coisas, por exemplo, inicializar variáveis que serão utilizadas pela classe.
Neste caso, excepcionalmente, não inicializamos nenhuma variável, mas sim, utilizamos o construtor, para verificar se foi especificado o arquivo de template, e, se o mesmo realmente existe. Isto nos economiza dores de cabeça posteriores, para debugar o programa (Murphy disse que sempre haverão problemas).
No programa, esta classe será chamada desta forma:
Isto é: Criar um novo objeto, chamado "&T", instanciado desde a classe P_Tpl, e este objeto deve usar o arquivo "mypage.tpl"para fazer seu trabalho. O construtor, neste caso, verificará se existe o arquivo "mypage.tpl".
Set()
Para gerar variáveis (propriedades) para este objeto. Quando desejamos criar uma nova variável, como um título, com o texto "Esta é minha página", colocamos em nosso código:
Observação OOP: Como PHP não encapsula as variáveis de seus objetos, poderíamos acessar estas variáveis, diretamente, caso em que nãqo necessitaríamos deste método. No entanto, isto seria um "truque sujo". Se queremos manter nossa classe mais enquadrada nos princípios de OOP, é uma boa prática, acostumarmos a "setar" propriedades de nossos objetos, sempre através de métodos que o façam.
Primeiro, mudamos nosso arquivo de templates:
conteúdo de mypage.tpl:
<HTML> <BODY> <TITLE>minha página</TITLE> <CENTER> {title} </CENTER> <HR></HR> </BODY> </HTML>
Veja!!!! Já estamos usando uma variável {title}, como um template de verdade. E criamos um novo arquivo, que conterá a classe, e que poderá ser acessado como se fosse uma biblioteca:
conteúdo de ClassTempl.inc:
<?php /*********************************************************** * * class P_Tpl * * Management of a template * * @author Sergio A. Pohlmann * @mailto sergiop@mail.com * @date july, 06 of 2002 * ***********************************************************/ class P_Tpl { /******************************************************* * Constructor of the class *******************************************************/ function P_Tpl ( $file="" ){ $this->file=$file; // File of template // Check if file variable is defined and file exist if (empty( $this->file ) ) { die("Not defined file to template"); } else { if ( !file_exists( $this->file ) ) { die("File $this->file do not exist!"); } } } /******************************************************* * Set To set any variable to the template *******************************************************/ function Set ( $var, $value ) { $this->$var=$value; } /******************************************************* * Show Make a prints in the HTML code *******************************************************/ function Show () { // Make an array $arr = file ( $this->file ); $c = 0; // a single counter $len = count ($arr); // the lenght of the array while( $c < $len ) { $temp = str_replace ("{", "$"."this->",$arr[$c] ); $temp = str_replace ( "}", "",$temp ); $temp=addslashes($temp); eval( "\$x= \"$temp\";"); echo $x; $c++; } } } ?>
Explicando isto:
Primeiro, criamos uma classe (P_Tpl), e três métodos adicionais:
P_Tpl
É somente o construtor da classe.
Observação OOP: Quando chamamos uma classe (para instanciar um novo objeto), a função que tem igual nome que a classe (se existe), é automaticamente chamada. A esta função (ou método), chamamos de "construtor da classe", e permite, entre outras coisas, por exemplo, inicializar variáveis que serão utilizadas pela classe.
Neste caso, excepcionalmente, não inicializamos nenhuma variável, mas sim, utilizamos o construtor, para verificar se foi especificado o arquivo de template, e, se o mesmo realmente existe. Isto nos economiza dores de cabeça posteriores, para debugar o programa (Murphy disse que sempre haverão problemas).
No programa, esta classe será chamada desta forma:
<?php $T = new P_Tpl("mypage.tpl"); ?>
Isto é: Criar um novo objeto, chamado "&T", instanciado desde a classe P_Tpl, e este objeto deve usar o arquivo "mypage.tpl"para fazer seu trabalho. O construtor, neste caso, verificará se existe o arquivo "mypage.tpl".
Set()
Para gerar variáveis (propriedades) para este objeto. Quando desejamos criar uma nova variável, como um título, com o texto "Esta é minha página", colocamos em nosso código:
<?php $T->Set( "title", "Esta é minha página"); ?>
Observação OOP: Como PHP não encapsula as variáveis de seus objetos, poderíamos acessar estas variáveis, diretamente, caso em que nãqo necessitaríamos deste método. No entanto, isto seria um "truque sujo". Se queremos manter nossa classe mais enquadrada nos princípios de OOP, é uma boa prática, acostumarmos a "setar" propriedades de nossos objetos, sempre através de métodos que o façam.
Ahh eu esqueci do principal:
em cada página PHP que você for usar/chamar esta classe para construir um tamplatcê tem que declarar a seguinte variável logo na primeira linha do seu PHP, ou em qualquer linha antes que apareca uma chamada da classe ou função da clesse de templates:
$PG_DIRETORIO = "0"; // +--- Este valor 0 ou a variável não definida deixa os caminhos igauis como estão no .TPL Ex: link.php
$PG_DIRETORIO = "1"; // +--- Isto torna os caminhos assim: ../link.php
$PG_DIRETORIO = "2"; // +--- Isto deixa os links/caminhos assim: ../../link.php
em cada página PHP que você for usar/chamar esta classe para construir um tamplatcê tem que declarar a seguinte variável logo na primeira linha do seu PHP, ou em qualquer linha antes que apareca uma chamada da classe ou função da clesse de templates:
$PG_DIRETORIO = "0"; // +--- Este valor 0 ou a variável não definida deixa os caminhos igauis como estão no .TPL Ex: link.php
$PG_DIRETORIO = "1"; // +--- Isto torna os caminhos assim: ../link.php
$PG_DIRETORIO = "2"; // +--- Isto deixa os links/caminhos assim: ../../link.php
06/04/2006 2:49am
(~18 anos atrás)
Eu usei essas linhas tanto na parte do IF onde o IDENT está definido como na parte para IDENT não definido.
Então minha função show está assim:
/* +=========================================+
| Show - Make a prints in the HTML code |
+=========================================+*/
function Show ( $ident="",$sy_local="" ) {
global $PG_DIRETORIO;
$arr = file ( $this->file );
if ( $ident=="" ) {
$c = 0;
$len = count ($arr);
while( $c < $len ) {
$temp = str_replace ("{", "$"."this->",$arr[$c] );
$temp = str_replace ( "}", "",$temp );
$temp=addslashes($temp);
// ### Duas linhas abaixo por Carlos Eugênio
$temp = str_replace ("\"", "\\\"", $temp);
$temp = str_replace ("'", "'", $temp);
// ### Nove linhas abaixo por Paulo Afonso
$sy_words = array("tema.css", "script.js", "link.php");
$sy_newwordsone = array("../tema.css", "../script.js", "../link.php");
$sy_newwordstwo = array("../../tema.css", "../../script.js", "../../link.php");
if ($PG_DIRETORIO == "1") {
$temp = str_replace ($sy_words, $sy_newwordsone, $temp);
} else if ($PG_DIRETORIO == "2") {
$temp = str_replace ($sy_words, $sy_newwordstwo, $temp);
} else {
}
eval( "\$x= \"$temp\";");
echo $x;
$c++;
}
} else {
$c = 0;
$len = count ($arr);
$tag = "<!--*=> " . $ident . " -->";
while( $c < $len ) {
if ( trim($arr[$c]) == $tag ) {
$c++;
while( (substr( $arr[$c], 0 , 7) != "<!--*=>" ) && ( $c < $len ) ) {
$temp = str_replace ("{", " $"."this->",$arr[$c] );
$temp = str_replace ("}", " ",$temp );
// ### Duas linhas abaixo por Carlos Eugênio
$temp = str_replace ("\"", "\\\"", $temp);
$temp = str_replace ("'", "'", $temp);
// ### Nove linhas abaixo por Paulo Afonso
$sy_words = array("tema.css", "script.js", "link.php");
$sy_newwordsone = array("../tema.css", "../script.js", "../link.php");
$sy_newwordstwo = array("../../tema.css", "../../script.js", "../../link.php");
if ($PG_DIRETORIO == "1") {
$temp = str_replace ($sy_words, $sy_newwordsone, $temp);
} else if ($PG_DIRETORIO == "2") {
$temp = str_replace ($sy_words, $sy_newwordstwo, $temp);
} else {
}
eval( "\$x= \"$temp\";");
echo $x;
$c++;
}
$c=$len;
}
$c++;
}
}
} // +--- FIM da função SHOW ---+
Então, é isso. basicamente é só idéia. A linhas estão muito ruins, mas se automatizar esse método da busca dos arquivos/links no diretório correspondente, o script fica show de bola. É uma boa incrementada eu acho :-)
Bem é isso. Até mais.
Então minha função show está assim:
/* +=========================================+
| Show - Make a prints in the HTML code |
+=========================================+*/
function Show ( $ident="",$sy_local="" ) {
global $PG_DIRETORIO;
$arr = file ( $this->file );
if ( $ident=="" ) {
$c = 0;
$len = count ($arr);
while( $c < $len ) {
$temp = str_replace ("{", "$"."this->",$arr[$c] );
$temp = str_replace ( "}", "",$temp );
$temp=addslashes($temp);
// ### Duas linhas abaixo por Carlos Eugênio
$temp = str_replace ("\"", "\\\"", $temp);
$temp = str_replace ("'", "'", $temp);
// ### Nove linhas abaixo por Paulo Afonso
$sy_words = array("tema.css", "script.js", "link.php");
$sy_newwordsone = array("../tema.css", "../script.js", "../link.php");
$sy_newwordstwo = array("../../tema.css", "../../script.js", "../../link.php");
if ($PG_DIRETORIO == "1") {
$temp = str_replace ($sy_words, $sy_newwordsone, $temp);
} else if ($PG_DIRETORIO == "2") {
$temp = str_replace ($sy_words, $sy_newwordstwo, $temp);
} else {
}
eval( "\$x= \"$temp\";");
echo $x;
$c++;
}
} else {
$c = 0;
$len = count ($arr);
$tag = "<!--*=> " . $ident . " -->";
while( $c < $len ) {
if ( trim($arr[$c]) == $tag ) {
$c++;
while( (substr( $arr[$c], 0 , 7) != "<!--*=>" ) && ( $c < $len ) ) {
$temp = str_replace ("{", " $"."this->",$arr[$c] );
$temp = str_replace ("}", " ",$temp );
// ### Duas linhas abaixo por Carlos Eugênio
$temp = str_replace ("\"", "\\\"", $temp);
$temp = str_replace ("'", "'", $temp);
// ### Nove linhas abaixo por Paulo Afonso
$sy_words = array("tema.css", "script.js", "link.php");
$sy_newwordsone = array("../tema.css", "../script.js", "../link.php");
$sy_newwordstwo = array("../../tema.css", "../../script.js", "../../link.php");
if ($PG_DIRETORIO == "1") {
$temp = str_replace ($sy_words, $sy_newwordsone, $temp);
} else if ($PG_DIRETORIO == "2") {
$temp = str_replace ($sy_words, $sy_newwordstwo, $temp);
} else {
}
eval( "\$x= \"$temp\";");
echo $x;
$c++;
}
$c=$len;
}
$c++;
}
}
} // +--- FIM da função SHOW ---+
Então, é isso. basicamente é só idéia. A linhas estão muito ruins, mas se automatizar esse método da busca dos arquivos/links no diretório correspondente, o script fica show de bola. É uma boa incrementada eu acho :-)
Bem é isso. Até mais.
05/04/2006 5:28pm
(~18 anos atrás)
Geralmente ao usar templates, algumas páginas que usam o template estão em pastas diferente do .TPL, e por isso, se no .TPL existe algum link relativo o mesmo deixa de funcionar. Para poder usar essa classe eu adicionei umas linhas na função SHOW. Olhem as novas linhas:
// ### Nove linhas abaixo por Paulo Afonso
$sy_words = array("tema.css", "script.js", "link.php");
$sy_newwordsone = array("../tema.css", "../script.js", "../link.php");
$sy_newwordstwo = array("../../tema.css", "../../script.js", "../../link.php");
if ($PG_DIRETORIO == "1") {
$temp = str_replace ($sy_words, $sy_newwordsone, $temp);
} else if ($PG_DIRETORIO == "2") {
$temp = str_replace ($sy_words, $sy_newwordstwo, $temp);
} else {
}
// ### Nove linhas abaixo por Paulo Afonso
$sy_words = array("tema.css", "script.js", "link.php");
$sy_newwordsone = array("../tema.css", "../script.js", "../link.php");
$sy_newwordstwo = array("../../tema.css", "../../script.js", "../../link.php");
if ($PG_DIRETORIO == "1") {
$temp = str_replace ($sy_words, $sy_newwordsone, $temp);
} else if ($PG_DIRETORIO == "2") {
$temp = str_replace ($sy_words, $sy_newwordstwo, $temp);
} else {
}
05/04/2006 5:19pm
(~18 anos atrás)
Entendi o código, mas, ele não funciona! quanod ponho a página mypage.tpl pra rodar ela mostra:
{title} e etc.. nao mostra o realmente escrito!
eu fiz assim:
mostra.php:
<?
include "mypage.tpl";
?>
Funcionou! mas porque nao funcionou direto no html?
{title} e etc.. nao mostra o realmente escrito!
eu fiz assim:
mostra.php:
<?
include "mypage.tpl";
?>
Funcionou! mas porque nao funcionou direto no html?
06/07/2005 11:27am
(~19 anos atrás)
desculpe fiz a pergunta errada, tem no inicio do codigo $indent = "", depois um else se o indentificador for diferente de "", claro que nao vai ser, pois o script seta a variável como nula.. realmente nao entendi esta parte
30/06/2005 8:10pm
(~19 anos atrás)
Por favor, me respondam o mais rápido possível, estou querendo saber o que é $indent!!!! esta variável não existe e você utilizou ela durante "todo" o código!
30/06/2005 8:03pm
(~19 anos atrás)
O script dava erro, pois não trata o uso das aspas no template.
Então inclui as seguintes linhas no script:
//$temp=addslashes($temp); // comentei essa linha
$temp = str_replace ("\"", "\\\"", $temp); //nova
$temp = str_replace ("'", "'", $temp); //nova
Gostaria de saber o por quê da última str_replace. Você está trocando ' por ' ?
Grande abraço!
11/11/2004 11:11am
(~20 anos atrás)
tp...
eu tenho uma class de template... a função pra troca as vars é UpdateVar($nome, $nova);
ele procura tp um comentario.. <!--$nome-->
e troca por $nova...
mas se eu coloco funcões q tenham print.. echo.. include.. ou algum loop..
function b(){
include $a;
echo $b;
}
ele retorna tudo em cima do template...
alguém sabe pq? só funciona com return.. mas loop com return tb nao da pq soh pode um return por function :S
isso é doido...
eu tenho uma class de template... a função pra troca as vars é UpdateVar($nome, $nova);
ele procura tp um comentario.. <!--$nome-->
e troca por $nova...
mas se eu coloco funcões q tenham print.. echo.. include.. ou algum loop..
function b(){
include $a;
echo $b;
}
ele retorna tudo em cima do template...
alguém sabe pq? só funciona com return.. mas loop com return tb nao da pq soh pode um return por function :S
isso é doido...
31/07/2004 1:59am
(~20 anos atrás)
ultimo comentário ai foi em 2006, mais tudo bem, me ajudou muito...
parabéns