dropdown field: use standard Zope3 source/vocabulary mechnaism is corresponding adapters are available
This commit is contained in:
parent
18400049b3
commit
fa569284c3
2 changed files with 21 additions and 2 deletions
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue