+14

Criando sua Classe de Templates

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

<?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 ;)

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 (~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?
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 (~19 anos atrás)

Novo Comentário:

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