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 Procurando e Categorizando Conteúdo
Ações do documento

12. Procurando e Categorizando Conteúdo

Um nível acima
Este capítulo mostra a você como indexar e buscar objetos com o mecanismo de busca construído no Zope, O Catalog (Catálogo). Introduz conceitos de indexação e discute diferentes modelos para indexação e busca. Enfim, trata de meta-dados e resultados de busca. Este capítulo mostra a você como criar uma arquitetura poderosa e fácil para usar a informação.

O Catalog é um mecanismo de busca embutido do Zope. Ele permite a você categorizar e pesquisar todos os tipos de objetos do Zope. Você pode também usá-lo para procurar dados externos tais como dados relacionais, arquivos, e páginas web remotas. Além disso, para pesquisar você pode usar o Catalog para organizar coleções de objetos.

O Catalog suporta uma interface rica de busca. Você pode executar procura de textos completos, e pode pesquisar múltiplos índices de uma só vez. Além disso, the catalog mantém traços de meta-dados sobre objetos indexados. Aqui estão os dois modelos de uso do ZCatalog mais comuns:

Catalogação em Massa

Catalogar uma grande coleção de objetos todos de uma vez.

Catalogação Automática
Catalogar objetos como eles são criados e localizar mudanças realizadas neles.

Começando com Catalogação em Massa

Vamos dar uma olhada em como usar o catálogo para procurar documentos. Catalogação de um grupo de objetos todos de uma vez é chamada catalogação em massa. Catalogação em massa envolve três passos:

  • Criar um ZCatalog
  • Encontrar objetos e catalogá-los
  • Criar uma interface web para procurar o catálogo.

Escolha Zcatalog da lista de adição de produtos para criar um objeto ZCatalog. Isso leva você para o formulário de adição do ZCatalog, como mostrado a Figura 9.1.

9-1.png
Figura 9.1 - Formulário de adição de ZCatalog

O formulário de adição pede a você um Id e um Title. O terceiro elemento do formulário é a caixa de seleção Vocabulary. Por enquanto, deixe essa caixa em "Create one for me". Dê a seu ZCatalog o Id "AnimalTracker" e clique em Add para criar seu novo catálogo. O ícone do Catalog parece com uma pasta com uma pequena lupa nele. Selecione o ícone AnimalTracker para ver a aba Contents do Catalog.

Um ZCatalog parece muito uma pasta, mas ele tem um pouco mais de abas. Seis abas no ZCatalog são exatamente as mesmas seis abas que você encontra em uma pasta padrão. O ZCatalog tem as seguintes abas: Contents, Catalog, Properties, Indexes, MetaData, Find Objects, Advanced, Undo, Security e Ownership. Quando você clica em um Zcatalog, você está na aba Contents. Aqui, você pode acrescentar novos objetos e o ZCatalog os incluirá da mesma maneira que qualquer pasta faz. Você deveria notar que restrição não significa que o objeto está disponível para pesquisa.

Agora que você criou um ZCatalog, você pode seguir para o próximo passo, encontrar objetos e catalogá-los. Suponha que você tem um site do zôo com informações sobre animais. Para trabalhar com esses exemplos, crie dois DTML Documentos que contêm informações sobre répteis e anfíbios:

Title: Rã quatro-olhos chilena

A rã quatro-olhos chilena tem um par luminoso de manchas em sua anca que parece olhos enormes. Quando sentada, as coxas da rã escondem esses olhos-manchas. Quando predadores se aproximam, a rã abaixa sua cabeça e ergue sua anca, criando uma cabeça muito maior e mais intimidativa. Rãs são anfíbios.

Title: Pele da jibóia (python)

Morelia spilotes variegata calcula-se que possui 2.4 metros de comprimento. É uma jibóia tamanho médio com manchas grandes com cor preto-para-cinza, crossbands, faixas, ou uma combinação dessas marcas em um fundo amarelado para marrom escuro. Cobras são répteis.

Visitantes de seu Zoo querem ser capazes de pesquisar informações sobre os animais do mesmo. Ansiosos herpetologistas querem saber se você tem sua cobra favorita, para isso você deveria oferecê-los a capacidade de pesquisar por certas palavras e mostrar todos os documentos que contêm essas palavras. A pesquisa é uma das mais úteis e comuns atividades da web.

O ZCatalog AnimalTracker que você criou pode catalogar todos os documentos em seu site Zope e deixar seu usuário pesquisar por palavras específicas. Para catalogar seus documentos, vá para o ZCatalog AnimalTracker e clique na aba Find Objects.

Nessa aba, você diz ao ZCatalog em que tipo de objetos você está interessado. Você quer catalogar todos DTML Documents então selecione DTML Document da seleção múltipla Find objects of type e clique Find and Catalog.

O ZCatalog agora começará da pasta onde ele está situado e procurará todos os DTML Documents Ele pesquisará na pasta e então descerá para dentro de todas as sub-pastas e suas sub-pastas. Se você tem vários desses objetos, isso pode levar um longo tempo para terminar, então seja paciente.

Depois de um período de tempo, o Catalog levará você para a view Catalog automaticamente, com uma mensagem dizendo-lhe o que ele acabou de fazer.

Abaixo da informação de status está uma lista de objetos que estão catalogados, eles são todos DTML Documents. Para confirmar que esses são os objetos que você está interessado, você pode clicar neles para olhá-los.

Você completou o primeiro passo da pesquisa de seus objetos, catalogando-os em um ZCatalog. Agora seus documentos estão no banco de dados do ZCatalog. Agora você pode seguir para o terceiro passo, criando uma página web e formulário de resultado para consultar o ZCatalog.

Formulários de Busca e Relatório

Para criar formulários de busca e relatório, certifique-se de que você está no catálogo AnimalTracker e selecione Z Search Irteface da lista de adição. Selecione o ZCatalog AnimalTracker como o objeto disponível para pesquisa, como mostrado na Figura 9.2.

9-2.png
Figura 9.2 - Criando um formulário de pesquisa para um ZCatalog

Nomeie o Report Id "SearchResults" e o Search Input Id "SearchForm" e clique Add. Isso criará dois novos DTML Methods no ZCatalog AnimalTracker chamados SeachForm e SearchResults.

Esses objetos estão incluídos no ZCatalog, mas eles não estão catalogados pelo ZCatalog. O AnimalTracker catalogou apenas DTML Documents. Os métodos de busca do relatório e do formulário são apenas uma interface de usuário para pesquisar documentos de animais no Catalog. Você pode verificar isso notando que os formulários de pesquisa e relatório não estão listados na aba Cataloged Objects.

Para procurar o ZCatalog AnimalTracker, selecione o método SearchForm e clique em sua aba View. Esse formulário tem vários elementos nele. Há um elemento de pesquisa para cada índice no ZCatalog. Índices são explicados mais adiante na próxima seção. Por enquanto, você quer usar o elemento do formulário PrincipiaSearchSource. Você pode deixar todos os outros elementos do formulário em branco.

