+14

Criando sua Classe de Templates

criado por Sergio A. Pohlmann .'. em 17/01/2003 10:49am
"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:
<?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

Comentários:

Mostrando 1 - 10 de 30 comentários
Grande Sergio, cara, esse artigo veio li em boa hora ele, mesmo sendo antigo vou comentar dgadgaguidguiagduad
ultimo comentário ai foi em 2006, mais tudo bem, me ajudou muito...

parabéns
16/05/2007 2:47pm (~17 anos atrás)

Paulo Afonso disse:
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

06/04/2006 2:49am (~18 anos atrás)

Paulo Afonso disse:
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.
05/04/2006 5:28pm (~18 anos atrás)

Paulo Afonso disse:
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 {
}
05/04/2006 5:19pm (~18 anos atrás)

Marcio Coan disse:
muito bom Sergio, parabéns!
28/07/2005 11:35am (~19 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?
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)

Wagner Renzi disse:

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 (~19 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...
31/07/2004 1:59am (~20 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)