+14

Criando sua Classe de Templates

criado por Sergio A. Pohlmann .'. em 17/01/2003 10:49am
Usando include

- Ah! Como fazemos?

A primeira coisa que podemos fazer, é, simplesmente separar o código em dois, sendo que o que chama comandos HTML fica em um arquivo, e o código PHP puro em outro. Para inserir o HTML dentro do PHP, utilizamos "include". Isto não é uma técnica muito bonita :) mas funciona.

Por exemplo, se você tem seu "pseudo" código HTML em um arquivo chamado 'mypage.tpl', e seu PHP em 'page.php' poderá incluir, como abaixo:

Observação importante:

Polêmica de novo :) Como vão ver mais adiante, meus comentários e nomes de arquivo, geralmente são em inglês (ingles de tarzan "mim fazer..."). O motivo, para mim, é simples:

- A pesar dos puristas da lingua, e dos bairristas, que vão dizer que deve estar bem documentado em português, eu acho que, como já temos a linguagem (PHP ou HTML, no caso) em inglês, fica mais claro e compreensível.

- Também podemos considerar que, universalmente, já se está aceitando que os programas estejam todinhos em inglês.

- Se, algum dia (rara possibilidade) algum de meus programas interessar a algum distante país "por aí" :) , minha documentação vai ser mais fácil.

- Aos que dizem ser difícil entender inglês, um conselho (grátis): Aprenda-lo, já!!! Vai ser difícil conseguir qualquer boa posição na área, sem conhecimento, ainda que básico, como o meu, da lingua inglesa.

- Finalmente, eu trabalho em um pais em que se fala espanhol. Então, já tenho outros puristas que diriam que, se estou no Paraguay, meus comentários e arquivos deveriam estar em espanhol. Vai que um dia destes, vou para a China, ou Japão ...

conteúdo de mypage.tpl:
<?php
echo "<HTML> <BODY>";
echo "<TITLE>minha página</TITLE>";
echo "<CENTER>Esta é minha página HTML/CENTER>";
echo "<HR></HR>";
?>


conteúdo de page.php:
<?php
// normal php code

include ("mypage.tpl");

// normal php code
?>

Sim, já dissemos isto! Muito feio, horrivel! Mas funciona!

Hummmmm! E se colocamos SOMENTE o código HTML em um arquivo de template. Pode ser que funcione! E, se podemos fazer isto, talvez seja possível que parte de nosso script possa até, entender alguma de nossas variáveis.

Usando eval

conteúdo de mypage.tpl:
<HTML>
<BODY>
<TITLE>minha página</TITLE>
<CENTER>$title</CENTER>     <--- Veja! Aqui usamos uma variável php
<HR></HR>
</BODY>
</HTML>

conteúdo de page.php:
<?php
// normal php code

$title = "Esta é minha página HTML"; // Variable definition

define("PAGE", addslashes(implode("", file("mypage.tpl"))));
$template=PAGE;
eval("\$newcode= \"$template\";");
echo $newcode;

// normal php code
?>

Observação de referência: Ví parte deste código em uma "Revista do Linux", aí, do Brasil. Só que não recordo número, página ou autor :( . Era um bom código, e me ajudou bastante. Fica a referência...

Entendendo o script

- UM MOMENTO!!!! Este código não é um template!!! E o anterior também não!!!

Beeeeeeem, calma!!! Já chegamos aí!

A função "file" le o arquivo, e põe em um array. Este array é, então, "implodido" (todos os elementos ficam em uma só variável), com a função "implode". O "addslashes" que está aí, põe as aspas necessárias para que eo interpretador PHP possa entender tudo como uma sequência de comandos.

Bom! Agora, a constante PAGE contém todo o código do arquivo (neste caso, 'mypage.tpl').

- Isto não é um template!!! :|

Tá bom! Paciência, já disse. Seguimos, devagar com o andor...

A variável $template contém, então, uma série de línhas, agora, com as necessárias aspas, para interpretar o conteúdo do arquivo.

Na linha que contém o "eval" PHP olha para a variável $template, e tenta interpretar seu conteúdo, colocando o resultado desta interpretação, na variável $newcode.

Agora, tudo o que falta, é escrever o novo código (justamente a variável $newcode). Fácil, né??? O feio disto, é que que temos umas linhas... ahammmm... intrometidas, em nosso código. Mas funciona!

- Uau! Mas, e o template??? Isto não é um template de verdade!!!\

Ah! Sim, é verdade. Isto ainda não pode ser considerado um verdadeiro template. Mas, só viemos até aqui, para preparar o caminho 8)

O motivo de que estas linhas fiquem assim, misturadas no programa, é porque a s variáveis estão definidas am âmbito local. Se quiséssemos colocar estas variáveis em outro arquivo (como em uma biblioteca), teríamos que usar variáveis globais (o que não é muito bom, neste caso), ou fabricar uma classe para trabalhar com os objetos do template. Este caso é mais elegante, mais simples, e lógico. ;)

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 (~11 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 (~12 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 (~12 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 (~12 anos atrás)

Marcio Coan disse:
muito bom Sergio, parabéns!
28/07/2005 11:35am (~13 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 (~13 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 (~13 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 (~13 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 (~13 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 (~14 anos atrás)

Novo Comentário:

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