Strumenti personali
Tu sei qui: Portale Scopri Documentazione Aiuti Sovrascrivere i portlets in Plone 3.0
Azioni sul documento

Sovrascrivere i portlets in Plone 3.0

Questo aiuto si applica a: Qualsiasi versione.
Questo aiuto è destinato per: Qualsiasi destinatario.

Personalizzare i portlets è una task che ha a che fare con con Plone theme.

Scopo

Era piuttosto facile personalizzare uno dei portlet standard con le versioni precedenti di Plone 3.0: bastava copiare un modello di pagina appropriato al tema del portlet e fare quello che si voleva, cambiandolo con linguaggio XHTML. Si potrebbe anche creare un nuovo portlet allo stesso modo - basta creare un template per il nuovo portlet e registrare questo portlet con il tuo sito di proprietà.

In Plone 3.0 i portlets sono diventati leggermente più complessi,ma molto più potenti al tempo stesso! Il vantaggio è evidente adesso, giusto? ;)  Sono serviti da un pacchetto separato di python e hanno davvero una grande flessibilità di gestione. Quindi, vale la pena di provare questo nuovo meccanismo per rendersi conto di quanto è potente.

Prerequisiti

La prima cosa da menzionare è che non si tratta di una personalizzazione TTW (Through The Web). Se hai bisogno di un trucco veloce e sporco, dai un'occhiata allo strumento portal_view_customizations. Questo aiuto presuppone che desideri avere le modifiche in un modo ripetibile, in modo che tu possa avere le stesse modifiche su qualsiasi sito in cui hai installato il prodotto.

Un'altra cosa che potresti considerare è che non hai bisogno di questa tecnica nei casi in cui desideri personalizzare un portlet in Plone 3.0. Se hai appena personalizzato i portlets utilizzati nelle precedenti versioni di Plone o se vuoi continuare a utilizzare i portlets nel modo dell' "era 3.0"  (che noi sconsigliamo vivamente) dovresti dare un'occhiata a ClassicPortlet che viene dato con Plone 3.0.

E per ultimo, prima di continuare, se desideri personalizzare qualsiasi portlets standard rimuovendo tutta la logica di back-end  (realizzando un portlet statico), non farlo! E' meglio installare plone.portlet.static e giocare con esso, creando portlets statici quando ne hai bisogno.

Presumiamo che hai creato il tema MyTheme Plone 3 con DIYPloneStyle o ZopeSkel. Non stiamo qui a spiegare tutti gli aspetti della creazione di un tema di Plone 3.0.

Il concetto chiave nel lavoro con i portlet in Plone 3.0 è l'utilizzo di Zope 3 skin layer - lo stesso che usiamo quando sovrascriviamo una viewlet. Presumiamo che hai almeno il seguente numero minimo di file nella cartella MyTheme / browser:

- browser/
- __init__.py
- configure.zcml
- interfaces.py

Il processo di sovrasrittura dei portlets è il seguente:

  • Scegli il portlet che vuoi sovrascrivere;
  • Registra una skin layer se ancora non ne hai una in interfaces.py;
  • Aggiungi il comando speciale <plone:portletRenderer /> per MyTheme / browser / configure.zcml;
  • Definisci un attributo del Portlet per il comando <plone:portletRenderer />. Si tratta di un portlet fornitore di dati per i quali viene usata questo tipo di sovrascrittura. Questo può essere di classe o di interfaccia. Ad esempio plone.app.portlets.portlets.navigation.INewsPortlet;
  • Definisci un nuovo template di attributo per il comando <plone:portletRenderer />. Quando lo aggiungi verrà utilizzata l'impostazione predefinita del renderer per il portlet che stai sovrascrivendo, ma con il tuo template;
  • In caso di necessità di personalizzare il comportamento di default per il portlet, devi utilizzare l'attributo di classe, invece del semplice modello. Questa nuova classe agirà in qualità di renderer per il portlet, al posto di quella di default;
  • Definisci gli attributi layer per il comando <plone:portletRenderer /> con MyTheme browser layer. L'attributo layer del portletRenderer associa un particolare IPortletRenderer con un particolare browser layer (nel nostro caso MyTheme layer). Quando il nostro layer è in vigore (cioè MyTheme è installato) il nuovo renderer sarà usato al posto di quello predefinito;
  • Aggiungi un nuovo modello di MyTheme / browser che implementa il renderer;
  • Riavvia Zope e divertiti.

Step by step

1. Scegliere il portlet

Prima di tutto dobbiamo decidere quale portlet vorremmo personalizzare. Poi scegliere il Portlet News. Se dai un'occhiata al portlet news standard, vedrai news_icon images in-front of the titles. Sbarazzati di loro in XHTML solo per prova.

I portlets predefiniti di Plone sono dichiarati nel pacchetto plone.app.portlets.portlets. Il nucleo dei portlets di Plone 3.0  può essere trovato in $INSTANCE_HOME/lib/python/plone/app/portlets/portlets/. Potrebbe essere situato da qualche altra parte in $PYTHONPATH . A seconda dell'installazione di zope (Win32 o Unix come sistema operativo, l'installazione da sorgente, installer, o altro ...), potrebbe essere necessario utilizzare strumenti di ricerca disponibili nel tuo sistema operativo per individuare il pacchetto.

