Pular para o conteúdo. Ir para a navegação
Ações do site
Opções do usuário

TcheZope.org

Você está aqui: Página Inicial Documentação Manuais O Livro do Zope Estendendo o Zope
Ações do documento

15. Estendendo o Zope

Um nível acima
Este capítulo trata da extensão do Zope pela criação de suas próprias classes de objetos. Discute ZClasses, e como as instâncias são construídas das classes. Descreve passo a passo como construir uma ZClass e controle de segurança e resultados do projeto. Enfim, discute a criação de Python base classes para ZClasses e descreve a base classes que é colocada com o Zope. Este capítulo mostra a você como levar o Zope para o próximo nível, modelando o Zope a suas necessidades.

Você pode estender o Zope criando seus próprios tipos de objetos que são adequados para as necessidades da aplicação. Novos tipos de objetos são instalados no Zope pelos Products. Produtos são estensões para o Zope que a Zope Corporation e muitos outros desenvolvedores criaram. Há milhares de Produtos diferentes e muitos servem objetivos específicos. Uma biblioteca completa dos Produtos é a Sessão Documentação do Zope.org.

Products podem ser desenvolvidos de duas maneiras, através da web usando ZClasses, e na linguagem de programação Python. Products podem até ser um híbrido de produtos feitos através da web e com código Python. Este capítulo discute a construção de novos produtos através da web, um tópico que você já tem um breve visão no Capítulo 11, "Buscando e Categorizando Conteúdo". Desenvolver um Produto inteiramente com programação em Python está fora do escopo deste documento e você deveria visitar o Zope.org para documentação específica sobre desenvolvimento de Produtos.

Este capítulo mostra a você como:

  • Criar um novo Produto no Zope
  • Define ZClasses em Produtos
  • Integrar Python com ZClasses
  • Distribuir Produtos a outros usuários do Zope

O primeiro passo na customização do Zope começa na próxima seção, onde você aprende como criar novos Produtos no Zope.

Criando Produtos Zope

Através da web os Produtos são armazenados na pasta Product Management no Painel de Controle. Clique no Control_Panel no root folder e então clique em Products. Você está agora na tela mostrada na Figura 12.1.

12-1.png

Figura 12.1 - Produtos instalados

Cada caixa azul representa um Produto instalado. Desta tela, você pode gerenciar estes Produtos. Alguns Produtos são construídos no Zope por default ou foram instalados por você ou seu administrador. Estes Produtos têm um ícone de caixa fechada, como mostra a Figura 12.1. Produtos com a caixa fechada não podem ser gerenciados através da web. Você pode obter informações sobre estes produtos clicando neles, mas você não pode mudá-los.

Você também pode criar seus próprios Produtos que você pode gerenciar através da web. Seus Produtos deixam você criar novos tipos de objetos no Zope. Estes objetos gerenciáveis através da web tem ícones de caixa aberta. Se você seguiu os exemplos no Capítulo 11, "Buscando e Categorizando Conteúdo", então você tem um produto News com caixa aberta.

Porque você quer criar produtos? Por exemplo, todos os vários guardas do Zoo querem construir uma simples e fácil forma de mostrar conteúdo sobre o Zoo. As demonstrações devem estar todas no mesmo formato e conter uma estrutura de informação parecida, e cada uma será específica para cada animal no Zoo.

Para efetuar isto, você poderia construir uma demonstração para um animal, e então copiá-lo e colá-lo para cada demonstração, mas isto seria difícil e um processo manual. Todas as informações e propriedades teriam de ser mudadas para cada demonstração nova. Ainda, haveriam milhares de demonstrações.

Para adicionar mais algo ao problema, vamos dizer que você quer agora ter informação de cada demonstração que diz se o animal é perigoso ou não. Você teria que mudar cada demonstração, uma a uma, para fazer isto usando copiar e colar. Evidentemente, copiar e colar não modifica muito o zoo, e poderia ser muito caro.

Você também precisa garantir que cada demonstração é fácil de gerenciar. Os guardas das demonstrações individuais deveriam ser os únicos a oferecer informação, mas nenhum dos guardas do Zoo sabem muito sobre o Zope ou como criar web sites e você certamente não quer desperdiçar tempo ensinando-os. Você apenas quer que eles digitem algumas informações simples em um formulário sobre seus tópicos de interesse, clique no submit, e vá embora.

Criaando um Produto do Zope, você pode executar estes objetivos rapida e facilmente. Você pode criar facilidades para gerenciar objetos que seus guardas possam usar. você pode definir modelos de demonstração que você pode mudar uma vez e afetar todas as demonstrações. Você pode fazer estas coisas criando Produtos do Zope.

Criando um Produto Simples

Usando Produtos você pode resolver os problemas de gerenciamento e criação de exibição. Iremos iniciar com um exemplo de como criar um produto simples que lhe permitirá coletar informações de como exibir e criar uma exibição personalizada. Mais adiante no capítulo você verá maneiras mais complexas e poderosas de usar produtos.

O principal de um produto do Zope é que ele lhe permite criar objetos em uma localização central e ele oferece a você acesso aos seus objetos pela lista de adição de produtos. Isto lhe oferece abilidade para construir serviços globais e torná-los disponíveis através de uma parte padrão da interface de gerenciamento do Zope. Em outras palavras, um Produto lhe permite personalizar o Zope.

Comecemos indo até a pasta Products no Control Panel. Para criar um novo Produto, clique no botão Add Product no folder Product Management (Gerenciamento de Produtos). Isto irá levar você ao formulário de adição de Produtos. Digite o id "ZooExhibit" e clique em Generate. Você verá agora seu novo Produto no Product Management. Ele deve ser uma caixa azul com a tampa aberta. A tampa aberta significa que você pode clicar no Produto e gerenciá-lo pela web.

Selecione o Produto ZooExhibit. Isto o levará a tela de gerenciamento de Produtos.

