Criando sua Classe de Templates
"Louqueando":
Se queres provar algumas experiências "muito loucas", podemos, até, por o código PHP e o código do template, no mesmo arquivo. Isto não vai ficar bonito, mas vai funcionar, e poderá servir como exemplo, também :)
conteúdo de page.php:
Ok!!!!! PHP ignora a parte do template, porque está como um comentário /* .... */
No entanto, nosso script pode ler isto, e identificar as etiquetas "*=>", sem maiores problemas.
Conclusão:
O objetivo deste trabalho, como já disse anteriormente, é demonstrar aos mais novos em PHP, as possibilidades que se pode ter, nas situações de necessidade, com um pouquinho de paciência e criatividade.
Claro que isto não vai substituir FastTemplate ou PHPLib, ou outro sistema grande. Nem é esta, a idéia. No entanto, para quem precisa de algo pequeno, vai funcionar muito bem.
Quanto à velocidade, o script pode ser melhorado de muitas formas. Uma delas, seria o uso de "fgets" para ler o arquivo de templates, por exemplo (isto é teórico, já que não experimentei). De qualquer forma, como comentei, para projetos pequenos, provavelmente, não se poderá notar diferença mensurável, entre o uso de
HTML direto, uma biblioteca "profissional" como as citadas antes, e este script. Experimentei provar com uma série de loops, parseando muitas vezes, o template, e apresentando o tempo, calculado entre início da rotina, e o final da apresentação, e a diferença é insignificante (repito, para projetos pequenos).
Emfim, o bom de tudo isto, é que, para mim, o script funcionou muuuuito bem, obrigado, e, de quebra, me obrigou a absorver um pouquinho mais, a orientação a objetos desta excelente linguagem.
Dois últimos comentários
Primeiro, depois de fazer e usar o script por alguns dias, descobrí um bugzinho, que me forçou a refazer uma parte do programa. Nesta ocasião, aproveitei para melhorar a velocidade (ainda não experimentei usar o "fgets"). Um doce para quem apontar o bug. ;)
Segundo, logo que escreví e provei o script, lhe postei em inglês (de Tarzan, como expliquei), em uma excelente lista de programadores de USA (devnetwork). Assim que, se alguém já o leu, anteriormente, já sabe a referência :) De qualquer forma, aí, não me deram muita bola, mesmo :)
Envíem-me comentarios e críticas, por favor ;)
PS: Comentários e críticas em "PVT" (e-mail) também serão muito bem-vindos.
Sergio Antonio Pohlmann
Encarnación - Paraguay
Se queres provar algumas experiências "muito loucas", podemos, até, por o código PHP e o código do template, no mesmo arquivo. Isto não vai ficar bonito, mas vai funcionar, e poderá servir como exemplo, também :)
conteúdo de page.php:
<?php /* In this part of file, we put the HTML code ----------------------------------------------------------- *=> 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> *=> end of HTML code ----------------------------------------------------------- */ include "ClassTempl.inc"; $T = new P_Tpl("page.php"); // 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"); ?>
Ok!!!!! PHP ignora a parte do template, porque está como um comentário /* .... */
No entanto, nosso script pode ler isto, e identificar as etiquetas "*=>", sem maiores problemas.
Conclusão:
O objetivo deste trabalho, como já disse anteriormente, é demonstrar aos mais novos em PHP, as possibilidades que se pode ter, nas situações de necessidade, com um pouquinho de paciência e criatividade.
Claro que isto não vai substituir FastTemplate ou PHPLib, ou outro sistema grande. Nem é esta, a idéia. No entanto, para quem precisa de algo pequeno, vai funcionar muito bem.
Quanto à velocidade, o script pode ser melhorado de muitas formas. Uma delas, seria o uso de "fgets" para ler o arquivo de templates, por exemplo (isto é teórico, já que não experimentei). De qualquer forma, como comentei, para projetos pequenos, provavelmente, não se poderá notar diferença mensurável, entre o uso de
HTML direto, uma biblioteca "profissional" como as citadas antes, e este script. Experimentei provar com uma série de loops, parseando muitas vezes, o template, e apresentando o tempo, calculado entre início da rotina, e o final da apresentação, e a diferença é insignificante (repito, para projetos pequenos).
Emfim, o bom de tudo isto, é que, para mim, o script funcionou muuuuito bem, obrigado, e, de quebra, me obrigou a absorver um pouquinho mais, a orientação a objetos desta excelente linguagem.
Dois últimos comentários
Primeiro, depois de fazer e usar o script por alguns dias, descobrí um bugzinho, que me forçou a refazer uma parte do programa. Nesta ocasião, aproveitei para melhorar a velocidade (ainda não experimentei usar o "fgets"). Um doce para quem apontar o bug. ;)
Segundo, logo que escreví e provei o script, lhe postei em inglês (de Tarzan, como expliquei), em uma excelente lista de programadores de USA (devnetwork). Assim que, se alguém já o leu, anteriormente, já sabe a referência :) De qualquer forma, aí, não me deram muita bola, mesmo :)
Envíem-me comentarios e críticas, por favor ;)
PS: Comentários e críticas em "PVT" (e-mail) também serão muito bem-vindos.
Sergio Antonio Pohlmann
Encarnación - Paraguay
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