Añadir un portlet en Plone 3.0
Plone 3.0 ha cambiado la forma de tratar con los portlets. Este documento contiene un ejemplo como punto de partida para trabajar con plone 3.0
Tras trastear un poco con el código de Plone 3.0 he conseguido crear un portlet nativo en Plone 3.0
Plone 3.0 administra los portlets desde el propio Plone (siempre que se tengan permisos), no desde el ZMI como los Plones antiguos, destacaría los siguientes cambios:
- Ahora los portlets no son macros zpt puestas en una carpeta de portal_skins, son viewlets. Aunque existe la posibilidad de compatibilidad con estas antiguas macros, pero no se recomienda su uso al enlentecer el sistema en gran medida.
- Incluyen una interfaz de configuración, por ejemplo, el de noticias permite configurar el número de noticias a mostar y el estado de las noticias que se deben buscar.
- Cambiando los permisos (manage porlets) pueden los usuarios personalizar sus columnas.
Con estos cambios se complica un poco añadir uno desde un producto. En primer lugar, no basta con un único fichero .pt con el contenido del portlet, ahora hay que añadir:
Los informáticos lo tocan todo y cuando están desesperados buscan documentación para leer.
Como os comprendo, recomiendo que, tras conseguir poner el primer porlet (como buen informático no antes), busquéis en Plone.org la palabra viewlet y leáis un poco que son para que sirven y de donde vienen.
Es interesante, todo Plone 3.0 es así y Plone 3.5 promete ser peor.
- Una clase interfaz
- Una clase que lo renderiza (finalmente dicha clase devuelve una plantilla en este caso)
- Otra para controlar como añadirlo y verlo en la zona de administración de portlets
- Y el formulario de configuración: En este ejemplo no lo he terminado, pero cuando lo acabe amplio este documento.
Antes de ver los ficheros: En este ejemplo no he seguido la estructura de directorios utilizada en Plone (estaba ansioso por ver mi portlet). Está todo a lo bruto en un directorio (plantilla, interfaz, portlet, etc). No partáis de aquí para hacer vuestro producto pues obtendréis un caos y los nombres de los ficheros no son los correctos. Mirad otros productos o el código de Plone
La estructura de directorios ahora es la mostrada en la figura 1. El primer fichero que define las clases del portlet en python es interfaces.py (no debería llamarse así, debería estar en la carpeta portlets y llamarse example.py):
from plone.portlets.interfaces import IPortletDataProvider
from plone.app.portlets.portlets import base
from zope.interface import implements
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.formlib import form
from Products.CMFPlone import PloneMessageFactory as _
class IHelloPortlet(IPortletDataProvider):
pass
class Assignment(base.Assignment):
implements(IHelloPortlet)
@property
def title(self):
return _(u"HELLOOOOOOOOO!!")
class Renderer(base.Renderer):
render = ViewPageTemplateFile('hello.pt')
def __init__(self, *args):
base.Renderer.__init__(self, *args)
class AddForm(base.NullAddForm):
form_fields = form.Fields(IHelloPortlet)
label = _(u"Add Hello Portlet")
description = _(u"Hello example")
def create(self):
return Assignment()
Fijáos que el texto "HELLOOOOOOOOO!!" es el que aparece cuando se administran los portlets (no es el contenido). La clase encargada de renderizar realmente devuelve la platilla hello.pt (que tampoco debería estar en el directorio raíz) y ésta contiene algo parecido a un portlet clásico:
<dl class="portlet"> <dt class="portletHeader"> Mi primer porlet </dt> <dd class="portletItem"> Esta es mi primer portlet hecho en Plone 3.0 </dd> </dl>
Más diferencias: ¿donde está toda la cabecera de las plantillas de zope?. Pues no hace falta, estas plantillas (viewlets) tienen peculiaridades y deberíais curiosear en plone.org, por ejemplo, la varibale "here" no existe, mientras "context" si está definida.
Para que funcione sólo hay que instalarlo en Plone 3.0. ¿Y el script de instalación: Extensions/Install? Bueno ya deberíamos ir olvidándonos de él ahora, se utilizan los ficheros .zcml.
¿No conozco .zml?, está relacionado con esa herramienta del ZMI: portal_setup.
Recomiendo buscar en plone "Five" y dar un vistazo a algunos tutoriales.
Five no es mas que un producto para integrar en Zope2 las tecnologías de Zope3 y, Plone 3.0 lo utiliza.
Sólo faltan dos ficheros de configuración: configure.zcml
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
xmlns:plone="http://namespaces.plone.org/plone"
>
<plone:portlet
name="example.hello"
interface=".interfaces.IHelloPortlet"
assignment=".interfaces.Assignment"
renderer=".interfaces.Renderer"
addview=".interfaces.AddForm"
/>
<genericsetup:registerProfile
name="PExampleViewlet"
title="Portlet - Viewlet example"
directory="profiles/default"
description="Last step"
provides="Products.GenericSetup.interfaces.EXTENSION"
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
/>
</configure>
En la definición del portlet se utilizan todas las clases que se crearon antes.
Y el que añade el porlet: profiles/default/portlet.xml (cuidado con la ubicación de la carpeta)
<?xml version="1.0"?>
<portlets>
<portlet
addview="example.hello"
title="Example"
description="Prueba."
/>
</portlets>
Tras esto y arrancar Plone 3.0 unas 30 veces ¡lo conseguí!. En el panel de control aparece mi producto y tras instalarlo se registra el porlet pudiendo agregarlo.
Por último, dejo un zip con este mini-infierno quedándome por añadir la posibilidad de configurarlo desde plone, eso otro día.
Un último detalle: ¿Como personalizar un portlet en Plone 3.0?. Esto seguro que ya lo habéis encontrado, pero por si acaso, ahora no hay que cambiarlo en "portal_skins/custom", hay una nueva herramienta que administra los viewlets y se llama "portal_view_customizations".