A tela de gerenciamento de um Produto se parece e funciona como como a de um Folder exceto por algumas diferenças:

  1. Há uma nova aba, chamada Distribution, bem a direita. Isto lhe dá a abilidade de empacotar e distribuir seu Produto. Isto é discutido mais tarde.
  2. Se você selecionar a lista de adição, você verá alguns tipos novos de objetos que você pode adicionar incluindo ZClass, Factory, e Permission.
  3. A pasta com uma interrogação é a Help Folder (Pasta de Adjuda) do Produto ZooExhibit. Esta pasta pode conter Help Topics (Tópicos de Ajuda) que ensina as pessoas como usar seu Produto.
  4. Há também uma nova aba Define Permissions (Definir Permissões) que define as permissões associadas com este Produto. Isto é avançado e não é necessário para este exemplo.

Na aba Contents crie um DTML Method chamado hello com este conteúdo:

  <dtml-var standard_html_header>
<h2>Hello from the Zoo Exhibit Product</h2>
<dtml-var standard_html_footer>

Este método lhe permitirá testar seu produto. Depois crie uma Factory. Selecione Zope Factory da lista de adição de produtos. Você irá para o formulário de adição de uma Factory como mostra a Figura 12.2.

12-2.png

Figura 12.2 - Adicionando uma Factory

Factories criam uma ponte entre a lista de adição de produtos e o seu Produto. Dê a sua Factory o id myFactory. No campo Add list name digite Hello e na seleção Methods, escolha hello. Agora clique Generate. Agora clique na nova Factory e mude a Permission (Permissão) para Add Documents, Images e Files e clique em Save Changes. Isto avisa ao Zope que você deve ter a permissão para Adicionar documentos, Imagens e Arquivos para utilizar a Factory. Parabéns, você personalizou a interface de gerenciamento do Zope. Vá para a pasta raiz e clique na lista de adição de produtos. Note que agora ele inclui uma entrada chamada Hello. Escolha Hello da lista de adição de produtos. Ele chama seu método hello.

Uma das coisas mais comuns para se fazer com métodos que você linka com factories é copiar objetos na pasta atual. Em outras palavras seus métodos podem acessar a localização da qual eles foram chamados e podem executar operações naquela pasta incluindo copiar objetos dentro dela. Só porque você pode fazer tudo o que for malucos com as Factories e Produtos não significa que você pode fazer tudo. Em geral, as pessoas esperam que quando elas selecionam alguma coisa da lista de adição de produtos que elas serão levados a um formulário de adição onde elas especificarão o id de um novo objeto. Então elas esperam que quando cliquem em Add o novo objeto com o id que eles especificaram seja criado em sua pasta. Veremos como realizar estas expectativas.

Primeiro crie uma nova pasta chamada exhibitTemplate no seu Produto. Isto irá servir como um modelo para as exibições. Também na pasta Produto crie um DTML Method chamado addForm, e um Script Python chamado add. Estes objetos criarão novas instâncias de exibição. Agora volte para sua Factory e mude-a de modo que o Add list name seja Zoo Exhibit e o método seja addForm.

Então o que vai acontecer é que quando alguém escolhe Zoo Exhibit da lista de adição de produtos, o método addForm será executado. Este método deveria coletar informações sobre o id e o título da exibição. Quando o usuário clica em Add ele deveria chamar o script que irá copiar o folder exhibitTemplate dentro da pasta chamada e o renomeará para ter o id específico. O próximo passo é editar o método addForm para ter este conteúdo:

  <dtml-var manage_page_header>

<h2>Add a Zoo Exhibit</h2>




<form action="add" method="post">
id <input type="text" name="id"><br>
title <input type="text" name="title"><br>
<input type="submit" value="Add">
</form>




<dtml-var manage_page_footer>


Reconhecidamente este é um formulário de adição particularmente "frio". Ele não coleta muitos dados e não informa ao usuário o que é uma Exibição do Zôo e por quê eles querem adicionar uma. Quando você criar sua própria aplicação web você vai querer fazer melhor do que este exemplo.

Note que este método não inclui o cabeçalho e rodapé padrão do HTML. Pela convenção Zope, telas de gerenciamento não usa os mesmos cabeçalhos e rodapés que seu site usa. Ao invés disso as telas de gerenciamento usam manage_page_header e manage_page_footer. O cabeçalho e rodapé visualizados no gerenciamento asseguram que a visualização do gerenciamento tenha uma aparência e semntido comum.

Note também que a ação do formulário é o script adicionar. Agora cole o seguinte corpo no script adicionar:

## Script (Python) "add" ##parameters=id, title, REQUEST=Nome ##

" " " Copie o modelo de exibição para a pasta chamada " " "

#Clone o modelo, dando-lhe o novo id. Isto será colocado #no contexto atual (o lugar de onde o factory foi chamado). exhibit=context.manage_clone ( container.exhibitTemplate, id)

# Mude o título do clone exhibit.manage_changeProperties (title=title)

Se nós somos chamados através da web, redirecione devolta para o contexto if REQUEST is not None: try: u=context.DestinationURL() except: u=REQUEST ['URL1'] REQUEST.RESPONSE.redirect (u+/manage_main?update_menu=1)

Este script clona o exhibitTemplate e copia-o para a pasta atual com o id específico. Então ele muda a propriedade título da nova exibição. Finalmente ele retorna para a tela principal de gerenciamento de pastas pela chamada manage_main.

Parabéns, você agora estendeu o Zope pela criação de um novo produto. Você criou uma maneira de copiar objetos no Zope através da lista de adição de produtos. No entanto, esta solução ainda sofre alguns problemas que nós discutiremos em breve no capítulo. Mesmo que você possa editar o modelo de exibição em um lugar centralizado, ele ainda é somente um modelo. Então se você adicionar uma nova propriedade ao modelo, ele não afetará a qualquer das exibições existentes. Para mudar exibições existentes você terá que modificar cada uma manualmente.