Para digitar palavras no elemento PrincipiaSearchSource do formulário você pode procurar todos os documentos catalogados pelo ZCatalog AnimalTracker. Por exemplo, digite a palavra "Répteis". O ZCatalog AnimalTracker procurará e retornará uma tabela simples de objetos que tem a palavra "Répteis" nele. Os resultados da pesquisa deveriam incluir a pele da jibóia. Você pode também tentar especificar múltiplos termos de pesquisa como "afíbio réptil". Os resultados da pesquisa dessa consulta deveriam incluir ambos, a rã quatro-olhos chilena e a pele da jibóia. Parabéns, você criou um catálogo com sucesso, catalogou conteúdo nele e pesquisou através da web.

Configurando Catálogos

O Catalog é capaz de realizar pesquisas muito mais poderosas e complexas do que aquela que você acabou de realizar. Vamos dar uma olhada em como o Catalog armazena informação. Isso ajudará você a aprimorar seus catálogos para fornecerem o tipo de pesquisa que você quer.

Definindo Índices

ZCatalogs armazenam informação sobre objetos e seus conteúdos em bancos de dados rápidos chamados índices. Índices podem armazenar e reaver grandes volumes de informação muito rapidamente. Você pode criar diferentes tipos de índices que lembram diferentes tipos de informação sobre seus objetos. Por exemplo, você poderia ter um índice que lembra o conteúdo de texto dos DTML Documents, e um outro índice que lembra alguns objetos que têm uma propriedade específica.

Quando você procura um ZCatalog, você não está procurando por seus objetos um por um. Isso levaria tempo demais se você tivesse muitos objetos. Antes de você procurar um ZCatalog, ele procura seus objetos e lembra tudo que você disse-lhe para lembrar sobre eles. Esse processo é chamado indexação. Daqui em diante, você pode procurar por determinados critérios e o ZCatalog retornará objetos que atendam os critérios que você forneceu.

Um bom modo para pensar em um índice em um ZCatalog é como um índice em um livro. Por exemplo, em um índice de livro você pode procurar a palavra Python:

        Python: 23, 67, 227

A palavra Python aparece em três páginas. Os índices do Zope funcionam assim exceto pelo fato deles traçarem o termo de pesquisa, nesse caso a palavra Python, para uma lista de todos os objetos que a contém, em vez de uma lista de páginas em um livro.

No Zope 2.4, índices podem ser acrescentados e removidos de um Catalog usando uma moderna, interface de índice "plugada" como mostrada a Figura 9.3:

9-3.png
Figura 9-3 - Administrando índices

Aqui, você pode ver que ZCatalogs vêm com índices pré-definidos. Cada índice tem um nome, como PrincipiaSearchSource, e um tipo, como TextIndex.

Quando você cataloga um objeto o Catalog usa cada índice para examinar o objeto. O catálogo consulta atributos e métodos para encontrar um valor do objeto para cada índice. Por exemplo, no caso dos DTML Documents catalogados com um índice PrincipiaSearchSource, o Catalog chama cada método PrincipiaSearchSource do documento e grava o resultado em seu índice PrincipiaSearchSource. Se o Catalog não pode encontrar um atributo ou método para um índice, então ele ignora-o. Em outras palavras é bom se um objeto não suporta um determinado índice. Existem três tipos de índices:

TextIndex

Procura texto. Use esse tipo de índice quando você quer uma pesquisa de texto completo.

FieldIndex

Pesquisa objetos por valores específicos. Use esse tipo de índice quando você quer pesquisar objetos data, números, ou strings específicas.

KeywordIndex

Pesquisa coleções de valores específicos. Esse índice é como um FieldIndex, mas ele permite a você procurar coleções em lugar de valores únicos.

PathIndex

Procura por todos objetos que contém certos elementos do path da URL. Por exemplo, você poderia procurar por todos os objetos cujos paths começam com /Animals/Zoo.

Nós examinaremos esses diferentes índices mais de perto posteriormente no capítulo. Índices novos podem ser criados a partir da aba Indexes de um ZCatalog. Aí, você pode entrar com o name e selecionar um type para seu novo índice. Isso cria um índice novo e vazio no ZCatalog. Para colocar informação neste índice, você precisa ir para a aba Advanced e clicar no botão Update Catalog. Recatalogar seu conteúdo pode demorar um tempo se você tiver muitos objetos catalogados.

Para remover um índice de um Catalog, selecione os índices e clique no botão Delete. Isso apagará o índice e todo seu conteúdo indexado. Como sempre, essa operação não pode ser desfeita.

Definindo Meta Dados

O ZCatalog não apenas indexa informação sobre seu objeto, mas ele pode também armazenar informação sobre seu objeto em um tabular database chamado Meta-Data Table (Tabela Meta-Dados). A Tabela Meta-Dados funciona similarmente a uma tabela de banco de dados relacional, ela consiste de uma ou mais colunas que definem o esquema da tabela. A tabela está preenchida com linhas de informação sobre objetos catalogados. Essas linhas podem conter informação sobre objetos catalogados que você quer armazenar na tabela. Suas colunas de meta dados não precisam ligar seus índices do Catalog. Índices permitem você pesquisar; meta-dados permite você informar resultados da pesquisa.

A Tabela Meta-Dados é útil para gerar relatórios de pesquisa. Ela mantém o caminho da informação sobre objetos que vão em seus formulários de relatório. Por exemplo, se você cria uma coluna de Tabela Meta-Dados chamada absolute_url, então seus formulários de relatório podem usar essa informação para criar links a seus objetos que são retornados nos resultados da pesquisa.

Para adicionar uma nova coluna da Tabela Meta-Dados, digite no nome da coluna na aba Meta-Data Table e clique Add. Para remover uma coluna da Tabela Meta-Dados, selecione a coluna cheque a caixa e clique no botão Delete. Isso apagará a coluna e todo seu conteúdo para cada linha. Como sempre, essa operação não pode ser desfeita. Logo vamos ver mais de perto como procurar um Catalog.

Buscando em Catálogos

Você pode procurar um Catalog passando-o termos de procura. Esses termos de procura descrevem o que você está procurando em um ou mais índices. O Catalog pode coletar essa informação da requisição da web, ou você pode passar essa informação explicitamente do DTML ou Python. Em resposta para uma requisição de pesquisa, um Catalog retornará uma lista de registros correspondendo aos objetos catalogados que ligará os termos de pesquisa.

Buscando com Formulários

Nesse capítulo você usou o Z Search Interface para construir automaticamente um par Form/Action (Formulário/Ação) para consultar um Catalog (o modelo Form/Action é discutido no Capítulo 4, "Conteúdo Dinâmico com DTML"). O Z Search Interface constrói um formulário muito simples e um relatório muito simples. Esses dois métodos são um bom lugar para começar entender como Catalogs são consultados e como você pode personalizar e estender sua interface de pesquisa.

Suponha que você tem um catálogo que organiza notícias. Cada notícia tem conteúdos, um autor e uma data. Seu catálogo tem três índices que correspondem a esses atributos. O índice de conteúdos é um índice de texto e os índices autor e data são índices campo. Aqui está o formulário de pesquisa que permitiria a você consultar certo catálogo:

<dtml-var standard_html_header>




<form action="Report" method="get">
<h2><dtml-var document_title></h2>
Enter query parameters:<br><table> <br>




<tr><th>Content</th>
<td><input name="content" width=30 value=" "></td></tr>
<tr><th>Author</th>
<td> <input name="author" width=30 value=" "></td></tr>
<tr><th>Date</th>
<td> <input name="date" width=30 value=" "></td></tr>




<tr><td colspan=2 align=center>
<input type="SUBMIT" value="Submit Query">
</td></tr>
</table>
</form>




<dtml-var standard_html_footer>


Esse formulário consiste de três caixas de entrada chamadas content, author, e date. Esses nomes de elementos de entrada do formulário ligam os nomes dos índices no catálogo. Esses nomes devem ligar os nomes dos índices do catálogo para o mesmo encontrar os termos de pesquisa. Aqui está um formulário de relatório que trabalha com o formulário de pesquisa:

  <dtml-var standard_html_header> 

<table>
<dtml-in NewsCatalog>
<tr>
<td> <dtml-var author> </td>
<td> <dtml-var date> </td>
</tr>
</dtml-in>
</table>




<dtml-var standard_html_footer>


Há algumas coisas aqui que merecem uma verificação mais de perto. O principal de tudo é a tag in:

  <dtml-in NewsCatalog>

Essa tag chama o Catalog NewsCatalog. Note como os parâmetros do formulário de pesquisa (content, author, date) não são mencionados aqui. O Zope automaticamente certifica-se de que os parâmetros de consulta do formulário de pesquisa são dados ao Catalog. Tudo que você tem a fazer é certificar-se de que o formulário de relatório chama o Catalog. O Zope localiza os termos de pesquisa na requisição web e passa-os para o Catalog.

O Catálogo retorna uma seqüência de Record Objects (tal como ZSQL Methods). Esses objetos de registro correspondem a search hits, que são objetos que ligam o critério de pesquisa que você digitou neles. Para um registro ligar-se a uma pesquisa, ele deve ligar todos os critérios para cada índice especificado. Assim, se você digita um autor e alguns termos de pesquisa para os conteúdos, o Catalog retornará apenas registros que liguem ambos, o autor e os conteúdos.

Objetos de registro tinham um atributo para toda coluna na tabela de banco de dados. Objetos de registro para Catalogs funcionam muito similarmente, exceto pelo fato de um objeto Catalog Record tenha um atributo para toda coluna na Tabela Meta-Dados. Na realidade, o propósito da Tabela Meta-Dados é definir o esquema para objetos de registro que consultas de Catalog retornam.

Buscando Através do Python

DTML faz consulta a um Catalog de uma forma muito simples. Geralmente, o DTML certificará automaticamente se seus parâmetros de pesquisa são passados corretamente ao Catalog.

Às vezes, entretanto, você pode não querer procurar um Catalog a partir de um formulário web; alguma outra parte de sua aplicação pode querer consultar um Catalog. Por exemplo, suponha que você quer acrescentar um sidebar para o Zôo Zope que mostra notícias que se relacionam apenas com os animais na seção do site que você está atualmente olhando. Como você viu, o site Zôo Zope é construído com Folders (pastas) que organizam todas as seções de acordo com o animal. Cada id do Folder é um nome que especifica o grupo ou animal que a pasta contém. Suponha que você quer seu sidebar para mostrar-lhe todas as notícias que contém o id da seção atual. Aqui está um Script chamado relevantSectionNews que consulta o Catalog de notícias com o id da pasta atual:

  ## Script (Python) "relevantSectionNews"  
##
" " "Returns news relevant to the current folder's id " " "
id=context.getId()
return context.NewsCatalog({content : id})

Esse script consulta o NewsCatalog ao chamá-lo como um método. O Catalog espera um mapping como o primeiro argumento quando eles são chamados. O argumento mapeia o nome de um índice para os termos de pesquisa que você está procurando. Nesse caso, o índice content será consultado por todas as notícias que contêm o nome do Folder atual. Para usar isso em seu sidebar, apenas edite o standard_html_header do Zôo Zope para usar o script relevantSectionNews:

  <html> 
<body>
<dtml-var style_sheet>
<dtml-var navigation>
<ul>
<dtml-in relevantSectionNews>
<li><a href="&dtml-absolute_url;"><dtml-var title> </a> </li>
</dtml-in>
</ul>

Esse método assume que você definiu absolute_url e title como colunas meta-dados no Catalog de notícias. Agora, quando você está em uma seção particular, a sidebar mostrará uma lista simples de links para notícias que contêm o id da seção animal atual que você está visualizando.

Buscando e Indexando Detalhes

Anteriormente você viu que o Catalog suporta três tipos de índices, índices de texto, índices de campo e índices de palavra chave. Vamos examinar esses índices mais de perto para entender para que eles servem e como procurá-los.

Buscando Índices de Texto

Um Text Index (índice de texto) é usado para indexar texto. Depois de indexar, você pode procurar o índice por objetos que contêm certas palavras. Text Indexes suportam uma rica gramática de pesquisa para fazer buscas mais avançadas que apenas procurar por uma palavra. O Text Index do ZCatalog pode:

  • Procurar por expressões Booleanas como "word1 AND word2". Isso procurará por todos os objetos que contêm ambas "word1" e "word2". Operadores Booleanos válidos incluem AND, OR, e AND NOT.
  • Controlar a ordem de pesquisa com expressões usando parênteses "(word1 AND word2) OR word3)". Isso retornará objetos contendo "word1" e "word2" ou apenas objetos que contêm o termo "word3".
  • Se você usa um tipo especial de objeto Vocabulary (explicado um pouco mais adiante) você pode pesquisar usando expressões comuns simples como "Z*", que retorna todas as palavras que começam com "Z".

Todas essas características avançadas podem ser mescladas. Por exemplo, "((bob AND uncle) AND NOT Zoo*)" retornará todos os objetos que contêm os termos "bob" e "uncle" mas não incluirá objetos que contêm palavras que começam com "Zoo" como "Zoologist", "Zoology", ou "Zoo" mesmo.

Consultar um TextIndex com essas características avançadas funciona da mesma maneira que consultá-lo com as características simples originais. No formulário de pesquisa HTML para DTML Documents, por exemplo, você poderia digitar "Koala AND Lion" e obter todos os documentos sobre Coalas e Leões. Consultar um TextIndex a partir do Python com características avançadas funciona da mesma forma; suponha que você quer mudar seu Script relevantSectionNews para não incluir notícias que contenham a palavra "catastrophic":

  ## Script (Python) "relevantSectionNews" 
##
" " " Returns relevant, non-catastropic news " " " "
id=context.getId()
return context.NewsCatalog(
{content : id + ' AND NOT catastrophic'}
}

