Criando sua Classe de Templates
Show()
Iuhuuuuu! Aqui é onde, realmente, começa o show. Primeiro, este método lê o arquivo, e o põe em um array temporário:
Observação OOP, de novo: A construção "&this" aponta para (em inglês, este) o própio objeto, o que facilita muito a programação. Por exemplo, se temos dois objetos, um chamado $A, e outro chamado $B, e chamamos o método, para o objeto $A, então, o &this da linha vista acima apontará para a propriedade "file" do objeto $A, como se fosse :
$A->file
Mas, se chamamos o mesmo método, para o objeto $B, o $this apontará para o objeto $B, como em:
$B->file
Fácil, né?
Agora, inicializamos um contador em 0, e outra variável, para que possua o tamanho do array:
E fazemos um loop, enquanto o contador for menor que o tamanho do array. Em outras palavras, cada elemento do array tem uma linha do template, e estamos fazendo um loop, variando o contador, do início, até o final deste array.
O kernel ;) deste loop, substitui o "}" por um "nada" (""), e o "{" por uma string "$this->".
Então, quando encontra, por exemplo:
Converte em:
E a função "eval" poderá entender esta variável (anteriormente criada com Set), e a substitui corretamente.
Um exemplo:
conteúdo de page.php:
A linha "include" faz com que o PHP inclua o archivo "ClassTempl.inc" em nosso ecript. E este arquivo contém, justamente, nossa classe (ainda lembra???). As tres próximas linhas, servem para definir o novo template. Primeiro, gera o novo objeto "$T", depois define a variável $title, e, finalmente, mostra o resultado com "Show".
Veja que só utilizamos uma variável, mas não há nenhum problema que uses um cento de variáveis aí.
Melhorando o código:
- Por que mudar??? Está funcionando não?
Sim, o script funciona, agora. No entanto, fazendo pequenas modificações, obteremos razoáveis recursos adicionais.
Observe um novo método Show():
Agora, se não utilizamos nenhum argumento na chamada do método, o template opera exatamente da mesma forma que no exemplo anterior. Mas, se usamos um parametro, podemos determinar somente uma parte do template, para que seja "parseada".
Observe:
conteúdo de mypage.tpl:
Veja as linhas com o "*=>". Pús isto, para usar como identificador de início de cada rotina, dentro do arquivo de templates. Neste exemplo, temos tres templates: "header", "table_header", e "table". Podemos chamar qualquer deles, simplesmente usando o parametro correspondente, na chamada "Show()" do nosso programa:
conteúdo de page.php:
Muito simples ;)
Iuhuuuuu! Aqui é onde, realmente, começa o show. Primeiro, este método lê o arquivo, e o põe em um array temporário:
<?php $arr = file($this->file); ?>
Observação OOP, de novo: A construção "&this" aponta para (em inglês, este) o própio objeto, o que facilita muito a programação. Por exemplo, se temos dois objetos, um chamado $A, e outro chamado $B, e chamamos o método, para o objeto $A, então, o &this da linha vista acima apontará para a propriedade "file" do objeto $A, como se fosse :
$A->file
Mas, se chamamos o mesmo método, para o objeto $B, o $this apontará para o objeto $B, como em:
$B->file
Fácil, né?
Agora, inicializamos um contador em 0, e outra variável, para que possua o tamanho do array:
<?php $c = 0; // a single counter $len = count ($arr); // the lenght of the array ?>
E fazemos um loop, enquanto o contador for menor que o tamanho do array. Em outras palavras, cada elemento do array tem uma linha do template, e estamos fazendo um loop, variando o contador, do início, até o final deste array.
<?php while ($c < $len) { $temp = str_replace ("{", "$"."this->",$arr[$c] ); $temp = str_replace ( "}", "",$temp ); $temp=addslashes($temp); eval( "\$x= \"$temp\";"); echo $x; $c++; } ?>
O kernel ;) deste loop, substitui o "}" por um "nada" (""), e o "{" por uma string "$this->".
Então, quando encontra, por exemplo:
<CENTER> {title} </CENTER>
Converte em:
<CENTER> $this->title </CENTER>
E a função "eval" poderá entender esta variável (anteriormente criada com Set), e a substitui corretamente.
Um exemplo:
conteúdo de page.php:
<?php include "ClassTempl.inc"; $T = new P_Tpl("mypage.tpl"); $T->Set("title","Minha página"); $T->Show(); ?>
A linha "include" faz com que o PHP inclua o archivo "ClassTempl.inc" em nosso ecript. E este arquivo contém, justamente, nossa classe (ainda lembra???). As tres próximas linhas, servem para definir o novo template. Primeiro, gera o novo objeto "$T", depois define a variável $title, e, finalmente, mostra o resultado com "Show".
Veja que só utilizamos uma variável, mas não há nenhum problema que uses um cento de variáveis aí.
Melhorando o código:
- Por que mudar??? Está funcionando não?
Sim, o script funciona, agora. No entanto, fazendo pequenas modificações, obteremos razoáveis recursos adicionais.
Observe um novo método Show():
<?php /******************************************************* * Show Make a prints in the HTML code *******************************************************/ function Show ( $ident="" ) { // Make an array $arr = file ( $this->file ); // If $ident has not defined if ( $ident=="" ) { $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++; } } // if exist an identificator ($ident) else { $c = 0; // a single counter $len = count ($arr); // the lenght of the array $tag = "*=> " . $ident; // a tag to search while( $c < $len ) { // when encounter the tag if ( trim($arr[$c]) == $tag ) { $c++; // while not found new tag while( (substr( $arr[$c], 0 , 3) != "*=>" ) && ( $c < $len ) ) { $temp = str_replace ( "{", " $"."this->", $arr[$c] ); $temp = str_replace ( "}", " ", $temp ); $temp=addslashes($temp); eval( "\$x= \"$temp\";"); echo $x; $c++; } // forces end of check $c=$len; } $c++; } } } ?>
Agora, se não utilizamos nenhum argumento na chamada do método, o template opera exatamente da mesma forma que no exemplo anterior. Mas, se usamos um parametro, podemos determinar somente uma parte do template, para que seja "parseada".
Observe:
conteúdo de mypage.tpl:
*=> header <HTML> <BODY> <TITLE>mypage</TITLE> <CENTER> {title} </CENTER> <HR></HR> *=> table_header <TABLE BORDER=2 ALIGN=CENTER> <TR> <TH> {col1} </TD> <TH> {col2} </TD> <TH> {col3}</TD> </TR> *=> table <TR> <TD> {last} </TD> <TD> {first} </TD> <TD> {age}</TD> </TR>
Veja as linhas com o "*=>". Pús isto, para usar como identificador de início de cada rotina, dentro do arquivo de templates. Neste exemplo, temos tres templates: "header", "table_header", e "table". Podemos chamar qualquer deles, simplesmente usando o parametro correspondente, na chamada "Show()" do nosso programa:
conteúdo de page.php:
<?php include "ClassTempl.inc"; $T = new P_Tpl("mypage.tpl"); // Template $T->Set("title","Minha página"); $T->Show("header"); // Making a header of table $T->Set("col1","Sobrenome"); $T->Set("col2","Nome"); $T->Set("col3","Idade"); $T->Show("table_header"); // Making a row $T->Set("last","Pohlmann"); $T->Set("first","Sergio"); $T->Set("age","35"); $T->Show("table"); // Other row $T->Set("last","Washington"); $T->Set("first","John"); $T->Set("age","52"); $T->Show("table"); ?>
Muito simples ;)
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