ZClasses leva você a um passo maior para permitir-lhe a ter um modelo central que define um novo tipo de objeto, e quando você muda o modelo, todos os objetos desse tipo mudam com ele. Este modelo central é chamado de ZClass. Na próxima seção, nós mostraremos como criar ZClasses que definem uma nova ZClasse Exhibit.

Criando uma ZClasse

Criando ZClasses

ZClasses são ferramentas que ajudam você a construir novos tipos de objetos no Zope, por definição uma classe. Uma classe é como BLUEPRINT para objetos. Quando define uma classe, você está definindo o que um objeto será quando ele for criado. Uma classe pode definir métodos, propriedades, e outros atributos.

Os Objetos que você cria de uma cerat classe são chamados de instâncias de uma classe. Por exemplo, há apenas uma classe Pasta, mas você pode ter muitas instancias Pasta em seu aplicativo.

Instâncias possuem os mesmos métodos e propriedades que suas classes. Se você mudar a classe, então todas as instâncias refletirão a mudança. Diferente dos modelos que você criou na última seção, as classes continuam a exercer controle sobre as instâncias. Tenha em mente que isto somente funciona em uma via, se você mudar uma instância, nenhuma mudança será feita na classe ou qualquer outra instância.

Uma boa analogia com o mundo real para ZClasses são modelos de processador de textos. Muitos processadores de texto vem com um conjunto de modelos predefinidos que você pode usar para criar um certo tipo de documento, como um resumo. Existem centenas de milhares de resumos no mundo baseados no Modelo de Resumos do Microsoft Word, mas há somente um modelo. Assim como o modelo de Resumos é para todos aqueles resumos, uma ZClasse é um modelo para qualquer número de objetos Zope similares.

ZClasses são classes que você pode construir através da web usando a interface de gerenciamento do Zope. Classes podem também ser escritas em Python, mas isto não é abrangido neste livro.

ZClasses podem herdar atributos de outras classes, herança permite a você definir uma nova classe que é baseada em outras classes. Por exemplo, digamos que você queira criar um novo tipo de objeto documento que tenha propriedades especiais onde interessar a você. Ao invés de construir todas as funcionalidades de um documento do nada, você pode apenas herdar todas as funcionalidades da classe Documento DTML e adicionar somente as novas informações que interessam a você.

Herança também permite construir generalização de relacionamento entre classes. Por exemplo, você pode criar uma class chamada Animal que contenha informações que um animal possue em geral. Então, você pode criar as classes Réptil e Mamífero ambas as quais herdam de Animal. Tomando proveito dos mesmos, você pode criar duas classes Lagarto e Cobra adicionais, as quais ambas herdam de Réptil, como mostrado na Figura 12-3.

12-3.png

Figura 12-3 - Exemplo de classes

ZClasses podem herdar muitos dos objetos que você usou neste livro. Adicionalmente, ZClasses podem herdar de outras ZClasses definidas no mesmo Produto. Nós usaremos esta técnica e outras neste capítulo.

Antes de partir para o próximo exemplo, você pode renomear o Produto ZooExhibit existente na sua pasta de Produtos Zope para alguma coisa, como ZooTemplate então que não conflitará com este exemplo. Agora, crie um novo Produto na pasta Produtos chamado ZooExhibit.

Selecione ZClass da lista de adição da visualização do conteúdo de ZooExhibit e vá para o formulário de adição de ZClasses. Este formulário é complexo, e possue muitos elementos. Nós veremos cada um deles:

ID
Este é o nome da classe a ser criada. Por exemplo, escolha o nome ZooExhibit.

Meta Type
O Meta Type de um objeto é um nome para o tipo deste objeto. Este pode ser algo curto mas descritivo sobre o que o objeto faz. Por exemplo, escolha o meta type “Zôo Exhibit”.

Base Classes
Base Classes definem uma seqüência de classes de onde você quer que sua classe herde atributos. Sua nova classe pode ser através de como extensão ou começando derivada da funcionalidade de sua base de classes. Você pode escolher uma ou mais classes classe da lista da esquerda e clique o botão à para introduzi-lo em sua lista de base de classes. O botão ß remove qualquer base de classes que você selecionar na direita. Para este exemplo não selecione qualquer base de classes. Mais tarde neste capítulo, nós iremos explanar algumas das bases de classes mais interessantes, como ObjectManager.

Criar objetos construtores?
Usualmente você quer deixar esta opção marcada a menos que queira tome o cuidado de criar um formulário/ação construtor e um próprio objeto Factory. Se você quer que o Zope faça este task para você, deixe-o marcado. Marque esta caixa principal que este formulário criará 5 objetos, uma Classe, um Formulário Construtor, uma Ação Construtora, uma Permissão e um Factory. Para este exemplo, deixe esta caixa marcada.

Agora clique em Add. Isto o levará de volta ao Produto ZooExhibit e você verá 5 novos objetos, como mostrado na Figura 12-4.


12-4.png

Os cinco objetos criados pelo Zope estão todos configurados apropriadamente para o trabalho, você não precisa mudá-los por enquanto. Aqui esta uma breve descrição de cada objeto que foi criado:

ZooExhibit

Esta é a própria ZClasse. Seu ícone é uma caixa branca com duas linhas horizontais. Este é o símbolo tradicional de uma classe.

ZooExhibit_addForm

Este método DTML é o Formulário construtor para uma Zclass. Ë um formulário simples que aceita um id e título. Você pode personalizar este formulário para aceitar qualquer tipo de entrada que seu objeto requeira. Isto é bastante similar ao formulário de adição que nós criamos no primeiro exemplo.

ZooExhibit_add
Este método DTML é chamado pelo formulário construtor, ZooExhibit_addForm. Este método atualmente cria seu novo objeto e configura seu id e título. Você pode personalizar este formulário para fazer modificações mais avançadas para seu objeto baseado em parâmetros de entrada do ZooExhibit_addForm. Isto tem a mesma funcionalidade que o script Python que nós criamos no exemplo anterior.

