Home > plone, python > plone – come creare una browser view e vivere felici senza “restricted python”

plone – come creare una browser view e vivere felici senza “restricted python”

November 18, 2010

Occorrente:
– un file di configurazione zcml
– un file contenente una classe python

In un normale pacchetto plone abbiamo già un configure.zcml che può fare al caso nostro. Apriamolo e aggiungiamo la registrazione della vista:

<configure
 xmlns="http://namespaces.zope.org/zope"
 xmlns:browser="http://namespaces.zope.org/browser"
 i18n_domain="my.package">
[...]

<browser:page
    name="myview"
    for="Products.CMFPlone.interfaces.IPloneSiteRoot"
    class=".browser.MyView"
    permission="cmf.ManagePortal"
 />

[...]
</configure>

NOTE

– è indispensabile che l’header della configurazione includa il namespace “browser”

– la vista sarà disponibile solo nella root del sito visto che l’abbiamo registrata per IPloneSiteRoot (per renderla accessibile ovunque è sufficiente utilizzare ‘for=”*”‘)

– per accedervi si dovrà avere il permesso “Manage portal”

Ora passiamo alla definizione della classe. Creaimo un file browser.py e aggiungiamo quanto segue:

from Products.Five import BrowserView

class MyView(BrowserView):
    """ my browser view
    """
    def __call__(self):
        return 'pippo'

Una volta restartata l’istanza potremo richiamare la nostra vista tramite http://myplone.com/@@myview che in questo caso restituirà “pippo”.

Se invece volessimo usarla per presentare dei contenuti dovremmo assegnargli un template:

<configure
 xmlns="http://namespaces.zope.org/zope"
 xmlns:browser="http://namespaces.zope.org/browser"
 i18n_domain="my.package">
[...]

<browser:page
    name="myview"
    for="Products.CMFPlone.interfaces.IPloneSiteRoot"
    class=".browser.MyView"
    template="myviewtemplate.pt"
    permission="cmf.ManagePortal"
 />

[...]
</configure>

e modificare la classe in maniera che al __call__ non venga restituito “pippo”:

from Products.Five import BrowserView

class MyView(BrowserView):
    """ my browser view
    """
    def getPippo(self):
        return 'pippo'

Nel template dovremo avere qualcosa del genere:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
 xmlns:tal="http://xml.zope.org/namespaces/tal"
 xmlns:metal="http://xml.zope.org/namespaces/metal"
 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
 lang="en"
 metal:use-macro="context/main_template/macros/master"
 i18n:domain="my.package">
<body>

<tal:fill metal:fill-slot="main">
 <div id="myview-wrapper">
     <h3>
        questo è il valore di pippo: <span tal:content="view/getPippo" />
     </h3>
 </div>
</tal:fill>

Tutti gli attributi della vista sono accessibili tramite “view/nomeAttr”.
Ricordiamo che pythonicamante parlando un metodo/funzione è un attributo 😉

TIP: Tutto ciò è molto più veloce da creare usando paster: “bin/paster addcontent view”

Per maggiori delucidazione consultate http://collective-docs.plone.org/views/index.html

Se non trovate quello che cercate… cercate su google!!! 😛

Advertisements
Categories: plone, python
  1. Giacomo
    November 23, 2010 at 8:56 am

    Wow!!!!!!
    finalmente ho visto la luce: complimenti per il sintetico e illuminante post. Adesso non temo più quella parola strana “viewlet” (questa ex sconosciuta).

  2. Diego
    November 23, 2010 at 9:42 am

    Concordo con Giacomo, articolo interessante.

  1. August 5, 2012 at 5:20 pm
Comments are closed.
%d bloggers like this: