Home > helpers, plone, python > Una vista per tutte

Una vista per tutte

October 3, 2010

in un progetto sul quale ho lavorato di recente c’erano parecchi pacchetti. Uno di questi definiva alcune proprietà dell’utente e un set di metodi per poter accedere a tali proprietà.

Si aveva l’esigenza di richiamare questi metodi da tutti gli altri pacchetti del progetto in maniera da duplicare il meno possibile il codice.

Allora ho pensato di definire proprio come fa plone (plone_portal_state, plone_context_state, ecc) una vista accessibile ovunque che mettesse a diposizione il suddetto set di metodi.

Definiamo la vista:

<browser:page
 name="myhelpers_view"
 for="*"
 class="views.HelpersView"
 permission="zope2.View"
 />

 

class HelpersView(BrowserView):
    """
    HelpersView browser view
    """

    def getFoo(self):
        foo = 'boo'
        return foo

    def doThis(self):
        #do this and that
        return True

    def getThat(self):
        return self.context.stuff

Potremo poi accedere a tali metodi da tutte le altre viste (ma anche portlets e altro) richiamando la nostra vista (che è un named multi-adapter) grazie a “getMultiAdapter”, proprio come si fa con plone_portal_state:

from zope.component import getMultiAdapter

class MyOtherView(BrowserView):

    [...]

    @property
    def my_helpers(self):
        return getMultiAdapter((self.context, self.request), name=u'myhelpers_view')

e potrò utilizzare i suoi metodi nel sequente modo:

def do_this(self):
    foo = self.my_helpers.getFoo()
    [...]

Analogamente, potró richiamarla nei template cosí:

<div tal:define="helpers context/@@my_helpers_view">
    <span tal:content="helpers/getThis" />
</div>
Categories: helpers, plone, python