ZooExhibit_add_permission
A curiosa STICK-PERSON vista conduzindo a caixa azul é uma Permissão. Ela define uma permissão que você pode associar com a adição de novos objetos ZooExhibit. Isto vai proteger a habilitação para adicionar novas exibições do Zôo. Se você clicar nesta Permissão, poderá ver que o nome desta nova permissão é “Add ZooExhibit”.

ZooExhibit_factory
O pequeno FACTORY com um ícone de chamíne é um objeto FACTORY. Se você clicar neste objeto, você pode modificar o texto que aparece na lista de adição para este objeto na caixa Add lista name. O Method é o método que é chamado quando um usuário seleciona o Add list name da lista de adição. Usualmente isto é o fomulário construtor para seu objeto, netse caso, ZooExhibit_addForm. Você pode associar a permissão que o usuário deve ter para adicionar este objeto, neste caso, ZooExhibit_add_permission. Ao invés disso você pode também especificar uma permissão regular do Zope.

É isso, você criou sua primeira ZClasse. Clique na nova ZClasse e clicque na tabela Basic. O Basic mostra na sua ZClasse algumas informações que você especificou no formulário de adição de ZClasses. Você não pode mudar a base de classe sde uma ZClasse. Como você aprendeu anteriormente no capítulo, estas configurações incluem:

meta-type
O nome de sua ZClasse como aparece na lista de adição de produtos.

class id
O único identificador de sua classe. Você deve apenas mudar isso se você quer usar sua definição de classe para instâncias existentes em outras ZClasse. Neste caso você deve copiar o id de classe da classe antiga para a nova classe.

icon
O caminho para suas imagens de ícones de classes. Há uma pequena razão para mudar isto. Se você quer mudar o ícone da classe na sua nova classe.

Apartir este ponto, você pode começar criando novas instâncias da ZClasses ZooExhibit. Primeiro pense, você provavelmente quer um lugar comum onde todas as exibições são definidas, então vá para a raìz de sua pasta e selecione Folder da lista de adição e crie uma nova pasta com o id "Exibições". Agora, clique na pasta Exibições que você acabou de criar e arraste a lista de adição. Como você pode ver, ZooExhibit agora é uma lista de adição.

Vá adiante e selecione ZooExhibit da lista de adição e crie uma nova exibição com o id "Coelhos". Após criar a nova exibição selecione-a clicando nela.

Como você pode ver seu objeto já possue três opções, Undo, Ownership e Security. Você não tem que definir estas partes de seu objeto, o Zope fará isso para você. Na próxima seção, nós adicionaremos mais algumas opções para você editar seu objeto.

Criando Visualizações de sua ZClasse

Todos os objetos Zope são divididos em telas lógicas chamadas Views. Views são comumente usados quando você trabalha com objetos Zope na interface de gerenciamento, as telas indicadas em todos os objetos Zope são views. Alguns views como Undo, são padrão e vem com o Zope.

Views são definidas na visualização Views de uma ZClasse. Vá até sua ZClasse ZooExhibit e clique no indicador Views. A visualização Views vista como Figura 12-5.


12-5.png

Nesta visualização você pode ver três visualizações que vem automaticamente com seu novo objeto, Undo, Ownership, e Security. Elas estão configuradas automaticamente para você convenientemente, desde então todos os objetos tem estas interfaces, mas você pode mudá-las ou remove-las daqui se você realmente quiser (você geralmente não quer).

A tabela de visualização está dividida em três colunas, Name, Method, e Help Topic. O Name é o nome da visualização e é o rótulo que desenha na tabela de visualização na interface de gerenciamento. O Method é o método de classe ou folha de propriedades que propicia a chamada para desenhar a visualização. O Help Topics é onde você associa um objeto Help Topic com esta visualização. Tópicos de Ajuda serão explanados mais tarde.

Visualizações também trabalham com o sistema de segurança para fazer com que os usuários somente vejam as visualizações em um objeto que eles tem permissão de ver. Segurança será explicado em detalhes um pouco mais adiante, mas é bom saber neste momente que as visualizações agora somente separa uma interface de gerenciamento em blocos lógicos, mas eles também controlam quem pode ver cada visualização.

A coluna Method na visualização de métodos selecionou caixas as quais lhe permitem escolher cada visualização de cada gênero de método. A associação de métodos com uma visualização pode ser entre outros um objeto na visualização Methods, ou uma folha de propriedades na visualização de folhas de propeiedades.

Criando Propriedades na sua ZClasse

Propriedades são coleções de variáveis que seu objeto usa para armazenar informações. Um objeto ZooExhibit, por exemplo, necessitaria de propriedades para conter informações sobre a exibição, como qual animal está na exibição, uma descrição, e quem são os zeladores.

Propriedades para ZClasses trabalham com um pequeno diferencial de propriedades em objetos Zope. Em ZClasses, Propriedades vem em grupos nomeados chamados Proprerty Sheets. Uma tabela de propriedades é o caminho de organizar um conjunto de propriedades relatadas juntas. Vá até sua ZClasse ZooExhibit e clique na tabela Propriety Sheets. Para criar uma nova tabela, clique Add Common Instance Sheet. Isto levará você ao formulário de adição da Tabela de propriedades. Chame sua nova Tabela de Propriedades de "ExhibitProprieties" e clique Add.

Agora você pode ver que sua nova tabela, ExhibitProprieties, foi criada na visualização Propriety Sheets de sua ZClasse. Clique na nova tabela para gerenciá-la, como mostra a Figure 12-6.

12-6.png

Como você pode ver, esta tabela parece muito com a visualização das propriedades nos objetos Zope. Aqui, você pode criar novas propriedades nesta folha. Propriedades na tabela de propriedades são exatamente como as propriedades nos objetos Zope, ele tem um name, um type e um value.

Crie trê novas propriedades nesta tabela:

