Criando sua Classe de Templates
Bom, primeiro pensamento a considerar: Por que fazer outro gerenciador de templates, se já existem antos, já está comprovado seu excelente funcionamento (como é o caso de PHPLib, PHP FastTemplate, etc), e, supostamente, são fáceis de usar?
Um pouquinho de história: Não tenho muito tempo de PHP, muito embora, já tenha um punhado de cabelos brancos, com outras linguagens :) Quando tentei entender e utilizar o funcionamento das bibliotecas de templates já existentes, apesar de haver assumido as enormes vantagens de utilizar estes recursos, assim como o uso de OOP com PHP, mas me choquei com dois pequenos inconvenientes: Primeiro: não entendia bem o que havia "por debaixo" destas funções e destes objetos, ou a própria forma correta de aplicar a técnica, e, segundo: não conseguia abtrair bem, sequer os principios mais intrínsecos da própia orientação a objetos de PHP.
Vivo (e trabalho), a 3 anos, no Paraguay, onde, ao contrário do que muitos pensam, não temos acesso fácil a livros e tecnologias ( sim, havia, alguns anos atrás, mas as coisas mudaram... ). Apelei para internet. Lí artigos, documentações, scripts, blogs, e tudo mais o que encontrava, mas sempre, como é natural, cada autor apresenta seu próprio estilo, sua própria óptica.
Decidí que, para conseguir entender um pouco mais do que era o trabalho destes programadores, como funcionava o tema todo, etc., iria construir meu próprio "parseador" para templates. Me armei de paciencia, café, bom humor, e outras indispensáveis companias, e... funcionou!!!
Como verão adiante, é um código bastante simples, realmente funciona, e, sem nenhum custo adicional, permite absorver, a partir de outro ponto de vista, mais algumas coisinhas de OOP para iniciantes (observe-se que eu também sou um iniciante eterno ).
O que é um template?
Sim, já sei! Polêmica de novo! Bom, para evitar discussões desnecessárias, vamos por esta observação: NO MEU PONTO DE VISTA, um template é uma técnica que permite ao programador separar seu código "pesado", lógico, da parte mais visual e "soft" do projeto, que é o design HTML.
E porque separar? Observe um programa comúm de PHP, feito com tudo misturado (lógica e HTML), e terá a resposta. Um programador mais "purista" olha e diz: "Que feio isto! um monte de comandos HTML, que não obedecem a nenhuma estruturação do sistema, junto com o restante :(". Um webmaster que olhe o mesmo programa vai dizer: "Arrrrgh! Não posso entender isto! Comandos HTML (lindos), misturados com um monte de linhas de programas. Ininteligível. Ninguém poderá dar manutenção nesta coisa!".
Agora, com um sistema de template, você cria seu programa, e, à parte, usa arquivos que são quase só HTML. Se você não for um especialista em HTML, poderá desenhar seu código visual, apenas com o mínimo necessário para que o sistema possa ser, digamos, apresentável. Se for um especialista, nada o impede de "complicar, como queira, seu HTML, colocando javascript, css, e coisas assim.
O importante é que, como a parte visual está separada da parte lógica, quando quiser alterar suas páginas, somente terá que preocuparse com seu HTML, sem medo de tocar, como normalmente acontece, naquela linhazinha que não parecia importar, mas que faz com que todo o seu sistema deixe de funcionar e te dá duas horas de dor de cabeça para deixar como era antes ( não faz parte do tema, mas, provavelmente, você ainda não tinha feito backup, não é??? Que feio!!! :) )
Além disto, seu código (tanto o lógico, como o HTML) será mais agradável, visualmente, mais flexível, e mais adaptável.
Um pouquinho de história: Não tenho muito tempo de PHP, muito embora, já tenha um punhado de cabelos brancos, com outras linguagens :) Quando tentei entender e utilizar o funcionamento das bibliotecas de templates já existentes, apesar de haver assumido as enormes vantagens de utilizar estes recursos, assim como o uso de OOP com PHP, mas me choquei com dois pequenos inconvenientes: Primeiro: não entendia bem o que havia "por debaixo" destas funções e destes objetos, ou a própria forma correta de aplicar a técnica, e, segundo: não conseguia abtrair bem, sequer os principios mais intrínsecos da própia orientação a objetos de PHP.
Vivo (e trabalho), a 3 anos, no Paraguay, onde, ao contrário do que muitos pensam, não temos acesso fácil a livros e tecnologias ( sim, havia, alguns anos atrás, mas as coisas mudaram... ). Apelei para internet. Lí artigos, documentações, scripts, blogs, e tudo mais o que encontrava, mas sempre, como é natural, cada autor apresenta seu próprio estilo, sua própria óptica.
Decidí que, para conseguir entender um pouco mais do que era o trabalho destes programadores, como funcionava o tema todo, etc., iria construir meu próprio "parseador" para templates. Me armei de paciencia, café, bom humor, e outras indispensáveis companias, e... funcionou!!!
Como verão adiante, é um código bastante simples, realmente funciona, e, sem nenhum custo adicional, permite absorver, a partir de outro ponto de vista, mais algumas coisinhas de OOP para iniciantes (observe-se que eu também sou um iniciante eterno ).
O que é um template?
Sim, já sei! Polêmica de novo! Bom, para evitar discussões desnecessárias, vamos por esta observação: NO MEU PONTO DE VISTA, um template é uma técnica que permite ao programador separar seu código "pesado", lógico, da parte mais visual e "soft" do projeto, que é o design HTML.
E porque separar? Observe um programa comúm de PHP, feito com tudo misturado (lógica e HTML), e terá a resposta. Um programador mais "purista" olha e diz: "Que feio isto! um monte de comandos HTML, que não obedecem a nenhuma estruturação do sistema, junto com o restante :(". Um webmaster que olhe o mesmo programa vai dizer: "Arrrrgh! Não posso entender isto! Comandos HTML (lindos), misturados com um monte de linhas de programas. Ininteligível. Ninguém poderá dar manutenção nesta coisa!".
Agora, com um sistema de template, você cria seu programa, e, à parte, usa arquivos que são quase só HTML. Se você não for um especialista em HTML, poderá desenhar seu código visual, apenas com o mínimo necessário para que o sistema possa ser, digamos, apresentável. Se for um especialista, nada o impede de "complicar, como queira, seu HTML, colocando javascript, css, e coisas assim.
O importante é que, como a parte visual está separada da parte lógica, quando quiser alterar suas páginas, somente terá que preocuparse com seu HTML, sem medo de tocar, como normalmente acontece, naquela linhazinha que não parecia importar, mas que faz com que todo o seu sistema deixe de funcionar e te dá duas horas de dor de cabeça para deixar como era antes ( não faz parte do tema, mas, provavelmente, você ainda não tinha feito backup, não é??? Que feio!!! :) )
Além disto, seu código (tanto o lógico, como o HTML) será mais agradável, visualmente, mais flexível, e mais adaptável.
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