"Pochi semplici passi" per aggiungere un menu nella edit bar di Plone

Aggiungere un menu all'interno della editbar di Plone potrebbe essere complesso se non si conoscono alcuni dettagli dell'implementazione... ma una volta scoperto il meccanismo tutto funziona perfettamente

Voglio aggiungere un elemento all'interno della edit bar di Plone dove gli editor del portale hanno a disposizione i vari menu per l'aggiunta di nuovi contenuti, cambiare la vista al contenuto ecc.

Perdere l'orientamento tra i vari componenti che compogono la edit bar di Plone è piuttosto facile ma alla fine, una volta compreso il significato e l'utilizzo dei differenti elementi, si scopre che il sistema funziona ed è altamente configurabile.

Definire un contenitore

Il primo passo consiste nella definizione di un adapter che permetta di inserire un nuovo elemento all'interno della edit bar e che conterrà successivamente il nostro menu:

<adapter for="* *"
name="my.contentmenu.custom"
factory=".custommenu.CustomSubMenuItem"
provides="plone.app.contentmenu.interfaces.IContentMenuItem" />

Una volta aggiunto l'adapter in zcml possiamo sviluppare la classe associata:

from zope.interface import implements
# BBB Zope 2.12
try:
from zope.browsermenu.interfaces import IBrowserSubMenuItem
from zope.browsermenu.menu import BrowserSubMenuItem
except ImportError:
from zope.app.publisher.interfaces.browser import IBrowserSubMenuItem
from zope.app.publisher.browser.menu import BrowserSubMenuItem


class ICustomSubMenuItem(IBrowserSubMenuItem):
"""Marker interface per il mio menu
"""

class CustomSubMenuItem(BrowserSubMenuItem):
"""Elemento contenitore di menu che si inserira' nella edit bar
"""
implements(ICustomSubMenuItem)

submenuId = 'custom_contentmenu'
order = 5
title = u'Custom menu'
description = u'Descrizione del mio menu'

@property
def extra(self):
return {'id': 'custommenu-id-attribute'}

@property
def action(self):
return '%s/action_url' % self.context.absolute_url()

def available(self):
return True

def selected(self):
return False

Gli attributi da personalizzare in questa classe sono i seguenti:

  • il titolo e la descrizione dell'elemento della edit bar
  • il peso (order) che permette di gestire la posizione del nostro elemento tra gli altri
  • action, che permette di specificare un'azione affinché l'elemento possa funzionare anche senza javascript attivato
  • submenuId che permette di associare un particolare menu al nostro elemento

A questo punto Plone stesso si occuperà di cercare un menu secondo quanto impostato in submenuId; nel nostro caso specifico custom_contentmenu

Creare il menu

Una volta impostato un contenitore per il nostro menu possiamo definire il vero e proprio menu. In zcml abbiamo una definizione apposita, browser:menu:

<browser:menu
id="custom_contentmenu"
class="custommenu.CustomMenu"
title="Un menu Custom per la edit bar"
/>

e come ultima cosa definiamo la classe relativa al menu:

from zope.interface import implements
# BBB Zope 2.12
try:
from zope.browsermenu.interfaces import IBrowserMenu
from zope.browsermenu.menu import BrowserMenu
except ImportError:
from zope.app.publisher.interfaces.browser import IBrowserMenu
from zope.app.publisher.browser.menu import BrowserMenu


class ICustomMenu(IBrowserMenu):
"""Menu che restituisce una serie di elementi per...
"""

class CustomMenu(BrowserMenu):
implements(ICustomMenu)

def getMenuItems(self, context, request):
"""Return menu item entries in a TAL-friendly form.
"""
return [{
'title': u'Custom menu Item',
'description': u"Descrizione dell'elemento del menu",
'action': "custommenu-action-url",
'selected': False,
'icon': None,
'extra': {
'id': 'custom-menu-item',
'separator': 'actionSeparator',
'class': ''},
'submenu': None,
},
...
]

Il metodo più importante di questa classe è getMenuItems che deve restituire una lista di dizionari i cui elementi corrispondono agli elmenti del menu.

Altre informazioni

Share this on

Share |

On same topics

Commenti

comments powered by Disqus