animal
Esta propriedade pode ser do tipo String. Ele irá armazenar o nome do animal deste atributo de exhibit.

description
Esta propriedade pode ser do tipo text. Ela irá armazenara descrição da exhibit.

caretakers
Esta propriedade pode ser do tipo lines. Ela irá armazenar uma lista de nomes de tratadores para a exhibit.

Tabelas de Propriedades tem duas utilizações. Como você viu com este exemplo, eles são uma ferramenta para organizar conjuntos relacionados de proprieades sobre seus objetos, segundo que, eles são usados para gerar formulários HTML e ações para editar este conjunto de propriedades. O formulário de edição HTML é gerado automticamente, você somente necessita associar um visualizador com a tabela de Propriedades para ver o formulário de edição da tabela. Por exemplo, retorne para a ZClasse ZooExhibit e clique na tabela Views e crie uma nova visualização com o nome Edit e associe com o método propertysheets/ExhibitProperties/manage_edit.

Desde que você possa usar a Tabela de Propriedades para criar telas de edição você deve querer criar mais que uma Tabela de Propriedade para sua classe. Usan do mais que uma tabela você pode controlar cada uma das propriedade que são mostradas juntas para propósitos de edição. Você pode também separar propriedades privadas de públicas em diferentes tabelas pela associação deles com permissões diferentes.

Agora, volte para seu diretório Exhibits e também procure por uma instancia ZooExhibit existente ou crie uma nova. Como você pode ver, uma nova Visualização chamada Edit foi adicionada ao seu objeto, como mostrado na Figura 12-7.


12-7.png

Este formulário de edição foi gerado para você automaticamente. Você somente necessita criar a Tabela de Propriedades, e então associá-las a tabela com uma visualização. Se você adicionar outra propriedade para a tabela de Propriedades ExhibitProperties, todas as suas instancias receberão automaticamente um novo formulário de edição atualizado, porque quando você modifica uma ZClasse, todas as instancias da classe herdam a mudança.

Isto é importante para enteder que mudanças feitas na classe refletem em todas as suas instancias, mas mudanças em uma instancia não refletem em uma classe ou em qualquer outra instancia. Por exemplo, na visualização Edit para sua instancia ZooExhibit (não a classe), entre "Coelho com garras" para a propriedade animal, a descrição "Garras, coelho carnívoro que atormentava cavaleiros medievais próximos. Eles são conhecidos por seus dentes afiados e pontiagudos." e dois tratadores "Tim" e "qualquer outro". Agora clique em Save Changes.

Como você pode ver, suas mudanças foram obviamente efetuadas nesta instancia, mas o que aconteceu com a classe? Volte para a ZClasse ZooExhibit e observe a ta bela de propriedades ExhibitProperties. Nada foi mudado! Mudanças na instancia não tem efeito na classe.

Você pode também fornecer valores padrão para as propriedades na Tabela de Propriedades. Você poderia, por exemplo, entrar o texto "Descreva sua exibição nesta caixa" na propriedade description da ZClasse ZooExhibit. Agora, volte para seu diretório Exhibits e crie um novo objeto ZooExhibit e clique na visualização Edit. Aqui, você ve que o valor fornecido na tabela de propriedades não mudou. Valores padrão permitem a você configurar informações usuais nas propriedades da ZClasse que podem depois ser mudadas uma base instancias-por-instancia.

Você pode querer voltar para sua ZClasse e clicar na tabela Views e modificar a visualização "Edit" para fazer a primeira visualização clicando no botão First. Agora, quando você clica na sua instancia, ela irá mostrar a visualização Edit primeiro.

Criando Métodos na sua ZClasse

A visualização Methods de sua ZClasse permite a você definir os métodos para as instâncias de suas ZClasses. Vá para a sua ZClasse ZooExhibit e clique na tabela Methods. A visulaização Methods é como na Figura 12-8.


12-8.png

Você pode criar qualquer tipo de objeto Zope na Visualização Methods, mas geralmente somente objetos CALLABLE (Métodos DTML e Scripts, por exemplo) são adicionados.

Métodos são utilizados para vários propósitos:

  Apresentação Quando você associa uma visualização com um método, o método é chamado quando um usuário seleciona a visualização em uma instância. Por exemplo, se você tem um método DTML chamado showAnimalImages, e uma visualização chamada Images, você pode associar o método showAnimalImages com a visualização Images. Toda vez que alguém clicar na visualização Images na instância de sua ZClasse, o método showAnimalImages será chamado.

  Lógica Métodos não são necessariamente associados com visualizações. Métodos que são frequentemente criados definem como você pode trabalhar com seu objeto. Por exemplo, considere o método isHungry da ZClasse ZooExhibit definida na seção anterior. Ela não define uma visualização para ZooExhibit, ela apenas fornece informações muito específicas sobre ZooExhibit. Métodos em uma ZClasse pode chamar cada um dos outros assim como qualquer outro método Zope, então métodos lógicos podem ser usados a partir de um método de apresentação, mesmo que ele não defina uma visualização.

  Objetos Compartilhados Como foi apontado recentemente, você pode criar qualquer tipo de objeto na visualização Methods de uma ZClasse. Todas as instâncias de sua ZClasse compartilhará os objetos na visualização Methods. Por exemplo, se você criar uma ZGadfly Connection na visualização Methods de sua ZClasse, então todas as instâncias da classe compartilhará a mesma conexão Gadfly. Objetos compartilhados pode ser usuados para a lógica da classe ou métodos de apresentação.

Um bom exemplo de um método de apresentação é um método DTML que mostra uma Exibição de Zoológico para sua visualização em um website. Isto é frequentemente chamado public interface para um objeto e é usualmente associado com a visualização View encontrada na maioria dos objetos Zope.

