Utilizando PHP Templates
Olá,
pois é minha gente, eu estou vivo…
Quero falar sobre um assunto bastante interessante para quem está iniciando no PHP (assim como eu), uma das coisas mais comuns que costumam ocorrer quando estamos aprendendo PHP é que nós misturamos tudo, colocamos HTML, PHP, Javascript, Ábaco, Braille…. tudo em um mesmo arquivo, não é errado mas é feio e ruim de dar manutenção, além de nós mesmos nos perdermos no próprio código.
Vamos ver um exemplo de como isso acontece, preste atenção, esse assunto é de grande valia.
<html> <head> <title> Foo </title> </head> <body> Seja bem-vindo <? print $user; ?>, Hoje é, <? print date('d/m/Y'); ?>. </body> </html>
Bem, como você já sabe, o código acima irá imprimir dentro de uma página formatada em HTML o seguinte:
Seja bem-vindo Rafael,
Hoje é 13/02/2010.
Supondo que a variável $user possua o valor “Rafael” e a data neste caso seria a data atual do sistema, claro.
Bem, não está errado fazer isso e ainda não está confuso, mas vamos imaginar tags e funções PHP por todo o HTML,
imagine uma área que precisa exibir diversos dados…
É, a coisa começa a ficar bem confusa, chega um momento em que já não sabemos qual a extensão daquele arquivo, PHP ou HTML.
Isso é um pequeno exemplo, diria mínimo em relação aos que você já fez… Tabelas HTML com laços PHP no meio e outras coisas que sempre encontramos
um motivo para usa-las.
O ideal seria escrevermos apenas PHP no arquivo PHP, apenas HTML no arquivo HTML, mas de uma forma que possamos passar os dados do PHP para o HTML formatado, é claro.
Para isso nós fazemos o uso de templates, utilizando classes PHP para carregar um arquivo formatado em HTML e passando para ele os valores vindos do PHP, tais como resultado de
consultas ao banco de dados e até os exemplos que já vimos acima.
A idéia, à grosso modo é separar o código PHP do HTML, imagine um designer alterando o layout de uma página onde ele precisa fazer manobras para não mudar acidentalmente alguma rotina em PHP que está inserida no HTML…. imaginou né? Pense na preocupação do cara em mover códigos que talvez ele não entenda… pois é, o ideal é que ele entenda
perfeitamente o que está movendo/alterando, tirando do lugar…
Hoje existem diversas classes cujo uma das finalidades é justamente separar os códigos/arquivos, talvez uma das mais utilizadas seja a Smarty.
Docs em português do Smarty: http://www.smarty.net/manual/pt_BR
Não irei comentar sobre os métodos do Smarty, não é dele que quero falar, visite agora a documentação no link acima, dê uma breve olhada e somente depois continue à ler este post.
Já viu? ow loko!
É, quem disse que é tão fácil usar templates? Eu disse que é bom, fácil não… ao menos para nós. meros aprendizes!
Perceba o grau de complexidade em que chega a utilização de templates, não desanimem ainda amiguinhos…
Eu sempre quis utilizar templates, vi o Smarty e pensei “vou usar em tudo…”, é coisa de principiante mesmo ha-ha…
Foi quando eu percebi que teria que aprender além do PHP, o Smarty… é bixo, esse cara é enjoado, você precisa de tempo para utiliza-lo em coisas pequenas,
talvez nem compense nestes casos em que não há um padrão de projeto, são os casos de pequenos programinhas que fazemos para mostrar para os amigos…
Mas eu não desisti não, eu quero usar templates pow… ou ao menos separar os códigos/arquivos, bem, escrevi uma humilde classe para que pessoas leigas, assim como eu,
possam utilizar o mardito template.
Vejamos ao mesmo exemplo utilizado no ínicio desse post que já deve estar te cansando… ow acorda aê… lê o resto cara!
Vamos utilizar essa classe que criei, criaremos o bom e velho index.php
<? # incluindo a classe Template require_once 'class/Template.class.php'; # criando um array com os valores que queremos passar ao HTML $data = array( 'dataHoje' => date('d/m/Y) , 'usuario' => 'Rafael' ); # criando o objeto Template $tpl = new Template; # passando o array com dados que serão passados ao template $tpl->data($data); # informando o nome do arquivo html e exibindo o template $tpl->display('welcome.html'); ?>
Agora vamos ver como fica o arquivo HTML (welcome.html)
<html> <head> <title> Foo </title> </head> <body> Seja bem-vindo {usuario}, Hoje é {dataHoje} </body> </html>
Bem, vamos a explanação do código PHP,
1 – Começamos incluido o arquivo da classe template, neste caso ele está dentro do diretório classes.
2 – Criamos um array com os indíces “dataHoje” e “usuario” e seus respectivos valores.
3 – Criamos o objeto Template
4 – Chamamos o método ->data($array) que recebe nosso array com os valores informados
5 – Chamamos o método ->display(‘template.html’) para informar o arquivo onde exibiremos os dados
Agora vamos ao código HTML,
1 – O local onde temos {dataHoje} será substituido pelo valor contido no índice ‘dataHoje’ de nosso array, neste caso a data atual do sistema.
2 – O local onde temos {usuario} será substituido pelo valor contido no índice ‘usuario’ de nosso array, neste caso ‘Rafael’.
Feito isso, vamos chamar no browser não o arquivo welcome.html e sim o arquivo index.php que irá ler o HTML, substituir os valores e renderizar
a nossa página (supostamente) formatada.
Para você entender o que ocorre, é o seguinte:
– A classe Template utiliza o array passado com os valores, lê o arquivo HTML e substitui tudo que estiver dentro de {…} pelo valor contido no array.
Para isso é preciso que haja no array um índice com o mesmo nome contido em {…} no HTML, ou seja,
Se existe no array o índice ‘usuario’ e no HTML existe {usuario} então o local do HTML que contém {usuario} será substituido pelo valor do índice…
Vamos construir a cena, imagine o seguinte array no PHP:
$dados = array ( ‘ nome ‘ => ‘ Rafael ‘ , ‘ email ‘ => ‘ [email protected] ‘ );
Agora no arquivo HTML:
<p> Nome: {nome} </p>
<p> E-mail: {email} </p>
Logo,
{nome} será substituído por Rafael
{email} será substituído por [email protected]
É isso que ocorre ao se utilizar a classe Template criada por mim.
Particularmente, eu salvo os arquivos (HTML) com extensão .tpl (template), ou seja, para mim ficaria
welcome.tpl o nome do arquivo com códigos HTML
e chamo o método $tpl->display( ‘welcome.tpl’ );
Perceba que preciso passar a extensão do arquivo.
No geral os arquivos de template (HTML) ficam, por padrão, dentro do diretório “views/”, mas você pode alterar o diretório chamando o método:
$tpl->setDir( ‘minhasViews/’ );
Supondo que “minhasViews/” seja seu diretório de templates, é claro, logo você teria que fazer:
<? require_once 'class/Template.class.php'; $data = array( 'dataHoje' => date('d/m/Y) , 'usuario' => 'Rafael' ); $tpl = new Template; $tpl->setDir('minhasViews/'); $tpl->data($data); $tpl->display('welcome.html'); ?>
Sintaxe alternativa:
<? require_once 'class/Template.class.php'; $data = array ( 'nome ' => 'Rafael Clares' ); $tpl = new Template; $tpl->data($data)->display('welcome.html'); ?>
Bem, no geral é isso pessoal, existe ainda o método ->cache para utilização em cache para agilizar o processo mas isso depende do MemCache instalado,só falarei desse assunto se eu perceber interesse sobre essa classe de template e ainda se estiverem sem dúvida alguma em relação a utilização da mesma,do contrário nem adianta eu entrar no assunto “cache” desta classe.
Seguem os links:
Exemplo proposto em ação: Simple Template Class
Download: fonte
Até o próximo Post, previsto para, quem sabe né…
Um forte abraço à todos.
Rafael Clares
Obrigado por esse post, irei repassar para os companheiros de trabalho pois aqui ainda temos o hábito da salada mista, rs… pois temos uma sincronia bem legal de trabalhar e nem vemos dificuldades nisso, mas é sempre bom evoluir. Outra porque sou designer gráfico e de interfaces, mas sempre fui apaixonado por códigos e também sou mero aprendiz e gostei disso irei estudar.
Abraço
Eliseu, obrigado pelo comentário, salada mista é o quê há hehehehe….
Sou admirador do seu trabalho, sempre que posso dou uma olhada no seu portfólio, muito bacana.
Forte abraço,
Oi Rafael, obrigado por isso e agradeço o elogio vindo de você. Estou preparando uma novar versão do site com os novos projetos que não foram publicados em 2009 e 2010, em breve tenho novidades e te aviso caso queira visitar.
Abraços
Fala Rafael, parabens pelo post, muito interessante, o Smarty realmente tem uma curva de aprendizado longa, me dexa tirar uma dúvida, como eu faria para usar loops(foreach, for, while) e if’s nesse esquema de templates? Abraços, parabens pela iniciativa.
Cristiano, obrigado pelo comentário.
Então, a idéia é que o arquivo de template não tenha código PHP, vou dar um exemplo de como passar os dados do laço para o template.
$links = array(
'Google' => 'www.google.com',
'Yahoo' => 'www.yahoo.com',
'Aol' => 'www.aol.com'
);
$foo = '';
foreach ($links as $url)
{
$foo .= " $url ";
}
$data = array ('links' =>$foo );
$tpl->data($data);
$tpl->display('welcome.html');
até ai tudo bem, já tinha sacado a ideia, mas e lá no template como ficaria? imagine que seja pra montar um select…
…
deu pra entender a dúvida?
abraços e obrigado pela resposta! até mais
Cristiano, entendi sim… A questão é que você pode passar o select montado para o template e mantendo a idéia de nao ter PHP no arquivo de template.
Para enviar um select, no arquivo PHP, supondo que os dados do foreach sao veio do sql por exemplo, você vai fazer:
$options = '';
foreach( $rows as $item )
{
$itemId = $item['id'];
$itemVal = $item['valor'];
$options .= "<option id=$itemId value=$itemVal>";
}
$data = array( 'myOptions' => $options )
.
.
.
$tpl->data( $data );
No template você só precisa de:
<select>
<option> selecione um item...
{myOptions}
</select >