Tutorial - Criando um produto para Plone usando Archetypes
Este tutorial irá lhe ensinar como criar novos tipos de conteúdo para o Plone seguindo o exemplo de uma locadora de veículos.
Analisando o módulo Cliente.py
Cliente.py
A classe cliente, por ser um tipo simples, é subclasse da classe BaseContent. Com isto ela herda todas as definições desta classe.
Primeiro precisamos definir nosso schema. Nós copiamos o schema da classe BaseContent que é a BaseSchema. Fazer uma cópia é importante, pois sem isto, se nós alterarmos o schema, estaremos modificando o schema de todos os tipos que utilizam o mesmo schema. Depois do schema definido iremos criar a classe cliente com os seus método próprios.
O Plone 2.1+, por default, oculta o id(nome curto) dos tipos. Para que o id seja gerado com base no título a única coisa que devemos fazer é definir a propriedade _at_rename_after_creation como True.
#Importa class responsável por conter informações de segurança
#Um objeto ClassSecurityInfo deve ser instanciado dentro de cada
#classe que irá interagir com o framework de segurança do Zope.
from AccessControl import ClassSecurityInfo
#Importa todas as definições pública do archetypes
#Exemplo: BaseContent, BaseFolder, BaseSchema, registerType
from Products.Archetypes.atapi import *
#Importa todas as configurações do produto
from Products.LocadoraVeiculos.config import *
# Importa validadores
from Products.LocadoraVeiculos.validators import *
#Definindo schema
schema = Schema((
StringField(
name='title',
widget=StringWidget(
label="Nome",
label_msgid='LocadoraVeiculos_label_title',
i18n_domain='LocadoraVeiculos',
),
use_portal_factory="True"
),
StringField(
name='CPF',
widget=StringWidget(
label='Cpf',
label_msgid='LocadoraVeiculos_label_CPF',
i18n_domain='LocadoraVeiculos',
),
required=True,
validators=('isCPF',)
),
StringField(
name='contato',
widget=StringWidget(
label='Contato',
label_msgid='LocadoraVeiculos_label_contato',
i18n_domain='LocadoraVeiculos',
) ),
TextField(
name='endereco',
widget=TextAreaWidget(
cols="50",
rows="4",
label="Endereço",
label_msgid='LocadoraVeiculos_label_endereco',
i18n_domain='LocadoraVeiculos',
)),
),)
# Definição do schema da class clients
# BaseSchema é um schema padrão definido pelo archetypes
# que possui os campos id e #title
# O motivo pelo qual fazemos uma cópia do BaseSchema
# é para que nos permita alterar a cópia sem alterar,
# por exemplo, mudar o label do campo title para nome #
# sem alterar para todos os tipos do portal.
# Cliente_schema[‘title’].widget.label = ‘Nome do cliente’
Cliente_schema = BaseSchema.copy() + schema.copy()
class Cliente(BaseContent):
#intância da ClassSecurityInfo responsável por guardar
#informações de segurança da classe
security = ClassSecurityInfo()
#Define quais interfaces a classe cliente implementa
__implements__ = (getattr(BaseContent,'__implements__',()),)
# Este nome aparece na caixa de adicionar itens
archetype_name = 'cliente'
meta_type = portal_type = 'Cliente'
# Define se o tipo será listado na caixa de adicionar tipos
# Um cliente só poderar se instanciado dentro de uma
# instância da classe locadora
global_allow = 0
# Define se o usuário pode ou não adicionar comentário ao
# cliente
allow_discussion = False
# PageTemplate que será chamado logo após a criação do
# cliente
immediate_view = 'base_view'
# Descrição da classe cliente
typeDescription = "cliente"
# Id da descrição da classe que é usado para tradução (i18n)
typeDescMsgId = 'description_edit_cliente'
# Exemplo de méto público. Pode ser acessado por todos.
security.declarePublic(‘metodoPublico’)
def metodoPubico(self):
pass
# Exemplo de método privado. Pode ser acessado somente pela
# classe
security.declarePrivate(‘metodoPrivado’)
def metodoPrivado(self):
pass
# Exemplo de método protegido. Pode ser acessado por qualquer
# um que possua a permissão View
security.declareProtected(‘View’,’metodoProtegido’)
def metodoProtegido(self):
pass
# Este atributo, for verdadeiro, faz com que o Zope gere o
# id(nome curso do cliente a partir do título(nome)
_at_rename_after_creation = True
schema = Cliente_schema
# registerType é um método especial global que registra e aplica
# as declarações de segurança para a classe, recuperando as
# informações do objeto ClassSecurityInfo contido
# pela classe cliente.
# Registrar o tipo com Archetypes
registerType(Cliente,PROJECTNAME)