Crie um novo método DTML na tabela Methods de sua ZClasse ZooExhibit chamad index_html. Como todos os objetos nomeados index_html, esta será a apresentação padrão para o objeto nele definido, ou seja, instâncias de sua ZClasse. Insira o seguinte DTML no método index_html que você acabou de criar.

<!--
<dtml-var standard_html_header>
<h1><dtml-var animal></h1>
<p><dtml-var description></p>
<p>The <dtml-var animal> caretakers are:<br>
<dtml-in caretakers>
<dtml-var sequence-item><br>
</dtml-in>
</p>
<dtml-var standard_html_footer>
-->

Agora, você pode visitar uma de suas instâncias ZooExhibit diretamente através da web, por exemplo, http://www.zopezoo.org/Exhibits/FangedRabbits/ mostrará a interface pública para a exibição Coelho com garras.

Você pode utilizar scripts baseado em Python ou baseados em Perl, e cada um dos métodos lógicos Z SQL implementados. Seus objetos lógicos podem chamar outros, e podem ser chamados por um método de apresentação. Para criar um método isHungry, primeiro crie duas novas propriedades na página de propriedades ExhibitProperties chamada "last_meal_time" que é do tipo date e "isDangerous" que é do tipo boolean. Isto adiciona dois novos campos para sua visualização Edit onde você pode digitar a última vez que o animal foi alimentado e selecionar se o animal é ou não perigoso.

Aqui está um exemplo de uma implementação do método isHungry em Python:

## Script (Python) "isHungry" ## """ Returns true if the animal hasn't eaten in over 8 hours """ from DateTime import DateTime if (DateTime().timeTime() - container.last_meal_time.timeTime() > 60 60 8): return 1 else: return 0

O recipiente deste método se refere a uma instância da ZClasse. Então você pode usar o recepiente em uma instância ZClasse do mesmo modo como você usa em métodos Python normais.

Você pode chamar este método de seu método de DISPLAY index_html usando este recorte de DTML:

  <dtml-if isHungry>
<p><dtml-var animal> is hungry</p>
</dtml-if>

Você pode até chamar um número de métodos lógicos de seu método de DISPLAY. Por exemplo, você pode melhorar o mostra de fome desse modo:

  <dtml-if isHungry>
<p><dtml-var animal> is hungry.
<dtml-if isDangerous>
<a href="notify_hunger">Tell</a> an authorized
caretaker.
<dtml-else>
<a href="feed">Feed</a> the <dtml-var animal>.
</dtml-if>
</p>
</dtml-if>

Seu método DISPLAY agora chama métodos lógicos para decidir quais ações são apropriadas e criar links para aquelas ações. Para mais informações na Propriedades, veja o capítulo 3, "Usando Objetos Básicos do Zope".

ZClasses ObjectManager

Se você escolheu ZClasses:ObjectManager como uma base de classes para suas ZClasses então instâncias de suas classes estarão habilitadas a conter outros objetos Zope, apenas como pastas. Classes recipientes são identicas a outras ZClasses com a exceção que elas possuem uma visualização adicional Subobjects.

Desta visualização você pode controlar que tipos de objetos suas instâncias podem conter. Por exemplo se você criou uma classe recipiente FAQ, você deve restringí-la para alimentar objetos Perguntas e Respostas. Selecione um ou mais meta-types da lista de seleção e clique no botão Change. Os objetos devem aparecer na lista de pastas de controle de caixas marcadas se são ou não instâncias de sua classe recipiente e são mostradas no painel de navegação como objetos expandíveis.

ZClasses recipientes podem ser muito poderosas. Um padrão muito comum para aplicações web é ter duas classes que trabalham juntas. Uma classe implementa o comportamento e alimentação básica dos dados. A outra classe contém instâncias da classe básica e fornece métodos para organizar e listar o conteúdo das instâncias. Você pode modelar muitos problemas deste modo, por exemplo um gerenciador de ingressos pode conter problemas de ingressos, ou um repositório de documentos pode conter documentos, ou um roteador de objetos pode conter regras de roteamento, e assim por diante. Tipicamente as classes recipientes fornecerão métodos para adicionar, deletar, e restaurar ou localizar objetos recipientes.

Controles de Segurança da ZClasse

Quando são construídos novos tipos de objetos, a seguarnça pode representar uma importante função. Por exemplo, as três funções seguintes são necessárias no seu Zoo:

  Administrador
Esta função existe por padrão no Zope. Este é você, e alguém mais o qual você queira que esteja habilitado para gerenciar completamente seu sistema Zope.

  Tratadores
Após você criar uma instância ZooExhibit, você quer que os usuários com a função tratador esteja habilitado para editar exibições. Somente usuários com esta função devem estar habilitados para ver a visualização Edit de uma instância ZooExhibit.

  Anonimo
Esta função existe por padrão em Zope. Pessoas com a função anonimo devem estar abilitadas para visualizar a exibição, mas não gerenciá-la ou mudá-la de qualquer maneira.

Como você aprendeu no capítulo 7, "Usuários e segurança", criar novas funções é fácil, mas como você pode controlar quem pode criar e editar novas instâncias? Para fazer isto, você deverá definir algumas políticas de segurança na ZClasse ZooExhibit que controla o acesso a ZClasse e sua folha de propriedades e métodos.

Controlando o Acesso a Métodos e Folhas de Propriedades

Por padrão, o Zope tenta ser sensível sobre a segurança das classes. Você pode, no entanto, querer controlar o acesso a instâncias de sua ZClasse de um modo especial.

Por exemplo, os tratadores do Zoológioco estão realmente interessados em ver a visualização Edit (e possivelmente a visualização Undo, a qual nós mostraremos depois), mas definitivamnete não a visualização de Segurança ou Proprietário. Você não quer os tratadores do Zoológico mudando as configuraçòes de segurança em suas Exibições: você não quer até mesmo que eles vejam estes aqueles aspectos de uma Exibição, você apenas quer dar a eles a habilidade de editar uma exibição e nada mais.

