dropdown field: use standard Zope3 source/vocabulary mechnaism is corresponding adapters are available

This commit is contained in:
Helmut Merz 2011-11-09 10:51:52 +01:00
parent 18400049b3
commit fa569284c3
2 changed files with 21 additions and 2 deletions

View file

@ -23,6 +23,7 @@
<metal:fields define-macro="fields">
<tal:define define="manageMode manageMode|view/manageMode|nothing;
fields view/fields;
instance view/instance;
data view/data;
state view/formState">
<table style="width: 100%">
@ -160,7 +161,8 @@
tal:attributes="name name;
style python:
'width: %s' % (width and str(width)+'px' or '');">
<option tal:repeat="item field/getVocabularyItems"
<option tal:repeat="item python:
field.getVocabularyItems(instance.context, request)"
tal:content="item/title"
tal:attributes="value item/token;
selected python:

View file

@ -25,12 +25,14 @@ $Id$
from datetime import datetime
from logging import getLogger
from time import strptime, strftime
from zope.app.form.browser.interfaces import ITerms
from zope.interface import implements
from zope.cachedescriptors.property import Lazy
from zope.component import adapts
from zope import component
from zope.i18n.format import DateTimeParseError
from zope.i18n.locales import locales
from zope.schema.interfaces import IVocabularyFactory
from zope.tales.engine import Engine
from zope.tales.tales import Context
@ -129,14 +131,29 @@ class Field(Component):
def getTitleValue(self):
return self.title or self.name
def getVocabularyItems(self):
def getVocabularyItems(self, context=None, request=None):
voc = (self.vocabulary or '')
if isinstance(voc, basestring):
terms = self.getVocabularyTerms(voc, context, request)
if terms is not None:
return terms
voc = voc.splitlines()
return [dict(token=t, title=t) for t in voc if t.strip()]
else:
return [dict(token=t.token, title=t.title or t.value) for t in voc]
def getVocabularyTerms(self, name, context, request):
if context is None or request is None:
return None
source = component.queryUtility(IVocabularyFactory, name=name)
if source is not None:
source = source(context)
terms = component.queryMultiAdapter((source, request), ITerms)
if terms is not None:
termsList = [terms.getTerm(value) for value in source]
return [dict(token=t.token, title=t.title) for t in termsList]
return None
def getFieldTypeInfo(self):
return self.fieldTypeInfo or fieldTypes.getTerm(self.fieldType)