Il pacchetto plone.app.portlets.portlets contiene moduli python, modelli di pagina e file di configurazione ZCML - configure.zcml. Questo file contiene una serie di comandi <plone:portlet /> che definiscono i portlet standard come questo:

<plone:portlet
name="portlets.News"
interface=".news.INewsPortlet"
assignment=".news.Assignment"
renderer=".news.Renderer"
addview=".news.AddForm"
editview=".news.EditForm"
/>

Gli attributi nel codice sopra sono piuttosto auto-esplicativi. Ma se non ti sono chiari o vuoi sapere di più su gli attributi per <plone:portlet />, dai un'occhiata all'interfaccia IPortletDirective nel modulo metadirectives all'interno del pacchetto plone.app.portlets.

2. Registrare uno skin layer se non ne hai ancora uno

Siamo in grado di registrare una sovrascrittura per un portlet per un solo tema (one skin selection), grazie al pacchetto plone.theme. Grazie a plone.theme, si può impostare uno skin layer di Zope 3 che corrisponde ad una particolare skin selection in portal_skins  (un tema).

Aggiungi il seguente codice a MyTheme/browser/interfaces.py se non l'hai ancora fatto:

from plone.theme.interfaces import IDefaultPloneLayer

class IThemeSpecific(IDefaultPloneLayer):
"""Marker interface that defines a Zope 3 skin layer bound to a Skin
Selection in portal_skins.
"""

3. Aggiungere il comando configure.zcml coi giusti attributi

Insieme con il comando <plone:portlet />, il pacchetto plone.app.portlets definisce un altro - <plone:portletRenderer />. Quest'ultimo è usato per sovrascrivere i portlets, definiti nel tuo sito. Ha un bel po' di possibili attributi che possono essere trovati nel modulo metadirectives all'interno del pacchetto plone.app.portlets. Non li citiamo tutti qui, ma giusto per 5 minuti dai un'occhiata a questi attributi, in modo che puoi capire il codice riportato di seguito ...


... 5 minuti dopo ...

Ok, torniamo al lavoro. Così, per sovrascrivere lo standard News Portlet per il prodotto MyTheme dobbiamo aggiungere il comando <plone:portletRenderer />  per MyTheme/browser/configure.zcml. Vediamo come questo dovrebbe essere  (assicurati di avere xmlns:plone="http://namespaces.plone.org/plone" namespace definito nella tua <configure> top node.):

<include package="plone.app.portlets" />

<interface
interface=".interfaces.IThemeSpecific"
type="zope.publisher.interfaces.browser.IBrowserSkinType"
name="My Theme"
/>

<plone:portletRenderer
portlet="plone.app.portlets.portlets.news.INewsPortlet"
template="mytheme_news.pt"
layer=".interfaces.IThemeSpecific"
/>

Prima di tutto includiamo il pacchetto plone.app.portlets per essere sicuri che siano abilitati i portlets di default  prima di non sovrascrivere nulla.

Poi facciamo l'interfaccia del browser per MyTheme, definito in MyTheme/browser/interfaces.py. Se hai personalizzato qualsiasi viewlet dovresti già avere configure.zcml, in questo modo non è necessario aggiungerlo due volte nello stesso tema.

Quindi, guardiamo quali attributi usiamo qui:
  • Portlet - definire il portlet che ci accingiamo a sovrascrivere. Nel nostro caso si definisce l'intero percorso dell'interfaccia INewsPortlet, che è stata implementata dal portlet news;
  • Template - il nome del template che implementa il renderer. Il renderer di default per questo portlet news sarà utilizzato, ma con il modello "mytheme_news.pt, invece di quello predefinito.
  • Layer - il nostro browser layer per cui viene utilizzato questo renderer.
  • Un altro attributo di cui potresti aver bisogno di ricordare è la classe. Avrai bisogno di utilizzarla nel caso in cui desideri modificare il comportamento predefinito del portlet. Questo attributo definisce la classe che verrà utilizzata come renderer per questo portlet, invece di quello predefinito.
Questo è tutto ciò che riguarda configure.zcml. Passiamo oltre.

4. Aggiungere un nuovo template per il portlet renderer

Precedentemente abbiamo definito mytheme_news.pt come un valore per il template. Ma non abbiamo questo template sul file-system. Dobbiamo aggiungerlo a MyTheme/browser/. Basta copiare il template news.pt per il portlet news da plone.app.portlets.portlets a MyTheme/browser/ e rinominarlo mytheme_news.pt. Apri questo nel tuo editor preferito e giocaci per un po'.

Come ricordi, dovremmo sbarazzarci di news_icon.gif  che si ha di default per le news. Trova la seguente riga nel tuo template:

<img tal:replace="structure item_icon/html_tag" />
e commentatela in modo che si possa recuperare. Così, abbiamo:
<!-- <img tal:replace="structure item_icon/html_tag" /> -->


Il gioco è fatto. Fa ripartire il tuo Zope e butta un occhio al tuo nuovo portlet news!

 

Credits

Federica Pavanelli - RedTurtle Technology