• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

taviroquai

Sistema de template para PHP / mySql: my_template

4 mensagens neste tópico

Olá a todos,

De volta aos templates...

Venho apresentar aqui um simples sistema de templates para PHP / mySql. Tenho estado a desenvolver isto por várias razoes:

1. Ainda não me dediquei a "aprender" um sistema de template já feito e completo, tal como o Smarty, por achar que estes são demasiados extensivos em funcionalidades, quase que obrigando o utilizador a decorar uma enorme biblioteca;

2. Não gosto da forma como alguns sistemas destes misturam a parte lógica (desta forma PHP) com a apresentação (HTML): por exemplo, metendo "pseudo-codigo" dentro de HTML;

3. Já desenvolvi algumas coisas em PHP / mySql e preciso de uma base simples mas versátil para futuras aplicações.

O que é que este sistema tem de diferente dos outros?

Este sistema baseia-se em dois fundamentos:

1. Separar, quase por completo, a parte lógica da apresentação, recorrendo a pastas e ficheiros; numa equipa de pelo menos dois (um webdesigner e um programador) dito de grosso modo, o 1º vai trabalhar apenas nas pastas HTML e CSS, enquanto que o segundo trabalha na pasta principal, SQL e JS.

Cada "parte" ou módulo funcional que se quer implementar terá sempre ficheiros HTML (e CSS se necessário), ficheiros PHP e ficheiros SQL.

2. As funções (são 9 funções) deste my_template vão permitir a união das partes de Apresentação (ou Views), Funcionalidade (ou Controlers) e Acesso a Dados. Portanto, não existe parsing de ficheiros template como faz o Smarty e muitos outros.

Este sistema ainda não está acabado mas já funciona. Um dos objectivo será passá-lo para Object Oriented.

A título de exemplo, quando queremos apresentar uma tabela html com dados dinamicos, com Smarty criamos um arreio:

// assign an associative array of data
$smarty->assign('users', array(
array('name' => 'bob', 'phone' => '555-3425'),
array('name' => 'jim', 'phone' => '555-4364'),
array('name' => 'joe', 'phone' => '555-3422'),
array('name' => 'jerry', 'phone' => '555-4973'),
array('name' => 'fred', 'phone' => '555-3235')
));

// display it
$smarty->display('index.tpl');

e o template terá um pseudo código a ser interpretado pelo Smarty, misturado com html:

<table>
{section name=mysec loop=$users}
{strip}
   <tr bgcolor="{cycle values="#aaaaaa,#bbbbbb"}">
      <td>{$users[mysec].name}</td>
      <td>{$users[mysec].phone}</td>
   </tr>
{/strip}
{/section}
</table>

Com o my_template, temos:

1. Um arreio, neste caso usamos uma leitura da base de dados com um simples ficheiro sql (em ficheiro é util para o caso de ser um extenso código sql):

tabela.sql

SELECT * FROM users

2. Um ficheiro HTML para a tabela:

tabela.html

<table>
<tbody>{tabela_tbody}</tbody>
</table>

3. Um ficheiro HTML para as linhas da tabela sem mistura de pseudo-codigo, apenas palavras-chave entre { }:

tabela_tbody.html

<tr bgcolor="{user_color}">
      <td>{user_name}</td>
      <td>{user_phone}</td>
   </tr>

4. e por fim o código PHP que vai "misturar" os 3 ficheiros. (NOTA: o arreio post serve ainda para receber dados de um formulario e fazer um INSERT ou UPDATE):

// Carregar dados de um ficheiro sql
$query = mt_load_array_into_query($_POST, 'tabela');

// Aplicar os dados ao ficheiro html "tabela_tbody"
$array = mt_load_query_into_html($query, 'tabela_tbody','');

// Criar html
echo mt_build_html($html['tabela']);

Gostava que aqui a comunidade desse uma vista de olhos neste sistema, visse as vantagens e desvantagens e colocassem as vossas críticas:

Coloquei agora o my_template num file share server e podem fazer o download (com um exemplo de um website incluido) em:

http://www.filepanda.com/file/bz8sdnsptyqb/

Muito obrigado pela atenção :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não gosto muito do smarty. Não vejo lógica de usar algo interpretado numa linguagem que já é por si interpretada. Mais simples era pores o resultado do loop, usando uma framework mvc, fazias isso no modelo e depois passavas para a view.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

... usando uma framework mvc, fazias isso no modelo e depois passavas para a view.

Sim, existem boas frameworks mvc por aí como o Code Igniter...

Esta solução que apresento não tem tanto potencial como as frameworks mvc, mas pretende fazer o básico  que é pegar nas partes separadas lógica e apresentação e uni-las de uma forma simples recorrendo a algumas funções.

Já agora apresento um resumo das funções.

mt_build_html

Função para criar a página HTML final. Normalmente recebe como argumento 'index', que indica qual o ficheiro HTML principal, de forma recursiva vai substituindo todas as partes {html} pelas respectivas strings (ou ficheiros HTML) que estão no arreio $html[]

mt_switch_html

Função para alternar entre conteúdos. Por exemplo: mt_switch_html('conteudo',$_GET['conteudo']) vai substituir a chave {conteudo} pela respectiva string $html['conteudo']. Neste caso escolhe o conteudo apartir do valor passado pelo $_GET.

mt_url_redirect

Esta função introduz uma label <meta http-equiv="refresh" content="5" url="" /> na parte <head> do ficheiro index.html. Bastante útil depois de usar um formulário.

mt_load_query_into_html

Esta função faz aquilo que todos nós fazemos muitas vezes: ler dados de uma base de dados e substitui nas chaves {campo} no HTML.

mt_load_array_into_query

Esta função também e super útil para carregar dados de um formulário HTML. Pega nos valores de um arreio e faz substituições no ficheiro SQL: muito útil para comandos INSERT e UPDATE.

As seguintes funções servem para trabalhar com itens individuais de arreios, antes de despejar os resultados de uma query para html:

mt_query_to_mt_array

Serve para converter um tipo RESOURCE num arreio próprio deste sistema de template (Arreio MT)

mt_read_mt_array

Devolve o valor de um item num arreio MT. recebe como argumentos: chave, fila (ou row).

mt_write_mt_array

Guarda um valor num item de um arreio MT, Recebe como argumentos: chave, fila (ou row).

mt_load_array_into_html

Serve para (finalmente) despejar o conteudo de um arreio MT no ficheiro HTML. Faz o mesmo que a função mt_load_query_into_html

E pronto... a partir destas funções básicas é muito fácil trabalhar com conteúdo dinâmico  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom, aqui está a versão OO deste simples sistema.

Pode-se fazer o download aqui -> http://www.filepanda.com/file/mgtaxfr5p18s/

Para este exemplo que tem incluído reparei que, usando as funções do php microtime() e memory_get_usage(), esta versão Orientada a Objectos é mais lenta e consome mais memória (cerca de 20kb) do que a 1ª versão que apenas usa funções... ainda não percebi porque... talvez tenha que melhorar o código... não sei... alguma ideia?

Com esta versão, as funções que postei acima passam a ser métodos da classe myHtml e inicializa-se da seguinte forma (parecido ao smarty):

include ('myHtml.php5');
$site = new myHtml ('pasta_do_site', 'pasta_html/', 'pasta_sql/');

e no final da página index.php...

echo $site->buildHtml('index');

É isso... experimentem!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora