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"> | <metal:fields define-macro="fields"> | ||||||
|   <tal:define define="manageMode manageMode|view/manageMode|nothing; |   <tal:define define="manageMode manageMode|view/manageMode|nothing; | ||||||
|                       fields view/fields; |                       fields view/fields; | ||||||
|  |                       instance view/instance; | ||||||
|                       data view/data; |                       data view/data; | ||||||
|                       state view/formState"> |                       state view/formState"> | ||||||
|     <table style="width: 100%"> |     <table style="width: 100%"> | ||||||
|  | @ -160,7 +161,8 @@ | ||||||
|            tal:attributes="name name; |            tal:attributes="name name; | ||||||
|                            style python: |                            style python: | ||||||
|                                 'width: %s' % (width and str(width)+'px' or '');"> |                                 '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:content="item/title" | ||||||
|               tal:attributes="value item/token; |               tal:attributes="value item/token; | ||||||
|                               selected python: |                               selected python: | ||||||
|  |  | ||||||
|  | @ -25,12 +25,14 @@ $Id$ | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
| from time import strptime, strftime | from time import strptime, strftime | ||||||
|  | from zope.app.form.browser.interfaces import ITerms | ||||||
| from zope.interface import implements | from zope.interface import implements | ||||||
| from zope.cachedescriptors.property import Lazy | from zope.cachedescriptors.property import Lazy | ||||||
| from zope.component import adapts | from zope.component import adapts | ||||||
| from zope import component | from zope import component | ||||||
| from zope.i18n.format import DateTimeParseError | from zope.i18n.format import DateTimeParseError | ||||||
| from zope.i18n.locales import locales | from zope.i18n.locales import locales | ||||||
|  | from zope.schema.interfaces import IVocabularyFactory | ||||||
| from zope.tales.engine import Engine | from zope.tales.engine import Engine | ||||||
| from zope.tales.tales import Context | from zope.tales.tales import Context | ||||||
| 
 | 
 | ||||||
|  | @ -129,14 +131,29 @@ class Field(Component): | ||||||
|     def getTitleValue(self): |     def getTitleValue(self): | ||||||
|         return self.title or self.name |         return self.title or self.name | ||||||
| 
 | 
 | ||||||
|     def getVocabularyItems(self): |     def getVocabularyItems(self, context=None, request=None): | ||||||
|         voc = (self.vocabulary or '') |         voc = (self.vocabulary or '') | ||||||
|         if isinstance(voc, basestring): |         if isinstance(voc, basestring): | ||||||
|  |             terms = self.getVocabularyTerms(voc, context, request) | ||||||
|  |             if terms is not None: | ||||||
|  |                 return terms | ||||||
|             voc = voc.splitlines() |             voc = voc.splitlines() | ||||||
|             return [dict(token=t, title=t) for t in voc if t.strip()] |             return [dict(token=t, title=t) for t in voc if t.strip()] | ||||||
|         else: |         else: | ||||||
|             return [dict(token=t.token, title=t.title or t.value) for t in voc] |             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): |     def getFieldTypeInfo(self): | ||||||
|         return self.fieldTypeInfo or fieldTypes.getTerm(self.fieldType) |         return self.fieldTypeInfo or fieldTypes.getTerm(self.fieldType) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue