Question

I have a python-script, which returns returns a context-based, dynamically generated simple list:

def myVocabMethod(self):
    mylist = ['a','list','apart']
    # do sth dynamic

    return mylist

I would like to pass the result to the selection-field with the vocabulary-attribute looking s.th. like this:

atapi.StringField('theField'
    vocabulary=.myPythonScript.myVocabMethod(),
    (...)
),

How to glue the script-results and and the vocab-value together?

The documentation I found, always requires Grok. Also it's just a simple list, no i18n or other more complex features needed.

Was it helpful?

Solution

Grokless way to register a named vocabulary:

http://developer.plone.org/forms/vocabularies.html#registering-a-named-vocabulary-provider-in-zcml

Basically you point it to a function which returns SimpleVocabulary instance.

OTHER TIPS

The post, where I found what I was looking for is this one: http://www.universalwebservices.net/web-programming-resources/zope-plone/dynamic-vocabularies-in-plone-archetypes/

And is referenced in the official docs here: http://developer.plone.org/content/archetypes/fields.html#dynamic-vocabularies

For anyone who might be interested, this is the code:

from Acquisition import aq_parent
from Products.Archetypes import atapi
from Products.Archetypes.public import DisplayList

YourArchetypeSchema = schemata.ATContentTypeSchema.copy() + atapi.Schema((

atapi.StringField(
    'somefieldname',
    vocabulary = yourVocabulary,
    ),

))

class YourArchetype(base.ATCTContent):

    def yourVocabulary(self):
        dl = DisplayList()
        # We can do something context-based here, 
        # f.e. get all Events in parent-folder:
        eventlist = aq_parent(self).contentValues(filter={'portal_type' : 'Event'})
        for event in eventlist:
            dl.add(event['id'], event['title'])
        return dl

atapi.registerType(YourArchetype, PROJECTNAME)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top