Ferramentas Pessoais
Você está aqui: Página Inicial Artigos Salvando o mundo com properties no Plone

Salvando o mundo com properties no Plone

Você já se deparou com situações inusitadas onde o cliente precisa de um campinho extra em algum tipo específico do Plone? você utiliza o campo "location" mas o usuário precisa de mais um campo? relaxe seus problemas acabaram!!!

O que vamos fazer? O que iremos fazer?

Vamos solucionar o nosso problema com properties do Plone, com elas você pode criar campos de diversos tipos, e agrega-las aos objetos do Plone.

O que vamos fazer? Como eu vejo as properties de um objeto?

Para visualizar as properties de um objeto é muito simples, basta acessar a URL do objeto normalmente e no final da URL digite /manage_propertiesForm, lembre-se de estar logado e com permissão de edição de conteúdo, você verá algo como:
 
Propriedades de um Objeto
No campo Name você colocará o nome da sua propriedade, por exemplo "telefone", no campo Type você deverá escolher o tipo de dados que será armazenado, dentre as opções temos:
  •       boolean - Que armazena valores True ou False, exemplo de campo: Sexo
  •       date - Data, armazena um tipo DateTime, que facilita o uso de datas.
  •       float -  Armazena números mais complexos e quebrados
  •       int - Armazena números simples e inteiros
  •       lines - Forma uma lista, sendo um valor por linha
  •       long - deve ser parecido com o float, porém mais rosbusto, não sei ao certo
  •       string - Tipo mais usado, armazena textos simples
  •       text - Armazena textos maiores
  •       tokens - Nunca utilizei
  •       selection - Nunca utilizei mas deve gerar uma lista de seleção para um campo do tipo select
  •       multiple selection - Nunca utilizei mas deve gerar uma lista de seleção para um campo do tipo mult-select
 No campo Value, você adiciona o valor que deseja.
 
Vamos para nosso exemplo de telefone, adicione as seguintes informações:
 
Propriedades Adicionando String
Ok, agora tempos uma propriedade chamada "telefone" do tipo "String" com o valor "61-9999-5555", mas e agora como podemos acessar essa informação em um template por exemplo e ter uma visão completa desta informação?
 

applications-engineering.png Mãos a obra!

Primeiro passo, vamos criar um script python que acessa e regata a property que eu quero, podemos chama-lo de py_get_property:

## Script (Python) "py_get_property"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=prop, ctx=False
##title=Retorna a propriedade "passada no parametro prop"
##
if not ctx:
    ctx = context

if ctx.hasProperty(prop):
    return ctx.getProperty(prop)
else:
    return False
 
Para testarmos precisaremos de um template, para isso crie um "Page Template" chamado telefone_view com o seguinte conteúdo:
 
Adicionando um page Template
O código do template pode ser algo como:
<html>
  <head>
    <title tal:content="template/title">The title</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
  </head>
  <body>
    
    <h2 tal:content="context/Title"></h2>
    <h5 tal:define="telefone python:context.py_get_property('telefone', ctx=context)"
        tal:condition="telefone" 
        tal:content="telefone"></h5>
  </body>
</html>
O resultado será algo como:
 
Propriedades String Telefone
 
E assim você obterá o telefone, agora você deve estar se pergutando, beleza mas, como eu pesquiso no catálogo por objetos que possuam o telefone "x"? Boa pergunta!!
 

applications-engineering.png Mãos a obra 2!

O primeiro passo é criar um script python chamado py_get_telefone este script irá acessar a property do telefone, ele é bem simples conforme o código abaixo:
## Script (Python) "py_get_telefone"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
return context.py_get_property('telefone', ctx=context)
Após a criação se você chamar o script python diretamente na URL do seu objeto, teremos o seguinte resultado:
 
Script get_telefone

 Potal Catalog

O segundo passo é criar um novo índice, para isso acesse a ZMI e vá em portal_catalog, depois clique na aba index:
 
Catalog Index
Na combobox ao lado direito da tela, selecione o tipo de indíce chamado "FieldIndex":
 
 Add FieldIndex
 
Agora criaremos o novo índice, com os seguintes valores:
 
 New index Attr
 Agora precisamos reindexar este novo indice para que ele varre os objetos do portal e atualize as informações:
 
Reindex Indice
Ao clicar em cima do novo índice, em seguida na aba "browser", veremos as informações indexadas:
 
Browser Index
 
Como nosso script retorna "False" quando não obtém um telefone, a lista maior fica com o False, e como somente um objeto foi adicionado a informações de telefone, temos um valor com o telefone:
 
Indice Telefone True
 
Agora vamos criar um Script Python que pesquisa por determinado telefone:
## Script (Python) "py_busca_telefone"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
items = context.portal_catalog(telefone='61-9999-5555')

for item in items:
    print 'Title: ' + item.Title

    telefone = context.portal_catalog.getIndexDataForRID(item.getRID())['telefone']

    if telefone:
        print 'Telefone: ' + telefone

return printed

Agora, queremos todos que não possuem telefone:

## Script (Python) "py_busca_telefone"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
items = context.portal_catalog(telefone=False)

for item in items:
    print 'Title: ' + item.Title

    telefone = context.portal_catalog.getIndexDataForRID(item.getRID())['telefone']

    if telefone:
        print 'Telefone: ' + telefone

return printed

Legal não? Espero poder te ajudado!!! :) até a próxima!

 

Ações do documento
Dezembro 2019 »
Dezembro
SeTeQuQuSeSaDo
1
2345678
9101112131415
16171819202122
23242526272829
3031

Python Logo

       Zope Logo

 

      Novo Logo do Plone