[Plone-IT] Aggiungere nuovi campi in portlet esistente

Luca Fabbri keul a redturtle.it
Ven 31 Maggio 2013 07:02:17 UTC


2013/5/30 Roberto Rascioni <r.rascioni a unimc.it>:
> Il 30/05/13 17.03, Luca Fabbri ha scritto:
>
>> 2013/5/30 Roberto Rascioni <r.rascioni a unimc.it>:
>>>
>>> Salve lista!
>>> avrei la necessità di aggiungere un nuovo campo nello schema di una
>>> portlet
>>> già esistente.
>>>
>>> Googlelando un po' non ho trovato molto tranne il consiglio di
>>> subclassare
>>> la portlet esistente e crearne una nuova con l'aggiunta dello schema
>>> voluto.
>>> Un buon consiglio ma purtroppo sono costretto ad aggiungere campi alla
>>> portlet esistente perchè quest'ultima è già in produzione in diversi
>>> siti.
>>>
>>> Qualcuno di voi sa consigliarmi una metodologia da seguire? O anche un
>>> prodotto che si occupi di aggiungere nuovi campi ad una portlet
>>> esistente?
>>>
>> Se ho capito il tuo dubbio non è un problema, se il nuovo campo
>> dell'assignment è un attributo di classe con un default, non avrai
>> problemi:
>> Ne parlavo qui:
>> http://blog.keul.it/2011/04/plone-portlets-are-not-enemies-just.html
>> Andando poi in gestione delle vecchie portlet avrai il nuovo attributo
>> da compilare.
>>
>> Se non vuoi creare una nuova portlet puoi probabilmente limitarti a
>> definire un nuovo portletRenderer:
>>
>> http://plone.org/documentation/kb/customization-for-developers/portlet-renderers
>> Nell'esempio sopra viene solo cambiato il template, ma la direttiva
>> plone:portletRenderer dovrebbe prevedere anche l'uso di "class".
>>
>>
> Ciao Luca!
> e grazie della pronta risposta! Il mio problema è proprio quello descritto
> nel primo post che mi hai inviato ma rileggendo il messaggio mi sono accorto
> di aver omesso alcuni importanti particolari:
>
> nel mio caso dovrò aggiungere dei nuovi campi alla gestione della portlet
> esistente e dovrò farlo estendendo un prodotto installato via buildout e che
> risiede quindi nella cartella eggs.
>
> In effetti ho già esteso il prodotto perchè avevo la necessità di
> sovrascrivere la pt originale:
>
> class Renderer(portletOriginale.Renderer):
>     render = ViewPageTemplateFile('templates/miaPageTemplate.pt')
>
>
> Ma quando provo con la stessa logica ad estedere la classe Assignment per
> aggiungere i nuovi campi non succede nulla..tra le altre cose non ricevo
> nemmeno errori:
>
>
> class IMiaPortlet(portletOriginale.IOriginalPortlet):
>
>     count = schema.Int(title=_(u'Number of items to display'),
>                        description=_(u'How many items to list.'),
>                        required=True,
>                        default=5)
>
>
> class Assignment(portletOriginale.Assignment):
>
>   implements(IMiaPortlet)
>
>   count = 5
>
>   def __init__(self, count=5):
>      self.count = count
>
>
> Non so se questa sia la procedura corretta e sto sbagliando qualcosa
> o se sto sbagliando tutto da principio perchè è impossibile aggiungere nuovi
> campi attraverso questo metodo
>

Innanzi tutto: il mio suggerimento di usare un nuovo portletRenderer
era sbagliato, scusami. Come appunto hai evidenziato tu hai bisogno di
manipolare l'assignment e non il renderer.

La modifica che hai fatto, estendendo le varie classi, potrebbero
andare bene per un nuovo tipo di portlet ma non per le vecchie portlet
(cosa che invece vuoi ottenere).
Il problema è che le vecchie portlet usano il vecchio assignment
(portletOriginale.Assignment).

Non ho presente il tuo codice o il codice del prodotto originale, ma
la cosa più veloce che mi viene in mente al momento sarebbe quella di
iniziare ad utilizzare un branch del prodotto originale (i sorgenti li
hai?).

NB. Usare branch è un po' come il Lato Oscuro: paga molto velocemente
e raggiungi velocemente il risultato, ma se il prodotto originale
viene aggiornato e puoi portarti dietro le modifiche, ti troverai ad
dover "inseguire".

Altra possibilità: monkey patch (probabilmente).

Magari qualcun altro ha soluzioni più eleganti :)

-- 
Saluti/Regards

Luca Fabbri - RedTurtle Technology
E-mail: luca.fabbri a redturtle.it
Web Site: http://www.redturtle.it/
Phone: +39 0532 1915958
Fax: +39 0532 287070


Maggiori informazioni sulla lista Plone-IT