+4

Ode a Templates

criado por Marcos Cardoso Jr em 29/07/2007 5:05pm
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:

<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.

Comentários:

Mostrando 1 - 10 de 12 comentários
Willian Silva disse:
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)

Willian Silva disse:
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 (~16 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.
09/08/2007 4:33am (~16 anos atrás)

Thiago Brito disse:
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!!
06/08/2007 7:04am (~16 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.
01/08/2007 7:38pm (~16 anos atrás)

Marcio Muzi disse:
* Nem um, nem outro
** A chave que fecha o método cadastrar foi parar acidentalmente depois do código do Smarty
31/07/2007 6:36am (~16 anos atrás)

Marcio Muzi disse:
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>
}
31/07/2007 6:31am (~16 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!
31/07/2007 4:00am (~16 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 (~16 anos atrás)

Novo Comentário:

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