TextIndexes são muito poderosos. Quando mesclados com o modelo de Catalogação Automática descrito mais tarde no capítulo, eles dão a você a habilidade para automaticamente pesquisar livremente textos em todos os objetos que você criou e editou.

Vocabulários

Vocabulários são usados pelos índices de texto. Um vocabulário é um objeto que administra opções de indexação de texto específico da língua. Para o ZCatalog trabalhar com algum tipo de língua, ele deve entender certos comportamentos dessa língua. Por exemplo, todas as línguas:

  • Tem um conceito diferente de words (palavras). Em Inglês e muitas outras línguas, palavras são definidas por limites de espaço em branco, mas em outras línguas, como Chinês e Japonês, palavras são definidas por seu uso contextual.
  • Tem conceitos diferentes de stop words (palavras de pausa). Uma palavra de pausa é uma palavra comum que deveria ser ignorada pelos índices. A palavra francesa nous seria extremamente comum num texto francês e deveria provavelmente ser removida como uma palavra de pausa, mas num texto em inglês ele poderia ter sentido perfeito para catalogar essa palavra porque ela é muito rara.
  • Tem conceitos diferentes de sinônimos. O par de sinônimos automobile/car (automóvel/carro) não faria sentido em nenhuma língua, apenas em Inglês.
  • Tem conceitos diferentes de derivação. Em Inglês, isso é comum em índices de texto para tirar sufixos como ing de palavras, a fim de que bake e baking liguem a mesma palavra. Isso é chamado derivação. Esses sufixos strippings fariam sentido apenas para o Inglês, e outras línguas deveriam querer oferecer suas próprias derivações (ou não ter nenhum).
Vocabulários Atuais

Existe vários vocabulários disponíveis atualmente para ZCatalog:

Vocabulários Simples

Vocabulários simples são muito simples e realizam o mínimo de tarefas específicas do idioma inglês.

Vocabulários Globais

Vocabulários Globais são vocabulários mais complexos que permitem pesquisas de expressões em texto em inglês para serem realizadas. O lado ruim deles é que consomem muito mais memória e espaço no banco de dados que vocabulários simples.

A idéia por trás dos Vocabulários é personalizar o modo do texto em qualquer linguagem que está indexada. Devido a isso, outras linguagens podem ser suportadas no futuro por pessoas que criam um Vocabulário específico para sua linguagem. Criar seu próprio Vocabulário é um tópico avançado e está além do objetivo desse livro.

Usando Vocabulários

Quando você cria um ZCatalog novo, o formulário de adição do ZCatalog tem uma caixa de seleção para você escolher um vocabulário para usar. Se você não selecionar um vocabulário, o ZCatalog cria automaticamente um Vocabulário Simples para você, e acrescenta-o aos conteúdos do ZCatalog (isso pode ser visto na aba Contents do AnimalTracker que você criou para os exemplos desse capítulo).

Para usar um Vocabulário Global ou qualquer outro tipo de Vocabulário, você deve criá-lo primeiro antes de criar o Catálogo em que você quer usá-lo. Um ZCatalog pode usar qualquer Vocabulário dentro de seus conteúdos ou qualquer Vocabulário que ele pode encontrar acima dele na hierarquia de Pasta do Zope.

Buscando Índices de Campo

FieldIndexes (índices de campo) diferem pouco dos TextIndexes (índices de texto). Um TextIndex considera o valor que ele encontra em seu objeto, por exemplo os conteúdos de uma notícia, como texto. Isto significa que ele divide o texto em palavras e indexa todas as palavras individualmente.

Um FieldIndex não divide o valor que ele encontra. Ao contrário, ele indexa inteiro o valor que ele encontra. Isto é muito útil para localizar objetos que têm características com valores fixos.

No exemplo de notícia, você criou dois FieldIndexes, date e author. Com o formulário de pesquisa existente, esses campos não são muito úteis. Para usa-los mais eficazmente você tem que personalizar um pouco seu formulário de pesquisa. Antes de fazer isso entretanto, vamos considerar alguns casos de uso para esses índices.

O índice date permite a você procurar por notícias pela data em que foram criadas. O formulário de pesquisa existente não é muito útil entretanto porque você tem que digitar exatamente a hora que você está procurando, até o segundo, na caixa de texto para obter êxito. Isso, obviamente, não é muito útil. Seria melhor procurar por uma série de datas, como todas as notícias acrescentadas nas últimas 24 horas, ou todos os próximos Items do último mês.

O índice author permite a você procurar por notícias de certos autores. A menos que você saiba exatamente o nome do autor que está procurando entretanto, não obterá quaisquer resultados. Seria melhor ser capaz de selecionar de uma lista de todos os autores únicos indexados pelo índice author.

FieldIndexes (índices de campo) são projetados para fazer ambos, pesquisa de série e pesquisa por um valor único no índice. Para levar vantagem dessas características, você precisa apenas mudar um pouco seu formulário de pesquisa. Vamos tentar o primeiro exemplo, pesquisa de série com datas.

Como TextIndexes, FieldIndexes podem passar opções especiais para habilitar essas características. Essas características especiais precisam ser passadas como elementos do formulário que conseguem entrar nas consultas do Catalog. Aqui está o formulário de pesquisa usado na seção anterior Searching with Forms, mas com alguns elementos novos do formulário acrescentados para habilitar pesquisa por notícias modificadas desde "Yesterday", "Last Week", "Last Month", "Last Year" ou "Ever":

  <dtml-var standard_html_header>

<form action="Report" method="get">
<h2><dtml-var document_title></h2>
Search for News Items:<br><table>




<tr><th>Content</th>
<td><input name="content" width=30 value=""></td></tr>
<tr><th>Author</th>
<td><input name="author" width=30 value=""></td></tr>
<tr>
<td><p>modified since:</p></td>
<td>
<input type="hidden" name="date_usage" value="range:min">
<select name="date:date">
<option value="<dtml-var expr="ZopeTime(0)" >Ever</option>
<option value="<dtml-var expr="ZopeTime() - 1" > " >Yesterday</option>
<option value="<dtml-var expr="ZopeTime() - 7" > " >Last Week</option>
<option value="<dtml-var expr="ZopeTime() - 30" > " >Last Month</option>
<option value="<dtml-var expr="ZopeTime() - 365" >" >Last Year</option>
</select>
</td>
</tr>




<tr><td colspan=2 align=center>
<input type="SUBMIT" value="Submit Query">
</td></tr>
</table>
</form>
<dtml-var standard_html_footer>


Isso deveria fazer seu formulário de pesquisa parecer com a Figura 9.4.

9-4.png
Figura 9.4 - Pesquisa de série por Data

Este formulário HTML muda o formato da data do formulário de pesquisa antigo. Ao invés de apenas uma caixa de texto, ele lhe oferece uma caixa de seleção onde você pode escolher uma data. Mas lembre, isto é uma pesquisa de série. Você pode ver a parte que diz para o FieldIndex date para procurar por série? Aqui está ela:

  <input type="hidden" name="date_usage" value="range:min">

Este é um tipo especial de elemento do formulário HTML chamado de elemento hidden.

