Ode a Templates
Muito se fala em usar ou não Templates. Afinal, que maravilha seria separar o código PHP do HTML, não é mesmo? Quando me deparei com essa dúvida, fui atrás de fóruns de várias comunidades PHP. A sonora maioria dizia:
"Use Templates... é a uma grande opção para entender melhor o código."
"É a melhor forma de separar o trabalho do programador do trabalho de designer"
E até exageros como:
"Não sei como eu programava antes sem usar templates"(!)
Depois que li isso tudo, pensei ser o único estúpido da face da Terra que não programa utilizando templates. E pra achar o melhor template, novamente a sonora maioria dizia que o Smarty era a melhor opção, tanto em performance, quanto em legibilidade e simplicidade do código.
Após dois dias estudando o Smarty, não vi melhora em nada. Contudo, como a sonora maioria dizia que era a melhor opção, resolvi me aprofundar um pouco mais. Quanto mais eu estudava, mais eu achava que estava certo. E mais eu queria estar errado. Eu nunca fui de nadar contra a corrente. Até que eu decidi gastar 1/3 do meu sofrido salário de bolsista de Iniciação Científica para comprar um livro de PHP avançado que explicava com detalhes o template Smarty.
"Agora sim, irei usar essa fabulosa técnica". Mas nem o vazio da minha conta bancária me convenceu.
Pela reação calorosa beneficiando o Smarty e outros templates, sei que nesse momento eu devo estar sendo tanto odiado quanto o Bush (epa, quem começou a brincadeira dos exageros não fui eu!). Mas está na hora de explicar o por que do meu não agrado com templates.
Antes disso, recomendaria que vocês lessem o livro "Better, Faster, Lighter Java". Apesar de ser voltado pra linguagem Java, a idéia que o autor passa serve para qualquer linguagem. Em poucas palavras, ele retrata um ente que eu já refletia há certo tempo: "O de programar para dar sustentação à própria programação". E isso em Java tem aos montes!
Para exemplificar melhor, há uma história engraçada que ele relata no livro que é mais ou menos assim (não sei a história decorada):
"O autor certo dia foi trabalhar voluntariamente no México, na criação de casas populares. No começo do dia, ele tinha que misturar todo o cimento manualmente. Isso o deixava muito cansado pelo resto do dia. Até que ele chegou para o gerente de obras e perguntou por que não compravam um misturador de cimento automático. Eis a resposta do gerente:
‘Boa idéia, mas quem irá mexer nessa máquina? Ela é complexa, e precisa de tempo para ser aprendida.
Outra coisa, quem irá carregá-la de um lugar a outro? Não temos caminhonetes aqui, apenas vans. E essas máquinas são muito pesadas. Precisa de várias pessoas para carregá-las de uma cidade a outra. É impraticável.
Mais um ponto, aonde iremos armazená-la? Ela é muito grande, e precisaríamos criar um depósito para tal.’
Até que o autor se convenceu que a obra não tinha estrutura para suportar tal máquina".
Pois bem, mas o que eu pretendia exemplificar era o porque de não concordar com o uso de templates. Vou explicar minha visão explicando de uma forma diferente: mostrando as qualidades do Smarty e argumentando em cima delas.
1) "De forma resumida, o objetivo dos modelos é separar a lógica de programação da lógica de exibição... Para o designer, é mais fácil entender lidar com os elementos de um sistema de templates do que um código de programação PHP."
Abaixo anexo um exemplo de código ".tpl" tirado de um livro:
Você acha que o designer terá menos trabalho com esses códigos do Smarty embutidos? Não seria muito mais fácil nós programadores criarmos códigos PHP bem elaborados para o designer colocar simplesmente um include e a função desejada?
Realmente, isso é separar o código PHP do HTML, mas separou o HTML do código do Smarty? Sinceramente, acho que é trocar seis por meia dúzia.
2) "O código PHP torna-se mais simples e legível"
Exemplo de código PHP para trabalhar com o Smarty:
Mais simples e legível? Pode-se criar páginas HTML com um padrão de codificação muito bem escrito. O PEAR possui um. Houve até um artigo que falava sobre isso aqui no phpbrasil. E essas outras especificações do Smarty? Tudo bem, é simples, mas leva um tempo para se aprender. E não são todas as pessoas que tem conhecimento sobre o Smarty. Ou seja, um outro programador PHP pode olhar esse código e levar um tempo para entender. Então, seria mais simples fazer um código PHP bem documentado, coeso, de acordo com o PEAR, por exemplo. Ou não?
3) "Portanto, você tem duas opções: ter um código confuso e atingir o máximo de desempenho em suas aplicações ou melhorar a compreensão e manutenção do seu código, apesar de perder um pouco de desempenho."
Apesar do sistema de cache que o Smarty possui, não podemos negar que a perda de performance é notável. Aliás, o autor esqueceu que podemos ter uma terceira opção: Ter o máximo de desempenho e o código legível. Pois bem, podemos fazer isso sim.
Estou montando uma arquitetura para projetos onde trabalho. Mas tem um princípio básico: o bom uso de includes. Podemos montar arquivos só com código PHP e darmos um simples include e chamar a função no HTML. Não mais do que isso. Essa opção foi descrita, corajosamente, por um dos leitores do phpbrasil. E foi rejeitada por muitos, claro.
Eu poderia escrever mais e mais e mais, sendo que seria era um livro, não um artigo.
NÃO estou dizendo que o Smarty ou qualquer outro tipo de template não deve ser usado de maneira alguma. Esse artigo reflete a minha opinião. Mais uma coisa: não sou uma pessoa radical. Você consegue me convencer facilmente. É só ter um bom argumento que mudo de idéia. Mas devo informar, que não achei nenhum bom argumento que pudesse me convencer sobre o uso de templates. Não até agora. Opiniões serão bem vindas.
Outra coisa são os escopos dos projetos. Cada projeto pode ter uma solução diferente. E isso é uma decisão de equipe. Onde trabalho, já construí sistema pequenos, médios e grandes. Nenhum deles, contudo, vi a necessidade de se usar templates.
Isto não quer dizer que não uso nada, além do puro PHP. Acho fantástico o uso de abstração para acesso a bando de dados. Não importa qual o banco, você acessa de forma simples e viável. Dois bons exemplos são a extensão dbx e as classes PEAR::DB e PEAR::MDB. Mas isso é conversa para outro artigo.
Bom, é isso. Já estou esperando as notas zeros para esse artigo. Sem problemas.
Abraços a todos, e por favor, não me odeiem.
"Use Templates... é a uma grande opção para entender melhor o código."
"É a melhor forma de separar o trabalho do programador do trabalho de designer"
E até exageros como:
"Não sei como eu programava antes sem usar templates"(!)
Depois que li isso tudo, pensei ser o único estúpido da face da Terra que não programa utilizando templates. E pra achar o melhor template, novamente a sonora maioria dizia que o Smarty era a melhor opção, tanto em performance, quanto em legibilidade e simplicidade do código.
Após dois dias estudando o Smarty, não vi melhora em nada. Contudo, como a sonora maioria dizia que era a melhor opção, resolvi me aprofundar um pouco mais. Quanto mais eu estudava, mais eu achava que estava certo. E mais eu queria estar errado. Eu nunca fui de nadar contra a corrente. Até que eu decidi gastar 1/3 do meu sofrido salário de bolsista de Iniciação Científica para comprar um livro de PHP avançado que explicava com detalhes o template Smarty.
"Agora sim, irei usar essa fabulosa técnica". Mas nem o vazio da minha conta bancária me convenceu.
Pela reação calorosa beneficiando o Smarty e outros templates, sei que nesse momento eu devo estar sendo tanto odiado quanto o Bush (epa, quem começou a brincadeira dos exageros não fui eu!). Mas está na hora de explicar o por que do meu não agrado com templates.
Antes disso, recomendaria que vocês lessem o livro "Better, Faster, Lighter Java". Apesar de ser voltado pra linguagem Java, a idéia que o autor passa serve para qualquer linguagem. Em poucas palavras, ele retrata um ente que eu já refletia há certo tempo: "O de programar para dar sustentação à própria programação". E isso em Java tem aos montes!
Para exemplificar melhor, há uma história engraçada que ele relata no livro que é mais ou menos assim (não sei a história decorada):
"O autor certo dia foi trabalhar voluntariamente no México, na criação de casas populares. No começo do dia, ele tinha que misturar todo o cimento manualmente. Isso o deixava muito cansado pelo resto do dia. Até que ele chegou para o gerente de obras e perguntou por que não compravam um misturador de cimento automático. Eis a resposta do gerente:
‘Boa idéia, mas quem irá mexer nessa máquina? Ela é complexa, e precisa de tempo para ser aprendida.
Outra coisa, quem irá carregá-la de um lugar a outro? Não temos caminhonetes aqui, apenas vans. E essas máquinas são muito pesadas. Precisa de várias pessoas para carregá-las de uma cidade a outra. É impraticável.
Mais um ponto, aonde iremos armazená-la? Ela é muito grande, e precisaríamos criar um depósito para tal.’
Até que o autor se convenceu que a obra não tinha estrutura para suportar tal máquina".
Pois bem, mas o que eu pretendia exemplificar era o porque de não concordar com o uso de templates. Vou explicar minha visão explicando de uma forma diferente: mostrando as qualidades do Smarty e argumentando em cima delas.
1) "De forma resumida, o objetivo dos modelos é separar a lógica de programação da lógica de exibição... Para o designer, é mais fácil entender lidar com os elementos de um sistema de templates do que um código de programação PHP."
Abaixo anexo um exemplo de código ".tpl" tirado de um livro:
<html> <body> <div align="center"> <table border="0" cellspacing="0" width="60%"> <tr> <td width="50%" bgcolor="#E8E8E8"> <font size="5">Confira as últimas notícias!</font> </td> <td width="50%" bgcolor="#E8E8E8"> <p align="right">{$smarty.now|date_format:"%d/%m/%Y"} </td> </tr> <tr> <td width="100%" colspan="2" bgcolor="#FBFBFB"><br> {section name=i loop=$titulos} <p><u>{$titulos[i]}</u> ({$datas[i]|date_format:"%d/%m/%Y %H:%M"})<br> {$textos[i]|truncate:150} [<a href="mostra_noticia.php?id={$ids[i]}">Leia mais</a>]</p> {/section} </td> </tr> </table> </div> </body> </html>
Você acha que o designer terá menos trabalho com esses códigos do Smarty embutidos? Não seria muito mais fácil nós programadores criarmos códigos PHP bem elaborados para o designer colocar simplesmente um include e a função desejada?
Realmente, isso é separar o código PHP do HTML, mas separou o HTML do código do Smarty? Sinceramente, acho que é trocar seis por meia dúzia.
2) "O código PHP torna-se mais simples e legível"
Exemplo de código PHP para trabalhar com o Smarty:
<?php // ------ acesso ao banco de dados ---------- $servidor = "localhost"; $usuario = "x"; $senha = "x"; $banco = "x"; $con = mysql_connect($servidor, $usuario, $senha); mysql_select_db($banco); $res = mysql_query("SELECT * FROM noticias ORDER BY data_hora DESC LIMIT 3"); $num_linhas = mysql_numrows($res); for($i = 0; $i < $num_linhas; $i++) { $array_ids[] = mysql_result($res,$i,"id"); $array_titulos[] = mysql_result($res,$i,"titulo"); $array_textos[] = mysql_result($res,$i,"texto"); $array_datas[] = mysql_result($res,$i,"data_hora"); } mysql_close($con); // ---- define variáveis e exibe o template ---- require('Smarty.class.php'); $smarty = new Smarty; $smarty->assign("ids", $array_ids); $smarty->assign("titulos", $array_titulos); $smarty->assign("textos", $array_textos); $smarty->assign("datas", $array_datas); $smarty->display("index.tpl"); ?>
Mais simples e legível? Pode-se criar páginas HTML com um padrão de codificação muito bem escrito. O PEAR possui um. Houve até um artigo que falava sobre isso aqui no phpbrasil. E essas outras especificações do Smarty? Tudo bem, é simples, mas leva um tempo para se aprender. E não são todas as pessoas que tem conhecimento sobre o Smarty. Ou seja, um outro programador PHP pode olhar esse código e levar um tempo para entender. Então, seria mais simples fazer um código PHP bem documentado, coeso, de acordo com o PEAR, por exemplo. Ou não?
3) "Portanto, você tem duas opções: ter um código confuso e atingir o máximo de desempenho em suas aplicações ou melhorar a compreensão e manutenção do seu código, apesar de perder um pouco de desempenho."
Apesar do sistema de cache que o Smarty possui, não podemos negar que a perda de performance é notável. Aliás, o autor esqueceu que podemos ter uma terceira opção: Ter o máximo de desempenho e o código legível. Pois bem, podemos fazer isso sim.
Estou montando uma arquitetura para projetos onde trabalho. Mas tem um princípio básico: o bom uso de includes. Podemos montar arquivos só com código PHP e darmos um simples include e chamar a função no HTML. Não mais do que isso. Essa opção foi descrita, corajosamente, por um dos leitores do phpbrasil. E foi rejeitada por muitos, claro.
Eu poderia escrever mais e mais e mais, sendo que seria era um livro, não um artigo.
NÃO estou dizendo que o Smarty ou qualquer outro tipo de template não deve ser usado de maneira alguma. Esse artigo reflete a minha opinião. Mais uma coisa: não sou uma pessoa radical. Você consegue me convencer facilmente. É só ter um bom argumento que mudo de idéia. Mas devo informar, que não achei nenhum bom argumento que pudesse me convencer sobre o uso de templates. Não até agora. Opiniões serão bem vindas.
Outra coisa são os escopos dos projetos. Cada projeto pode ter uma solução diferente. E isso é uma decisão de equipe. Onde trabalho, já construí sistema pequenos, médios e grandes. Nenhum deles, contudo, vi a necessidade de se usar templates.
Isto não quer dizer que não uso nada, além do puro PHP. Acho fantástico o uso de abstração para acesso a bando de dados. Não importa qual o banco, você acessa de forma simples e viável. Dois bons exemplos são a extensão dbx e as classes PEAR::DB e PEAR::MDB. Mas isso é conversa para outro artigo.
Bom, é isso. Já estou esperando as notas zeros para esse artigo. Sem problemas.
Abraços a todos, e por favor, não me odeiem.
Eu testei o Smarty aqui e não vi dificuldade nenhuma. Porém o que eu percebir nele, é que ele faz o que os templates jurássicos(includes) já fazem a muito tempo.
01/06/2009 2:04pm
(~15 anos atrás)
Existe uma outra maneira de se trabalhar com sistemas monstruosos em PHP sem os templates? Se tiver alguem pode me indicar, posi estou querendo desenvolver um sistema grande(desculpe-me, mas não posso revelar que tipo).
01/06/2009 2:03pm
(~15 anos atrás)
Em codigos longos, o Smarty ajuda muito, essa é o principal motivo de eu utilizar nos meus projetos, sendo que para o designer ainda acho que é vantajoso a sua utilização, pois é ainda mais simples que usar o próprio PHP.
04/09/2007 2:58pm
(~17 anos atrás)
Particularmente eu acredito que não existe aplicação ruim, existe código com pouca legibilidade. Não gosto muito de usar frameworks porque não gosto de me sentir preso e gosto de entender cada linha do que estou fazendo. Acredito que a chave para uma boa aplicação é fazero o uso do padrão MVC, ou seja separar o Modelo, da Visualiação e do Controle. A utilização de classes e orientação a objetos é uma boa saída.
Um abraço.
Um abraço.
09/08/2007 4:33am
(~17 anos atrás)
Cara...
eu penso o seguinte..
o doidão só quis expressar a sua opnião.. eu particularmente.. como designer.. acho horrivel ter q estudar programação pra poder entender o smarty.. jooomla... mambo.. enfim.. todos esses cms's q estão por ai... meu jah como programador..(pq eu faço as duas coisas) eu acho mto ruim ter q mudar toda a minha maneira de programar pq existem ferramentas q o façam... isso é de cada um.. pq se tu entrar numa empresa q não trabalha dessa maneira e vc estiver bitolado da maneira como tu trabalha.. provavelmente vai pastar um poko.. e vice versa... então eu prefiro estar a par de cada coisa... entender um poko sobre as coisas q estão rolando..
tabless.. templates.. cms.. jooomla.. mambo.. smarty... aff.. é tanta coisa cara q as vezes os programadores se esquecem de fazer algo q atenda a necessidade do seu cliente... de criar ferramentas novas.. e FACILITAR a vida do internauta q está do outro lado..
é isso ae...
experimente tudo.. faça tudo.. mas lembre q pessoas q não sabem o que é um mouse tbm acessam e navegam..
Paz a todos!!
eu penso o seguinte..
o doidão só quis expressar a sua opnião.. eu particularmente.. como designer.. acho horrivel ter q estudar programação pra poder entender o smarty.. jooomla... mambo.. enfim.. todos esses cms's q estão por ai... meu jah como programador..(pq eu faço as duas coisas) eu acho mto ruim ter q mudar toda a minha maneira de programar pq existem ferramentas q o façam... isso é de cada um.. pq se tu entrar numa empresa q não trabalha dessa maneira e vc estiver bitolado da maneira como tu trabalha.. provavelmente vai pastar um poko.. e vice versa... então eu prefiro estar a par de cada coisa... entender um poko sobre as coisas q estão rolando..
tabless.. templates.. cms.. jooomla.. mambo.. smarty... aff.. é tanta coisa cara q as vezes os programadores se esquecem de fazer algo q atenda a necessidade do seu cliente... de criar ferramentas novas.. e FACILITAR a vida do internauta q está do outro lado..
é isso ae...
experimente tudo.. faça tudo.. mas lembre q pessoas q não sabem o que é um mouse tbm acessam e navegam..
Paz a todos!!
06/08/2007 7:04am
(~17 anos atrás)
Também não concordo com a afirmação que o Smarty seja tão simples para os designers. Normalmente eles fogem de qualquer tipo de programação, até Javascript.
Eu pessoalmente uso, em todas as minhas aplicações a combinação XML+XSL, fazendo com que o php gere um XML com as informações a serem montadas na página. O XSL é um arquivo estático que diz como a saída vai ser gerada (html ou xml, rss, texto puro...). Só ele será editado pelos designers. Depois uso um 'parser' para gerar a saída. O meu arquivo 'parser.php' é único e é compartilhado por todas as aplicações em PHP.
Se for pra aprender outra linguagem para se usar nos templates, prefiram esta. O XSLT é uma linguagem muito dinâmica. Pode ou não se usar estruturas de repetição, decisão, etc. No w3schools tem uma boa documentação e os templates podem ser usados em outras linguagens sem dificuldade. (No meu trabalho, compartilho com a galera do Java)
Mesmo tendo que fazer a galera aprender outra linguagem (não mais complicada que o Smarty), esta serve para muitas outras coisas. Acho importante o uso de qualquer tipo de template pois isso traz a vantagem do seu código não ficar exposto 'à edição do designer' (já tive muitas dores de cabeça com isso).
Estou pensando em escrever e publicar um artigo sobre o assunto, se houver quem se interesse. Aguardo apoio.
Eu pessoalmente uso, em todas as minhas aplicações a combinação XML+XSL, fazendo com que o php gere um XML com as informações a serem montadas na página. O XSL é um arquivo estático que diz como a saída vai ser gerada (html ou xml, rss, texto puro...). Só ele será editado pelos designers. Depois uso um 'parser' para gerar a saída. O meu arquivo 'parser.php' é único e é compartilhado por todas as aplicações em PHP.
Se for pra aprender outra linguagem para se usar nos templates, prefiram esta. O XSLT é uma linguagem muito dinâmica. Pode ou não se usar estruturas de repetição, decisão, etc. No w3schools tem uma boa documentação e os templates podem ser usados em outras linguagens sem dificuldade. (No meu trabalho, compartilho com a galera do Java)
Mesmo tendo que fazer a galera aprender outra linguagem (não mais complicada que o Smarty), esta serve para muitas outras coisas. Acho importante o uso de qualquer tipo de template pois isso traz a vantagem do seu código não ficar exposto 'à edição do designer' (já tive muitas dores de cabeça com isso).
Estou pensando em escrever e publicar um artigo sobre o assunto, se houver quem se interesse. Aguardo apoio.
01/08/2007 7:38pm
(~17 anos atrás)
* Nem um, nem outro
** A chave que fecha o método cadastrar foi parar acidentalmente depois do código do Smarty
** A chave que fecha o método cadastrar foi parar acidentalmente depois do código do Smarty
31/07/2007 6:36am
(~17 anos atrás)
Não concordo com quem diz que é trocar 6 por 1/2 dúzia e nem com quem diz para usar sempre o Smarty.
Observando esse código estruturado e ruim, pelo visto o autor do livro se preocupou mais com as vendas do que dar bons exemplos do Smarty.
No meu caso obtive vantagens do Smarty somente quando comecei a programar utilizando arquitetura MVC.
Segue um exemplo de como pode ser simples um código utilizando o Smarty.
No meu módulo de usuário, o método que chama a tela de cadastro na classe "UsuarioView", passa a listagem de UF:
/**
* @name cadastrar
* @access public
*/
public function cadastrar() {
$colUf = AppFactory::getComponent( 'Localidade' )->listarUF();
$this->assign("colUf", $colUf);
$this->display( self::templateDir . "/cadastrar.tpl" );
E no Smarty...
<select name="codUf" onchange="listarCidade( this )">
<option value="">Selecione:</option>
{foreach key=key item=itemUf from=$colUf}
<option value="{$itemUf->codUf}">{$itemUf->siglaUf}</option>
{/foreach}
</select>
}
Observando esse código estruturado e ruim, pelo visto o autor do livro se preocupou mais com as vendas do que dar bons exemplos do Smarty.
No meu caso obtive vantagens do Smarty somente quando comecei a programar utilizando arquitetura MVC.
Segue um exemplo de como pode ser simples um código utilizando o Smarty.
No meu módulo de usuário, o método que chama a tela de cadastro na classe "UsuarioView", passa a listagem de UF:
/**
* @name cadastrar
* @access public
*/
public function cadastrar() {
$colUf = AppFactory::getComponent( 'Localidade' )->listarUF();
$this->assign("colUf", $colUf);
$this->display( self::templateDir . "/cadastrar.tpl" );
E no Smarty...
<select name="codUf" onchange="listarCidade( this )">
<option value="">Selecione:</option>
{foreach key=key item=itemUf from=$colUf}
<option value="{$itemUf->codUf}">{$itemUf->siglaUf}</option>
{/foreach}
</select>
}
31/07/2007 6:31am
(~17 anos atrás)
O mais importante é estruturar, organizar o projeto, usar código legível e documentado. Esse lance de que Smarty é mais fácil para os designers é balela... Eles não gostam de linguagens de programação (há excessões, claro), seja Smarty, PHP, JSP, etc... O cenário comum em 99% dos casos é o designer criar o layout e passar para o programador "colocar o código", ou seja, o que eu sempre vejo é o programador trabalhando com Smarty, e não os designers.
O legal é ver que há programadores com visão crítica, que não absorvem tudo aquilo que a unanimidade prega.
Como diz o ditado: "a unanimidade é burra".
PS: Eu uso Smarty há um bom tempo, e gosto muito!
O legal é ver que há programadores com visão crítica, que não absorvem tudo aquilo que a unanimidade prega.
Como diz o ditado: "a unanimidade é burra".
PS: Eu uso Smarty há um bom tempo, e gosto muito!
31/07/2007 4:00am
(~17 anos atrás)
Também concordo com o autor. Também acho que que a boa estruturação/organização do código PHP é muito válido e recomendável de se ter na programação do mesmo.
31/07/2007 3:46am
(~17 anos atrás)