Para fazer isto, você necessita criar um novo objeto Zope de permissão no produto ZooExhibit (não a ZClasse, permissões são definidas somentre nos produtos). Para fazer isto, vá para o produto ZooExhibit e selecione Zope Permissiaon da lista de adição. Dê a nova permissão o Id "edit_exhibit_permission" e o nome "Edit Zoo Exhibits" e clique em gerar.

Agora, selecione sua ZClasse ZooExhibit, e clique na tabela Permissions. Isto levará você para a visualização das permissões como mostrado na figura 12-9.


12-9.png

Esta visualização mostra para você quais permissões sua ZClasse usa e deixa você escolher permissões adicionais para usar. Na direita está uma lista de todas sa permissões padrão Zope que sua ZClasse herad automaticamente. Na esquerda estão múltiplas caixas de seleção onde você pode adicionar novas permissões para sua classe. Selecione a permissão Edit Zoo Exhibits nesta caixa e clique em Save Changes. Isto avisa a sua ZClasse que ela é interessante nesta permissão bem como as permissões na direita.

Agora, clique na tabela Property Sheets e selecione a folha de propriedades ExhibitProperties. Clique na tabela Define Permission.

Você quer informar a esta folha de propriedades que somente os usuários que possuem a permissão Edit Zoo Exhibit que você criou podem gerenciar as propriedades na folha ExhibitProperties. Nesta visualização, arraste para baixo a caixa selecionada e escolha Edit Zoo Exhibit. Isto irá mapear o Edit Zoo Exhibits para a permissão Manage Properties na folha. Esta lista de permissões você pode selecionar a partir da visualização da ZClasse Permissions de onde você está, e devido a você selecionar a permissão Edit Zoo Exhibit na tela, ela aparece na lista para você selecionar. Note que todas as opções padrão para disable cad uma permite que a folha de propriedades não possa ser editada por qualquer um.

Agora, você pode voltar para sua pasta Exhibits e selecionar a visualização Security. Aqui, você pode ver que sua nova permissão está na esquerda na lista de permissões habilitadas. O que você quer fazer agora é criar uma nova função chamada Tratador e mapear esta nova função para a permissão Edit Zoo Exhibits.

Agora, os usuários devem ter a função tratador em ordem para ver a visualização Edit em qualquer de suas instâncias ZooExhibits.

Acesso para objetos na visualização dos métodos de sua Zclasse são controladas da mesma maneira.

Controlando o Acesso a Instâncias de sua ZClasse

A seção anterior explicou como você pode controlar o acesso a instâncias dos métodos e propriedades de sua ZClasse. O controle de acesso está controlando quem pode criar novas instâncias de sua ZClasse. Como você viu recentemente no capítulo, instâncias são criadas por FACTORIES. FACTORIES são associados com permissões. No caso do Zoo Exhibit, a permissão Add Zoo Exhibits controla a habilitação para criar instâncias de Zoo Exhibit.

Normalmente somente Administradores terão a permissão Add Zoo Exhibit, então somente Administradores estarão habilitados a criar novas Zoo Exhibits.No entanto, como todas as permissões Zope, você pode mudar cada uma das funções que tem esta permissão em diferentes lugares do seu site. É importante perceber que estas permissões são controladas separadamente da permissão Edit Zoo Exhibits. Isto torna possível permitir que algumas pessoas assim como os tratadores modifiquem, mas não criem Zoo Exhibits.

Fornecendo Ajuda Sensível ao Contexto à sua ZClasse

Na tela Views de sua ZClasse, você pode ver que cada visualização pode ser associada com um Help Topic. Isto permite a você fornecer um link para um tópico de Ajuda diferente dependendo em qual visualização o usuário está. Por exemplo, criaremos um tópico de ajuda para a visualização Edit da ZClasse ZooExhibit.

Primeiro, você precisa criar objeto de tópico de ajuda atual. Isto é feito indo até o produto ZooExhibit que contém a ZClasse ZooExhibit, e clicando na pasta Help. O ícone deverá ser visto como uma pasta com uma interrogação azul marcada nela.

Dentro desta pasta especial, puxe para baixo a lista de adição e selecione Help topic. Dê a este tópico o id "ExhibitEditHelp" e o título "Ajuda para a edição de Exibições" e clique em Add.

Agora você verá que a pasta Help contém um novo objet de tópico de ajuda chamado ExhibitEditHelp. Você pode clicar neste objeto e editá-lo, ele trabalha apenas como um documento DTML. Neste documento, você deve colocar a informação de ajuda que você quer mostrar para seus usuários:

    <dtml-var standard_html_header>
<h1>Help!</h1>
<p>To edit an exhibit, click on either the <b>animal</b>,
<b>description</b>, or <b>caretakers</b> boxes to edit them.</p>
<dtml-var standard_html_footer>

Agora que você criou o tópico de ajuda, você necessita associar com a visualização Edit de sua ZClasse. Para fazer isto, selecione a ZClasse ZooExhibit e clique na tabela Views. À direita, na mesma linha como a visualização Edit é definida, puxe para baixo a caixa selecionada de ajuda e selecione ExhibitEditHelp e clique em Change. Agora vá para uma de suas instâncias ZooExhibit, a visualização Edit agora tem um link Help! que você pode clicar para observar seu tópico de ajuda para esta visualização.

Na próxima seção, você verá como ZClasses podem ser combinadas com classes padrão Python para extendê-las funcionalmente em Python puro.

Usando Classes Básicas do Python

ZClasses dão a você uma interface de gerenciamento web para desenvolver novos tipos de objetos em Zope. No início deste capítulo, nós mostramos a você como você pode selecionar de uma base de classes para subclasses de sua ZClasse. A maioria desta classes bases estão atualmente escritas em Python, e nesta seção você verá como você pode obter suas próprias classes Python e incluí-las na lista a qual sua ZClasse pode extender seus métodos.

Escrever classes base Python é fácil, mas envolve alguns detalhes de instalação. Para criar uma classe base Python você necessita acessar ao sistema de arquivos. Crie um diretório dentro de seu diretório lib/python/Products chamado AnimalBase. Neste diretório crie um arquivo chamado Animal.py com este conteúdo:

class Animal: """ A base class for Animals """ _hungry=0 def eat(self, food, servings=1): """ Eat food """ self._hungry=0 def sleep(self): """ Sleep """ self._hungry=1 def hungry(self): """ Is the Animal hungry? """ return self._hungry

Esta classe define conjunto de métodos relacionados e um atributo padrão. Note que como método externo, os métodos desta classe podem acessar atributos privados.

Próximo você necessita registrar sua classe base com Zope. Criar um arquivo init.py no diretório AnimalBase com este conteúdo:

from Animal import Animal def initialize(context): """ Register base class """ context.registerBaseClass(Animal)

Agora você necessita reiniciar o Zope em ordem para ele encontrar sua base de classes. Após reiniciar o Zope você pode verificar que sua base de classes está registrado em um conjunto de diferentes maneiras. Primeiro vá até a pasta Products no painel de controle e procure por um pacote AnimalBase. Você deverá ver um produto com uma caixa fechada. Se você ver a caixa aberta, isto significa que há alguma coisa errada com seu produto AnimalBase.

Clique na visualização traceback para ver um TRACEBACK Python mostrando qual é o problema Zope que está ocorrendo no Zope na tentativa de registrar sua base de clases. Uma vez que você resolver qualquer problema que sua base de classes possa ter você necessitará reiniciar o Zope novamente. continue este processo até que o Zope carregue com sucesso seu produto. Agora você pode criar uma nova ZClasse e você deve ver AnimalBase:Animal como uma opção no campo de seleção da base de classes.

Para testar sua nova base de classes crie uma ZClasse que herde de AnimalBase:Animal. Enfeite seu animal do modo como desejar. Crie um métopdo DTML chamado care com este conteúdo:

  <dtml-var standard_html_header>
<dtml-if give_food>
<dtml-call expr="eat(cookie)">
</dtml-if>
<dtml-if give_sleep>
<dtml-call sleep>
</dtml-if>
<dtml-if hungry>
<p>I am hungry</p>
<dtml-else>
<p>I am not hungry</p>
</dtml-if>
<form>
<input type="submit" value="Feed" name="give_food">
<input type="submit" value="Sleep" name="give_sleep">
</form>
<dtml-var standard_html_footer>

Agora crie uma instância de sua classe animal e teste seu método care. O método care permite que você alimente seu animal e deixe-o dormir chamando métodos definidos em sua base de classes Python. Note também como após alimentar seu animal ele não está com fome, mas se você der a ele uma soneca ele acorda faminto.

Como você pode ver, criar seus próprios produtos e ZClasses é um processo envolvente, mas simples para entender uma vez que você compreende o básico. Com ZClasses sozinhas, você pode criar algumas belas aplicações Web complexas corretas em seu navegador web.

Na próxima seção, você verá como criar uma distribuição de seu produto, então você poderá compartilhar ela com outros ou cedêr-la para uma personalização.

Distribuindo Produtos

Agora que você criou seu próprio produto que permite a você criar qualquer número de exibições no Zope. Supomos que você tem um amigo em outro Zoológico o qual está impressionado com o seu novo sistema de exibições online, e quer obter um sistema similar para o seu Zoológico.

Talves você até pertença a "Associação americana de sustentação dos Zoológicos" e você quer estar apto a dar seu produto a qualquer interessado em um sistema de exibições similar ao seu. Zope deixa você distribuir seus produtos como um, pacote fácil de transportar que outros usuários podem copiar de você e instalar em sistema Zope.

Para distribuir seu produto, clique no produto ZooExhibit e selecione a tabela Distribuição. Isto levará você para a visualização Distribution.

O formulário nesta visualização permite a você controlar a distribuição que você quer criar. A caixa Version deixa você especificar a versão para a distribuição de seu produto. Para toda a distribuição que você faz, o Zope irá incrementar este número para você, mas pode querer especificá-lo você mesmo. Apenas deixe-o para o padrão de "1.0" a menos que você queira mudá-lo.

Os próximos dois radio buttons permite que você selecione ou não se você quer que outros estejam habilitados para personalizar e redistribuir o produto. Se você quer que eles personalizem ou resistribuam seu produto sem nenhuma restrição, selecione o button Allow Redistribution. Se você não quer permitir que eles estejam habilitados a redistribuir seu produto, selecione o button Disallow redistribution and allow the user to configure only the selected objects:. Se você não permitir a redistribuição, você pode escolher em uma base objeto por objeto qual de seus usuários podem personalizar seu produto. Se você não quer que eles estejam aptos a mudar qualquer coisa, então não selecione qualquer dos ítens nesta lista. Se você quer que eles estejam habilitados a mudar a ZClasse ZooExhibit, então selecione somente a ZClasse. Se você que que eles estejam habilitados a modificar tudo (mas ainda não estão habilitados a redistribuir seu produto) então selecione todos os objetos desta lista.

Agora, você pode criar uma distribuição de seu produto clicando em Create a distribution archive. O Zope irá agora gerar automaticamente um arquivo chamado ZooExhibit-1.0.tar.gz. Este produto pode ser instalado em qualquer Zope assim como qualquer outro produto, descompactando-o no diretório raiz de sua instalação Zope.

Não esqueça que quando você distribuir seu produto você também necessitará incluir qualquer arquivo igual aos arquivos de métodos externos e bases de classes Python que sua classe contar. Estas requisições tornam a distribuição mais difícil e por esta razão pessoas algumas vezes tentam evitar contar com arquivos Python quando criam através da web produtos para distriobuição.

por Diego Pereira do Nascimento Última modificação 09/10/2008 11:59 Creative Commons
Navegação
Enquete
Como você efetiva sua participação comunitária?








Mais »