Ele não mostra qualquer lugar que você olha no formulário de pesquisa, mas é ainda passado no Zope quando você dá um submit no formulário. Este elemento especial, chamado date_usage diz para o FieldIndex date que o valor no elemento de formulário date é um minimum range boundary (limite de série mínimo). Isto significa que o FieldIndex não retornará apenas objetos que têm essa data, mas retornará objetos que têm essa data ou qualquer data posterior.

Qualquer tipo de FieldIndex pode ser dito que tipo de especificadores de série usar ao acrescentar um argumento de pesquisa adicional que acrescenta o sufixo o nome índice com"_usage". Além disso, para especificar um limite de série mínimo, você especifica um limite de série máximo mudando o elemento de formulário hidden para:

  <input type="hidden" name="date_usage" value="range:max">

Isto fará o formulário de pesquisa retornar todas as notícias modificadas antes da data especificada, ao invés de depois.

A sintaxe "_usage" pode ser usada também quando chamar um Catalog diretamente de um script, como este Script, relevantRecentSectionNews:

  ## Script (Python) "relevantRecentSectionNews" 
##
" " " Return relevant, and recent, news for this section " " "
id=context.getId()
return context.NewsCatalog(
{content : id,
date : ZopeTime() - 7,
date_usage : range:min,
}
)

Este funciona da mesma maneira que seu script relevantSectionNews antigo, exceto pelo fato dele mostrar apenas notícias criadas na última semana.

Você pode também fornecer ambos, um limite de série mínimo e máximo. Há um problema para isto, entretanto. Normalmente se você não especifica nenhum limite de série ou apenas um limite, o ZCatalog usa o valor que você passa nele como o termo de pesquisa. Mas quando você fornece dois limites de série, o ZCatalog precisa de dois valores, não um. Aqui está o Script relevantRecentSectionNews acima com algumas modificações para fornecer uma lista de objetos data ao invés de apenas uma:

  ## Script (Python) "relevantRecentSectionNews"
##
" " "
Return relevant news modified in the last month, but not the
last week
" " "
id=context.getId()
return context.NewsCatalog(
{content : id,
date : [ZopeTime() - 30, ZopeTime() - 7],
date_usage : range:min:max,
}
)

Este script retornará todas as notícias relevantes modificadas no último mês, mas não na semana passada. Quando usar dois especificadores de série, é importante certificar-se de que você obtém a ordem dos valores corretamente para ligar a ordem dos especificadores de série. Se você fosse ligar acidentalmente o "min" e "max", mas não ligasse as duas datas, então você não obterá resultados da pesquisa porque está fazendo uma consulta que não tem sentido (fornecendo um valor mínimo que é maior que o valor máximo).

O segundo caso de uso que você considerou acima estava sendo capaz de pesquisar de uma lista de todos autores únicos. Há um método especial no ZCatalog que faz exatamente isso chamado uniqueValuesFor. O método uniqueValuesFor retorna um lista de valores únicos para um certo índice. Vamos mudar seu formulário de pesquisa novamente, e substituir a caixa de entrada author original com algo um pouco mais útil:

  <dtml-var standard_html_header>  

<form action="Report" method="get" >
<h2><dtml-var document_title></h2>
Search for News Items:<br><table>




<tr><th>Content:</th>
<td><input name="content" width=30 value=" "></td></tr>
<tr valign="top">
<td><p>Author:</p></td>


<td>
<select name="author:list" size=6 MULTIPLE>
<dtml-in expr="AnimalTracker.uniqueValuesFor(author)" >
<option value=" <dtml-var sequence-item>" >
<dtml-var sequence-item> </option>
</dtml-in>
</select>
</td>
</tr>





<tr>
<td><p>modified since:</p></td>
<td>
<input type="hidden" name="date_usage" value="range:min">
<select name="date:date">
<option value="<dtml-var "ZopeTime(0)">" >Ever</option>
<option value="<dtml-var "ZopeTime() - 1">">Yesterday</option>
<option value="<dtml-var "ZopeTime() - 7">">Last Week</option>
<option value="<dtml-var "ZopeTime() - 30" >">Last Month</option>
<option value="<dtml-var "ZopeTime() - 365" >">Last Year</option>
</select>
</td>
</tr>




<tr> <td colspan=2 align=center>
<input type="SUBMIT" name="SUBMIT" value="Submit Query" >
</td></tr>
</table>
</form>
<dtml-var standard_html_footer>


A nova, parte importante do código acrescentada ao formulário de pesquisa é:

  <select name="author:list" size=6 MULTIPLE>   
<dtml-in expr="AnimalTracker.uniqueValuesFor(author)">
<option value="<dtml-var sequence-item>"<
<dtml-var sequence-item></option>
</dtml-in>
</select>

O HTML também foi mudado um pouco para fazer a apresentação na tela ter sentido.

Nesse exemplo, você está mudando o elemento author do formulário de apenas uma caixa de texto simples para uma caixa de seleção múltipla HTML. Esta caixa contém uma lista única de todos os autores que estão indexados no FieldIndex author. Agora, seu formulário de pesquisa deveria parecer com a Figura 9.5.

9-5.png
Figura 9-5 - Pesquisa de série e Autores únicos

É isso aí. Você pode continuar a modificar esse formulário de pesquisa usando elementos de formulário HTML para ser tão complexo quanto você gostaria. Na próxima seção, nós mostraremos-lhe como usar o próximo tipo de índice, índices de palavra chave.

Buscando Índices de Palavra Chave

Um KeywordIndex indexa uma seqüência de palavras chave para objetos e pode ser consultado por quaisquer objetos que tenham uma ou mais dessas palavras chave.

Suponha que você tem vários objetos Image que têm uma propriedade topics. A propriedade topics é uma propriedade lines que lista os tópicos relevantes de uma dada Imagem, por exemplo, "Portraits", "19th Century", e "Women" para uma foto da Rainha Victoria.

Os tópicos fornecem uma maneira de categorizar Imagens. Cada Imagem pode pertencer a uma ou mais categorias dependendo de sua propriedade topics. Por exemplo, o retrato (portrait) da Rainha Victoria pertence a três categorias e pode assim ser encontrado pela pesquisa por qualquer dos três termos.

Você pode usar um índice KeyWord para procurar a propriedade topics. Defina um índice KeyWord com o nome topics em seu ZCatalog. Logo, catalogue suas Imagens. Agora você deveria ser capaz de encontrar todas as Imagens que são retratos (portraits) criando um formulário de pesquisa e pesquisar por "Portraits" no campo topics. Você pode também encontrar todas as fotos que representam assuntos, como Século 19, pesquisando por "19th Century".

É importante compreender que a mesma Imagem pode estar em mais de uma categoria. Isto dá a você muito mais flexibilidade em pesquisar e categorizar seus objetos que você obtém com um índice de campo. Usando um índice de campo seu retrato da Rainha Victoria pode ser categorizado apenas de uma maneira. Usando um índice de palavra chave ele pode ser categorizado de muitas maneiras diferentes.

