5 minuti di Vocabulary

Come creare un vocabolario di termini con Plone, utilizzarlo all'interno del proprio sito e come riutilizzare quelli già definiti in plone.app.vocabularies

Un vocabolario di termini è sempre una cosa utile da riutilizzare più volte all'interno delle nostre personalizzazioni Plone.

Il caso d'uso più semplice è quello di avere una serie di opzioni possibili da usare in un combobox all'interno di una form ma non solo: un vocabolario può essere utile ovunque ci serva un insieme finito di termini estratti secondo una logica prestabilita.

Il modo più semplice di creare un vocabolario è il seguente:

from zope.schema.vocabulary import SimpleVocabulary
...
vocabulary = SimpleVocabulary(
         [SimpleVocabulary.createTerm('', None, u'Nessun valore'),
          SimpleVocabulary.createTerm('si', True, u'Si'),
          SimpleVocabulary.createTerm('no', False, u'No')])

Ogni elemento del vocabolario è definito da tre elementi:

  • title: solitamente una stringa di testo che corrisponde al titolo dell'elemento facilmente comprensibile da un umano e traducibile in altre lingue. Per esempio: 'Nessun Valore', 'Si', 'No'
  • value: il valore effettivo dell'elemento, es: None, True, False
  • token: la 'rappresentazione semplificata' dell'oggetto solitamente una stringa di testo utilizzata come valore degli elementi delle form

Potremmo già utilizzare il nostro vocabolario all'interno di una form nel modo seguente:

schema.Choice(title=u"Nome del campo",
          source=vocabulary)

Ma perché rinunciare alle gioie della ZCA?

In Zope è possibile registrare ogni vocabolario come un utility ed assegnarle un nome in modo che sia facilmente interrogabile da qualsiasi posto in cui ci troviamo.

In questo modo possiamo registrare un componente dalla logica articolata per differenziare il nostro vocabolario in base al contesto in cui ci troviamo o ancora possiamo sfruttare i meccanismi dei componenti di Zope per sovrascrivere il comportamento del vocabolario.

In ultima istanza non dovremo ricordarci il punto preciso dove l'abbiamo creato per poterlo importare ma dovremmo solamente ricordarne il nome. Per registrare quindi il vocabolario possiamo utilizzare un metodo come questo:

from zope.interface import implements
from zope.schema.interfaces import IVocabularyFactory
from zope.schema.vocabulary import SimpleVocabulary
...
class MyVocabulary(object):
implements(IVocabularyFactory)
def __call__(self, context):
"""Qui possiamo mettere tutta la logica che vogliamo
"""
return SimpleVocabulary(...)
...

e la relativa registrazione in zcml:

<utility
provides="zope.schema.interfaces.IVocabularyFactory"
factory="...MyVocabulary"
name="nome.del.vocabulary" />

a questo punto possiamo 'ripescare' il vocabolario con il comando

getUtility(IVocabularyFactory, name="nome.del.vocabulary")

ed utilizzarlo nelle nostre form in questo modo

schema.Choice(title=u"Nome del Campo",
vocabulary="nome.del.vocabulary")

Ma non è finita qui: c'è qualcuno che ha pensato a noi ed ha fornito plone di un buon numero di utilissimi vocabolari. Curiosando tra i vari egg che compongono Plone troviamo plone.app.vocabularies dove vengono registrati appunto dei vocabolari di uso comune, ecco i nomi di quelli disponibili:

    • plone.app.vocabularies.AvailableContentLanguages, la lista delle lingue disponibili
    • plone.app.vocabularies.SupportedContentLanguages, la lista delle lingue supportate
    • plone.app.vocabularies.Roles, la lista dei ruoli utente
    • plone.app.vocabularies.Groups, la lista dei gruppi del portale
    • plone.app.vocabularies.PortalTypes, la lista dei content type installati in portal_types
    • plone.app.vocabularies.ReallyUserFriendlyTypes, la lista dei content type tradotti affinché siano più comprensibili all'utente
    • plone.app.vocabularies.Skins, la lista degli skins disponibili
    • plone.app.vocabularies.Workflows, la lista dei workflow
    • plone.app.vocabularies.WorkflowStates, la lista di tutti gli stati di workflow di tutti i workflow
    • plone.app.vocabularies.WorkflowTransitions, la lista di tutte le transizioni di tutti i workflow
    • plone.app.vocabularies.AvailableEditors, la lista degli editor di testo disponibili
    • plone.app.vocabularies.Keywords, la lista delle tag (parole chiave) del sito

    Per ulteriori informazioni:

    Share this on

    Share |

    On same topics

    Commenti

    comments powered by Disqus