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 módulo Carro.py
Aqui veremos como utilizar o ATVocabularyManager.
A classe carro também é subclasse da classe BaseContent. Ele proticamente estende a classe BaseContent com novos campos.
Neste módulo quero destacar a utilização do ATVocabularyManager.
Quando criamos um campo podemos definir o seu domínio utilizando vocabulários. Um exemplo disto pode ser observado no schema da classe carro. O campo cor só poderá receber os valores vermelho, amarelo e azul.
Observe que o campo cor é do tipo string e seu widget foi alterado para SelectionWidget. Este widget renderiza uma lista de opções com base no que está definido em vocabulary. Este recurso é muito legal, mas quando nos deparamos com vocabulários dinâmicos temos alguns problemas de manutenção.
ATVocabularyManager é uma portal tool para o gerenciamento de vocabulários de forma dinâmica. É um produto baseado em Archetypes para ser usado dentro dos campos.
Para usar o vocabulário gerenciado basta adicionar o termo
vocabulary = NamedVocabulary("myvocabulary") para os campos de seu schema, importar NamerVocabulary do produto e criar seu vocabulário na portal_vocabularies tool (disponível através da Configuração do Plone).Você pode criar o vocabulário quando o produto é instalado no site. Veremos como fazer isto mais adiante.
O schema da classe carro é o seguinte:
#Importando NamedVocabulary
from Products.ATVocabularyManager.namedvocabulary \
import NamedVocabulary
schema = Schema((
IntegerField(
name='ano',
widget=IntegerWidget(
label='Ano',
label_msgid='LocadoraVeiculos_label_ano',
i18n_domain='LocadoraVeiculos',
),
required=1
),
IntegerField(
name='codigo',
widget=IntegerWidget(
label='Codigo',
label_msgid='LocadoraVeiculos_label_codigo',
i18n_domain='LocadoraVeiculos',
),
required=1
),
StringField(
name='modelo',
widget=StringWidget(
label='Modelo',
label_msgid='LocadoraVeiculos_label_modelo',
i18n_domain='LocadoraVeiculos',
),
required=1
),
IntegerField(
name='quilometragem',
widget=IntegerWidget(
label='Quilometragem',
label_msgid='LocadoraVeiculos_label_quilometragem',
i18n_domain='LocadoraVeiculos',
)
),
StringField(
name='tipo',
widget=SelectionWidget(
label='Tipo',
label_msgid='LocadoraVeiculos_label_tipo',
i18n_domain='LocadoraVeiculos',
),
enforceVocabulary=1,
vocabulary=NamedVocabulary("""tipos_de_carros""")
),
FloatField(
name='valorDiaria',
widget=DecimalWidget(
label='Valordiaria',
label_msgid='LocadoraVeiculos_label_valorDiaria',
i18n_domain='LocadoraVeiculos',
)
),
BooleanField(
name='disponibilidade',
default="True",
widget=BooleanWidget(
visible={'edit':'hidden', 'view':'visible'},
label='Disponibilidade',
label_msgid='LocadoraVeiculos_label_disponibilidade',
i18n_domain='LocadoraVeiculos',
)
),
StringField(
name='cor',
widget=SelectionWidget(
label='Cor',
label_msgid='LocadoraVeiculos_label_cor',
i18n_domain='LocadoraVeiculos',
),
enforceVocabulary=1,
vocabulary=('Red','Blue','Yellow')
),
),
)