Freqüentemente você usará uma pequena lista de termos com índices KeyWord. Neste caso você pode querer usar o método uniqueValuesFor para criar um formulário de pesquisa padrão. Por exemplo, aqui está uma parte do DTML que criará uma caixa de seleção múltipla para todos os valores no índice topics:

  <select name="topics:list" multiple>   
<dtml-in expr="uniqueValuesFor(topics)">
<option value="&dtml-sequence-item;"><dtml-var sequence-item> </option>
</dtml-in>
</select>

Usando esse formulário de pesquisa você pode oferecer usuários com uma série de termos de pesquisa válidos. Você pode selecionar tantos tópicos quanto você quiser e o Zope encontrará todas as Imagens que ligam um ou mais de seus tópicos selecionados. Cada objeto não apenas pode ter vários termos indexados, mas você pode fornecer vários termos de pesquisa e encontrar todos os objetos que têm um ou mais destes valores.

Buscando Índices de Caminho

Índices de Caminho permitem você procurar por objetos baseados em sua localização no Zope. Suponha que você tem um objeto cujo caminho é /zoo/animals/Africa/tiger.doc. Você pode encontrar este objeto com as consultas de caminho: /zoo, or /zoo/animals, or /zoo/animals/Africa. Em outras palavras, um índice de caminho permite-lhe encontrar objetos dentro de uma dada pasta (e abaixo dela).

Se você coloca objetos relacionados dentro das mesmas pastas, você pode usar índices de caminho para localizá-los rapidamente. Por exemplo:

  <h2>Lizard Pictures</h2>    

<p>
<dtml-in expr="Catalog(meta_type=Image,
path=/Zoo/Animals/Lizard)">
<a href="&dtml-absolute_url;"><dtml-var title></a>
</dtml-in>
</p>


Esta consulta procura um catálogo por todas as imagens que estão localizadas dentro da pasta /Zoo/Animals/Lizard e abaixo. Ela cria um link para cada imagem.

Dependendo de como você optar por organizar objetos em seu site, você pode achar que índices de caminho são mais ou memos eficazes. Se você localiza objetos dentro de seu assunto (por exemplo, se objetos estão principalmente localizados nas pastas "home" de usuário) então índices de caminho podem ser de valor limitado. Nestes casos, índices de palavra chave e de campo serão mais úteis.

Buscas Avançadas com Registros

Uma nova característica do Zope 2.4 é a habilidade para consultar índices mais precisamente usando objetos registro. Objetos registro contêm informação sobre como consultar um índice. Registros são objetos Python com atributos, ou mappings. Índices diferentes suportam atributos de registro diferentes.

Atributos de Registros para Índices de Palavra Chave

query

Ou uma seqüência de palavras ou uma palavra única. (obrigatória)

operator

Especifica se todas palavras chave ou apenas uma precisa ligar. Valores permitidos: and , or. (opcional, default: or)

