Desenvolvimento - Python

ZPT - Zope Pages Templates

Este artigo faz uma introdução ao ZPT - Zope Pages Templates, linguagem muito utilizada dentro do excelente Zope e que serve para separar o código de programação (Python) do layout.

por Fábio Rizzo Matos



Este artigo faz uma introdução ao ZPT - Zope Pages Templates, linguagem muito utilizada dentro do excelente Zope e que serve para separar o código de programação (Python) do layout.

Introdução

Zope Pages Templates, ou simplesmente, ZPT, é uma linguagem de templates utilizada no Zope que permite que haja uma interatividade entre os programadores e os designers de uma forma muito agradável.

Com ZPT, o designer pode criar toda a página (seu layout) e colocar os campos (as tags) em seu lugar específico onde entrará a lógica (scripts em Python) do programador. Isso faz com que a página separe o visual da lógica.

Então, qual é o objetivo do ZPT? É ser uma linguagem que possibilite a feliz união do programador com o designer.

Dentro do ZPT, temos o TAL (Template Attribute Language), que adiciona uma série de tags especiais ao HTML. Um exemplo é:

Criando uma page templates com o nome de zpt01. Nome do Meu Page Template é <b tal:content="template/id">quero que apareça aqui outra coisa</b>

O que vai acontecer? O atributo tal:content="template/id" vai substituir o texto "quero que apareça aqui outra coisa" pelo nome do template.

O que será visto é:

Nome do Meu Page Template é zpt01

Interessante não é?

O que o ZPT faz é alterar o conteúdo entre as tags <b tal:content="template/id">bla bla bla</b> e colocar o texto do atributo tal.

Isso faz com que a página em seu código represente algo, que vai ser modificado quando a sua lógica entrar em funcionamento.

Poderia aparecer que o texto dado como exemplo fosse visto assim:

Nome do Meu Page Template é quero que apareça aqui outra coisa

Porém, ele substitui o texto entre as tags pelos atributos passados pelo tal.

Pode parecer confuso, mais vamos entender melhor criando um exemplo com ele.

Criando a primeira página ZPT

Acesse a sua ZMI (exemplo: http://localhost:8080/manage).

Dentro da ZMI, vamos no Root Folder do Zope e criaremos uma pasta chamada zpt01.

Dentro dessa pasta crie uma Page Template.

Coloque o nome de exemplo01.zpt e o title de Tutorial de ZPT.

Substitua o código que veio assim que você criou a ZPT por este:

<html>
  <head>
    <title tal:content="template/title">The title</title>
  </head>
  <body>
    
  <h1>Meu Primeiro ZPT - <span tal:replace="here/title_or_id">texto de 
título</span></h1>
    
  </body>
</html>

Salve o arquivo e clique em "test" para poder visualizar a página. Você verá a seguinte página:

E o seu código é:

<html>
  <head>
    <title>Tutorial de ZPT</title>
  </head>
  <body>
    
  <h1>Meu Primeiro ZPT - zpt01</h1>
    
  </body>
</html> 

Passando valores para um ZPT

Vamos passar valores de um form para um ZPT.

Vamos criar um formulário. Este pode ser um simples arquivo html, porém se criado através de um zpt não tem problema.

Digite algumas informações:

<br>
<form action="verdadosform.zpt" method="POST">
<p>
Seu Nome:
<br>
<input type="text" size="20" name="nome">
<br>
</p>

<p>
Sua Banda Preferida
<br>
<input type="text" size="15" name="banda">
<br>
</p>

<input type="submit" name="submit" value="Enviar"><br>
</form>

Agora cria um Page Template (zpt) chamado verdadosform.zpt com o seguinte conteúdo:

Olá, <span tal:replace="request/nome">nome</span>. Eu sei que você gosta de <span tal:replace="request/banda">banda</span>. Boa Banda.

E se você tivesse colocado no campo nome "Fabio" e no campo banda "Metallica", teríamos a seguinte saída:

Olá, Fabio. Eu sei que você gosta de Metallica. Boa Banda.

Como vocês podem ver, é possível capturar o dado de um form através do campo request/nomedavariável.

Lendo o conteúdo de uma ZSQL Method

Para se ler o conteúdo de uma zsql é muito simples. Imaginemos que temos uma tabela com o nome protocolo, com os seguintes campos:

* Atendente
* Num_Protocolo
* Problema
* Solicitante
* Unidade

Então, vamos criar uma z sql method com o id = zsql_lista_protocolo, e vamos colocar o seguinte Query Template nele: select * from protocolo.

Pronto, já temos uma conexão com o banco de dados e para visualizarmos essas informações criaremos um page template com o nome zpt_lista_protocolo, com o seguinte código:

<table border="1" width="100%">
        <tr>
          <th>Atendente</th>
          <th>Num Protocolo</th>
          <th>Problema</th>
          <th>Solicitante</th>
          <th>Unidade</th>
        </tr>
        <tr tal:repeat="item container/zsql_lista_protocolo">
          <td tal:content="item/atendente">#</td>
          <td tal:content="item/num_protocolo">num_prot</td>
          <td tal:content="item/problema">Meta-Type</td>
          <td tal:content="item/solicitante">Title</td>
          <td tal:content="item/unidade">Title</td>
         </tr>
      </table>

Como podem perceber, é fácil indexar o campo de tabelas em um consulta dentro de um zsql method em um page template. A tag <tr tal:repeat="item container/zsql_lista_protocolo"> é a tag repeat que indica que vamos repetir valores dentro de uma lista ou consulta (no nosso caso a query zsql_lista_protocolo), e a tag <td tal:content="item/atendente">#</td> indica os campos da tabela que queremos visualizar. Podemos ir adicionando quantos campos fossem necessários dentro de nosso page template.

Conclusão

Estes foram pequenos exemplos de uso do ZPT.

É possível se realizar as mais diversas operações com o ZPT, mais isso fica para um tópico mais avançado.

Em breve escreverei outros artigos falando sobre o ZPT.

Até mais,

Fabio Rizzo Matos
www.fabiorizzo.tk
fabio@fabiorizzo.com

Fábio Rizzo Matos

Fábio Rizzo Matos - Membro ativo da Comunidade Python/Zope e Plone, para qual escreve diversos artigos. Arquiteto de Software e Desenvolvedor, trabalha atualmente na ThreePointsWeb (contato@threepointsweb.com), empresa especializada em desenvolvimento e treinamentos Python, Zope e Plone, realizando treinamentos e consultorias em Plone. Mantenedor do site http://www.fabiorizzo.com além de responsável pela tradução de conteúdo.