Sistema básico de templates em PHP

Como em qualquer site dinâmico, existe o desenho e a disposição de todos os elementos que o compõem e o conteúdo que irá preencher o site com algo de útil para os utilizadores que o visitam. Mas algo que muitos programadores se esquecem quando desenvolvem um site dinâmico, é separação do código entre ambos. Com este artigo, pretendo mostrar como podemos desenvolver uma pequena classe que nos irá permitir separar de forma simples e básica o conteúdo de todos os outros elementos do site. Desenvolvendo assim, o código torna-se muito mais atraente e bem estruturado. Tudo isto recorrendo à linguagem de programação PHP.

Não faz parte deste artigo explicar detalhadamente cada linha e/ou acção apresentada no código, mas sim mostrar ao leitor como construir um simples e básico sistema de templates para os seus sites dinâmicos. Dito isto, espera-se que o leitor já possua conhecimentos básicos/moderados de PHP, nomeadamente em classes. No entanto, grande parte do código encontra-se comentado; apesar de ser em inglês, penso que poderá servir de ajuda a alguém.

Uma pequena nota antes de começarmos. Este tutorial é baseado num que vi há muitos anos atrás e, devido a esse distanciamento temporal, não posso precisar o seu autor nem facultar link para o artigo original. No entanto, aquilo que permanece do original é pouco mais que a ideia geral do artigo, já que o código sofreu bastantes modificações ao longo dos anos derivadas de todo o uso  que lhe dei para satisfazer as minhas necessidades que, penso, irão satisfazer também as vossas. De qualquer forma, o principio deste Sistema Básico de Templates mantém-se o mesmo e os créditos vão para o seu autor original que lamento não poder precisar.

Vamos então começar…

Estrutura da class

O nosso Sistema Básico de Templates (nome que decidi atribuir a esta classe) vai ser composto por apenas três funções e três variáveis comuns por toda a classe. Mais à frente irei explicar a utilidade de cada uma das funções e de cada uma das variáveis; para já, deixo o seguinte código que irá representar o “esqueleto” da nossa classe:

class BasicTemplateSystem {
   var $template_html = array();
   var $template_vars = array();
   var $template_path;

   function TemplateLoad($template) {

   }
   
   function TemplateDefine($references) {

   }

   function TemplateExport($template,
                           $getonly= false) {

   }
}

Começando pelo mais fácil, a variável $template_path irá apenas conter a localização no sistema operativo onde residem os ficheiros que fazem parte do nosso template. Certifique-se que o caminho aponta correctamente para a localização dos ficheiros ou o Sistema Básico de Templates não irá funcionar correctamente. Seguidamente, temos as variáveis $template_html e $template_vars. A primeira vai armazenar, sem quaisquer alterações, todo o código HTML que a função TemplateLoad() irá posteriormente obter dos mais diversos ficheiros. Já a segunda, irá armazenar as referências por nós definidas e o conteúdo pelo qual essas referências devem ser substituidas no código HTML armazenado na primeira variável.

Passando agora para as funções, a TemplateLoad(), como o próprio nome indica, serve para carregar os nossos templates. Esta função recebe apenas um parâmetro que indica o nome de cada ficheiro a carregar, bem como o nome pelo qual desejamos chamar o template. A função está construída de forma a que seja indiferente a passagem de apenas um ou de vários templates a carregar.

No caso da função TemplateDefine(), o nome já não significa tanto como na função anterior, mas isso não quer dizer nada porque é uma função ainda mais simples. A finalidade desta função é definir várias referências que irão existir nos nossos templates, bem como o conteúdo que irá substituir essas referências. Mas antes que estas referências sejam definidas, a função irá limpar todas as referências anteriormente criadas; as consequências desta acção irão ser explicadas posteriormente.

Por último, a função TemplateExport(), serve para processar todos os dados recolhidos nas funções anteriores. Ou seja, usando as referências lidas com o uso da função TemplateDefine(), procura por essas mesmas referências no código HTML carregado na função TemplateLoad() e substitui-as pelo conteúdo também obtido através da função TemplateDefine(). O código HTML processado com novo conteúdo irá ser devolvido pela função TemplateExport() após a substituição das referências pelo respectivo conteúdo.

No entanto, e como é bem possível que determinado template não necessite de ter alguma referência a ser substituída por conteúdo, esta função possui 2 parâmetros. O primeiro diz-nos qual o template que desejamos processar e o segundo, caso seja Verdadeiro—pois o seu valor predefinido é Falso—indica que apenas queremos que o código HTML seja devolvido sem necessitarmos de procurar por referências a substituir por conteúdo.