Por exemplo:

   
# big or shiny
results=Catalog(categories=['big, 'shiny'])

# big and shiny
results=Catalog(categories={'query':[big,'shiny'],
'operator':'and'})


A segunda consulta liga objetos que têm ambas palavras chave "big" e "shiny". Sem usar a sintaxe de registro você pode apenas ligar objetos que são big ou shiny.

Atributos de Registros para Índices de Campo

query

Ou uma seqüência de objetos ou um valor único para ser passado como consulta para o índice (obrigatório).

range

Define uma pesquisa de série em um Field Index (opcional, default: não instalado).

Valores permitidos:

min

Procura por todos os objetos com valores maiores que o mínimo de valores passados no parâmetro query.

max

Procura por todos os objetos com valores menores que o máximo de valores passados no parâmetro query.

minmax

Procura por todos os objetos com valores menores que o máximo de valores passados no parâmetro query e maiores que o mínimo de valores passados no parâmetro query.

Por exemplo:

  # items modified in the last week   
results=Catalog(bobobase_modification_time={
'query':DateTime() - 7,
'usage': 'min'}
)

Esta consulta liga objetos com um bobobase_modification_time menores que DateTime() -7. Compare esta consulta com uma definida anteriormente em relevantRecentSectionNews neste capítulo que usa date_usage para realizar a mesma consulta.

Atributos de Registros para Índices de Texto

query

Qualquer uma seqüência de palavras (separadas por espaço em branco) ou uma palavra única para ser passada como consulta para o índice. (obrigatório)

operator

Especifica como combinar os termos de pesquisa. (opcional, default: or).

Valores permitidos:

and

Todos os termos devem estar presentes.

or

Pelo memos um termo deve estar presente.

andnot

O primeiro termo deve estar presente, porém nenhum dos demais termos.

Não há muita razão para usar consultas de registro com índices de texto já que você pode pôr a informação do perador na busca da string de uma maneira muito flexível.

Atributos de Registros para Índices de Caminho

query

Caminho para busca ou como uma string (e.g. "/Zoo/Birds") ou lista (e.g. ["Zoo", "Birds"]). (obrigatória)

level

O nível de caminho para começar a pesquisar. (opcional, default: 0)

Suponha que você tem uma coleção de objetos com esses caminhos:


  1. /aa/bb/aa/

  2. /aa/bb/bb/

  3. /aa/bb/cc/

  4. /bb/bb/aa/

  5. /bb/bb/bb/

  6. /bb/bb/cc/

  7. /cc/bb/aa/

  8. /cc/bb/bb/

  9. /cc/bb/cc/



Aqui estão algumas consultas de exemplo e seus resultados para mostrar como o atributo level funciona:

    query=/aa/bb, level=0 returns 1, 2, 3
    query=/bb/bb, level=0 returns 4, 5, 6
    query=/bb/bb, level=1 returns 2, 5, 8
    query=/bb/bb, level=−1 returns 2, 4, 5, 6, 8
    query=/xx, level=−1 returns none

Você pode usar o atributo level para flexibilizar partes diferentes de pesquisa do caminho.

Como no Zope 2.4.1, vocÊ também pode incluir a informação do nível em uma pesquisa sem usar um registro. Simplesmente use uma tupla contendo a pesquisa e o nível. Aqui temos um exemplo de tupla: ("/aa/bb", 1).

Criando Registros em HTML

Você pode também realizar consultas de registro usando formulários HTML. Aqui está um exemplo mostrando como criar um formulário de pesquisa usando registros:

  <form action="Report" method="get"> 
<table>
<tr><th>Search Terms (must match all terms)</th>
<td><input name="content.query:record" width=30 value=""> </td></tr>
<input type="hidden" name="content.operator:record" value="and">
<tr><td colspan=2 align=center>
<input type="SUBMIT" value="Submit Query">
</td></tr>
</table>
</form>

Para mais informação sobre a criação de registros em HTML veja a seção "Passando Parâmetros para Scripts" no Capítulo 10, Script Avançado do Zope.

Pesquisas Armazenadas

Enquanto o uso principal do Catalog é fornecer pesquisa interativa, você pode também usar pesquisas armazenadas para categorizar e organizar seu site. Por exemplo, na seção de índices de palavra chave você viu como você pode usar o Catalog e propriedades para procurar por categorias de Images tais como retratos. Além disso, para fornecer pesquisa interativa para categorias de Images você pode criar páginas web com pesquisas capacitadas. Assim, por exemplo, aqui está um DTML que você poderia usar para uma página que mostra todos seus retratos:

 
<dtml-var standard_html_header>

<h1>Portraits</h1>




<dtml-in expr="ImageCatalog({'topics':'Portraits'})">
<p>
<dtml-var sequence-item>
<dtml-var title_or_id>
</p>
</dtml-in>




<dtml-var standard_html_footer>


A natureza dinâmica desta página não está visível para o espectador. Contudo, apenas acrescente um outro retrato, atualize o catálogo e essa página incluirá automaticamente a nova Image.

Esta técnica pode ser muito poderosa. Você apenas não pode organizar e mostrar recursos públicos, mas você pode facilmente instituir sistemas workflow etiquetando objetos com propriedades para indicar seu estado e catalogá-los. Depois é fácil para você criar páginas para pessoas diferentes que mostram quais objetos precisam de sua atenção. Esta técnica é até mais poderosa quando usando o modelo Automatic Cataloging.

Catalogação Automática

Catalogação Automática é um modelo de uso avançado de Catálogo que mantém objetos atualizados quando eles forem modificados. Ele requer que a medida que objetos são criados, modificados, e destruídos, eles sejam automaticamente localizados por um ZCatalog. Isso geralmente envolve os objetos notificando o Catalog quando eles são criados, modificados, ou apagados.

Esse modelo de uso tem várias vantagens em comparação com a catalogação em massa. A catalogação em massa é simples mas tem desvantagens. O montante total de conteúdo que você pode indexar em uma transação é equivalente a quantidade de memória virtual livre disponível para o processo do Zope, mais a quantidade de armazenamento temporário que o sistema tem. Em outras palavras, quanto mais conteúdo você quer indexar de uma só vez, melhor seu hardware tem que ser. A catalogação em massa funciona bem para indexar alguns milhares de objetos, mas acima disso a indexação automática funciona muito melhor.

Uma outra vantagem principal da catalogação automática é que ela pode controlar objetos que mudam. Quando objetos evoluem e mudam, a informação de índice é sempre atual, até mesmo para mudar rapidamente fontes de informação como caixas de mensagem.

Nessa seção, nós mostraremos a você um exemplo que cria "news" itens que pessoas podem acrescentar em seu site. Estes itens serão automaticamente catalogados. Esse exemplo consiste de dois passos:

  • Criar um tipo novo de objeto para catalogar.
  • Criar um Catalog para catalogar os objetos criados recentemente.

A partir do Zope 2.3, nenhum dos objetos do Zope que estão prontos para usar suportam catalogação automática. Isto é por razões de compatibilidade anteriores. Agora, você tem que definir seus próprios tipos de objetos que podem ser catalogados automaticamente. Uma das maneiras em que isto pode ser feito é definir uma ZClass.

Um ZClass é um objeto Zope que define tipos novos de objetos Zope. De certo modo, uma ZClass é como desenho que descreve como os novos objetos do Zope são construídos. Considere uma notícia como as discutidas em exemplos anteriores no capítulo. Notícias não têm apenas conteúdo, mas elas têm também propriedades específicas que fazem delas notícias. Freqüentemente esses Items vêm em coleções que têm suas próprias propriedades. Você quer construir um site Néws que coleciona News Items, reveja-as, e divulgue-as online para um site web onde leitores possam lê-las.

Neste tipo de sistema, você pode querer criar um tipo novo de objeto chamado News Item. Deste modo, quando você quer acrescentar uma notícia nova em seu site, você apenas seleciona-a a partir da lista de adição de produtos. Se você planejou para este objeto ser catalogado automaticamente, então você pode procurar o conteúdo de suas notícias de uma maneira melhor. Nesse exemplo, você apenas olha rapidamente as ZClasses, que são descritas com muito mais detalhes no Capítulo 14, "Estendendo o Zope".

Tipos novos de objetos são definidos na seção Products do Control Panel (Painel de Controle). Chega-se lá clicando no Control Panel e então clicando no Product Management. Produtos contêm tipos novos de ZClasses. Nesta tela, clique "Add" para acrescentar um produto New. Você será levado para o formulário de adição de novos Productos.

Chame o Producto novo de "News" e clique "Generate". Isto levará você de volta para a aba Products Management e você verá seu Producto novo.

Selecione o Produto News clicando nele. Este novo Produto parece muito com um Folder. Ele contém um objeto chamado Help e tem um menu Add, bem como "abas" do Folder no topo. Para acrescentar uma nova ZClass, abra o menu de seleção Add e selecione ZClass. Isto levará você para o formulário de adição da ZClass, como mostra a Figura 9.6.

9-6.png
Figura 9.6 - Formulário de adição da ZClass

Este é um formulário complicado que será explicado com muito mais detalhe no Capítulo 14, "Estendendo o Zope". Agora, você precisa apenas fazer três coisas para criar sua ZClass:

  • Especificar o Id "NewsItem". Esse é o nome da nova ZClass.
  • Especificar o meta_type "News Item". Esse será usado para criar a entrada no menu de adição para seu novo tipo de objeto.
  • Selecionar ZCatalog: CatalogAware da caixa Base Classes da esquerda, e clique no botão com a seta apontando para a caixa Base Classes da direita. Isto deveria fazer com que ZCatalog:CatalogAware seja mostrado na janela da direita.

Quando você estiver pronto, não mude quaisquer das outras colocações no formulário. Para criar sua nova ZClass, clique Add. Isto levará você de volta ao seu Produto News. Note que existe agora um objeto novo chamado NewsItem bem como vários outros objetos. O objeto NewsItem é sua nova ZClass. Os outros objetos são "auxiliares" que você examinará mais no Capítulo 14, "Estendendo o Zope".

Selecione o objeto ZClass NewsItem. Sua visualização deveria parecer agora com a Figura 9.7.

9-7.png
Figura 9-7 - A aba Methods da ZClass

Esta é a aba Methods de uma ZClass. Aqui, você pode acrescentar objetos Zope que atuarão como métodos em seu novo tipo de objeto. Aqui, por exemplo, você pode criar DTML Methods ou Scripts e esses objetos se tornarão métodos em quaisquer novos News Items que sejam criados. Antes de criar quaisquer métodos contudo, vamos rever as necessidades desse novo objeto "News Item":

News Content

O News Item contém conteúdo de notícias, este é seu propósito primário. Esse conteúdo deveria ser qualquer tipo de texto ou conteúdo de marcação como HTML ou XML.

Author Credit

O News Item deveria fornecer algum tipo de crédito para o autor ou organização que criou-a.

Date

News Items são expiráveis, assim a data em que o item foi criado é importante.

Keywords

News Items se ajustam dentro de várias listas de categorias. Por convenção, essas listas de categorias são freqüentemente chamadas keywords.

Você pode querer que seu novo objeto News Item tenha outras propriedades, essas são apenas sugestões. Para acrescentar propriedades novas a seu News Item clique na aba Property Sheets. Esta leva você para a aba Property Sheets.

Propriedades são acrescentadas para novos tipos de objetos em grupos chamados Property Sheets. Já que seu objeto não tem nenhuma property sheet definida, essa view está vazia. Para acrescentar uma Nova Property Sheet, clique Add Common Instance Property Sheet, e dê a folha o nome "News". Agora clique Add. Isto acrescentará uma nova Property Sheet chamada News a seu objeto. Clicar na nova Property Sheet levará você para a aba Properties da Property Sheet News, como mostra a Figura 9.8.

9-8.png
Figura 9.8 - A tela de propriedades para uma Property Sheet

Esta aba é quase idêntica a aba Properties encontrada em Folders e outros objetos. Aqui, você pode criar as propriedades de seu objeto News Item. Crie três propriedades novas dessa forma:

content

Este tipo de propriedade deveria ser texto. Cada News Item criada recentemente conterá sua própria propriedade de conteúdo único.

author

Este tipo de propriedade deveria ser string. Essa conterá o nome do autor das notícias.

date

Este tipo de propriedade deveria ser data. Ela conterá a hora e a data em que a notícia foi atualizada pela última vez. A propriedade date requer um valor, por enquanto você pode entrar com a string "01/01/2000".

É isso aí! Agora você criou uma Property Sheet que descreve suas News Items e que tipo de informação elas contém. Propriedades podem ser pensadas como os dados que um objeto contém. Agora que nós temos os dados todos setados, você precisa criar uma interface para seu novo tipo de objeto. Isto é feito criando novas Views (abas) para seu objeto.

Clique na aba Views. Esta levará você para a aba Views, como mostra a Figura 9.9.

9-9.png
Figura 9.9 - A aba Views

Aqui, você pode ver que o Zope criou três abas default para você. Essas abas serão descritas com muito mais detalhe no Capítulo 14, "Estendendo o Zope", mas por enquanto, basta dizer que elas definem as abas que seus objetos terão eventualmente.

Para criar uma nova aba, use o formulário inferior da aba Views. Crie uma nova Aba com o nome "News" e selecione "propertysheets/News/manage" da caixa de seleção e clique Add. Isto criará uma nova Aba nessa tela depois das três Abas originais, como mostra a Figura 9.10.

9-10.png
Figura 9.10 - A nova aba News

Já que essa aba vai dar-nos a habilidade para editar a News Item, nós queremos que ela seja a primeira aba que você vê quando seleciona o objeto News Item. Para mudar a ordem das abas, selecione a aba News criada recentemente e clique no botão First. Isto deveria mover a nova aba do fundo para o início da lista.

O passo final na criação de uma ZClass é definir os métodos para a classe. Métodos são definidos na aba Methods. Clique na aba Methods e você será levado para a aba Methods. Selecione DTML Method da lista de adição e acrescente um novo DTML Method com o id "index_html". Essa será a aba default de sua notícia. Acrescente o seguinte DTML no novo método:

      <dtml-var standard_html_header>

<h1>News Flash</h1>




<p><dtml-var date> </p>




<p><dtml-var author></p>




<P><dtml-var content></p>




<dtml-var standard_html_footer>


É isso aí! Você criou seu próprio tipo de objeto chamado News Item. Quando você for para a pasta root, você verá agora uma nova entrada em sua lista de adição.

Mas não acrescente quaisquer News Items ainda, porque o segundo passo desse exercício é criar um Catalog que catalogará suas novas News Items. Vá para o folder raiz e crie um catálogo novo com o id Catalog.

Como os dois exemplos anteriores de uso de um ZCatalog, você precisa criar Indexes (Índices) e uma Table Meta-Data (Tabela Meta-Dados) que fazem sentido para seus objetos. Primeiro, apague os índices default no novo ZCatalog e crie os seguintes índices para substituí-los:

content

Este deveria ser um TextIndex. Ele indexará o conteúdo de suas News Items.

title

Este deveria ser um TextIndex. Ele indexará o título de suas News Items.

author

Este deveria ser um FieldIndex. Ele indexará o autor da News Item.

date

Esta deveria ser um FieldIndex. Este indexará a data da News Item.

Depois de criar esses Índices, apague as colunas Meta-Dados default e acrescente essas colunas para substituí-las:

  • author
  • date
  • title
  • absolute_url

Depois de criar os Índices e colunas de Table Meta-Data, crie uma interface de pesquisa para o Catalog usando a ferramenta Z Search Interface descrita previamente no capítulo.

Agora você está pronto para seguir. Comece acrescentando novos News Items para seu Zope. Vá em qualquer lugar no Zope e selecione News Item da lista de adição. Isto levará você para o Formulário de adição para itens News.

Dê ao seu novo News Item o id "KoalaGivesBirth" e clique Add. Isto criará um novo News Item. Selecione-o.

Note como ele tem quatro abas que ligam as quatro abas que estavam na ZClass. A primeira aba é News, esta aba corresponde à Property Sheet News que você criou na ZClass News Item.

Entre com suas notícias na caixa contents:

  Today, Bob the Koala bear gave birth to little baby Jimbo.

Entre com seu nome na caixa Author, e a data de hoje na caixa Date.

Clique Change e sua News Item deveria agora conter alguma notícia. Porque o objeto News Item é CatalogAware, ele é automaticamente catalogado quando é modificado ou acrescentado. Verifique isto ao olhar para a aba Cataloged Objects do ZCatalog que você criou para esse exemplo.

O News Item que você acrescentou é o único objeto que está catalogado. Quando você acrescenta mais News Items ao seu site, eles serão automaticamente catalogados aqui. Acrescente um pouco mais de itens, e então experimente pesquisar o ZCatalog. Por exemplo, se você procurar por "Koala" você deveria obter como resultado o News Item KoalaGivesBirth.

Nesse ponto você pode querer usar alguns dos formulários de pesquisa mais avançados que você criou anteriormente no capítulo. Você pode ver, por exemplo, que quando você acrescenta novos News Items com novos autores, a lista de seleção de autores no formulário de pesquisa muda para incluir a nova informação.

Conclusão

As características de catalogação do ZCatalog permitem-lhe procurar seus objetos por certos atributos muito rapidamente. Isto pode ser muito útil para sites com muito conteúdo que muitas pessoas precisam para serem capazes de pesquisar de uma maneira eficiente.

Pesquisa no ZCatalog funciona como pesquisa em um banco de dados relacional, a não ser pelo fato da pesquisa ser mais orientada a objeto. Nem todos os modelos de dados são orientados a objeto contudo, assim em alguns casos você pode querer usar o ZCatalog, mas em outros casos você pode querer usar um banco de dados relacional. O próximo capítulo vai dar mais detalhes sobre como o Zope trabalha com bancos de dados relacionais, e como você pode usar dados relacionais como objetos no Zope.

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








Mais »