2011-09-15 13 views
5

Sto sviluppando un tipo di contenuto per Plone 4 e vorrei bloccare tutti i portlet utente, di gruppo e di contesto che possono ereditare dal suo oggetto padre. Sono completamente confuso dalla documentazione a questo punto: in portlets.xml, <blacklist/> sembra solo indirizzare il blocco specifico del percorso. <assignment/> sembra quello che voglio, ma sembra troppo specifico: non voglio gestire l'assegnazione per tutti i portlet possibili sul mio tipo di contenuto.Assegnazione portlet tipo specifico contenuto Plone

Ci sono indizi che ho trovato che personalizzando un gestore di portlet ILeftColumn e IRightColumn specifico per il tipo di contenuto, ma non riesco a trovare alcun buon esempio. Qualcuno ha qualche suggerimento o suggerimento? Mi sento come se mi mancasse qualcosa di semplice morto.

risposta

6

per impedire l'acquisizione del portlet e mantenere la possibilità di aggiungere portlert è possibile aggiungere un listener di eventi alla creazione del contenuto che blocca automaticamente l'acquisizione.

Ti piace questa:

<subscriber 
     for="my.package.interfaces.IMyContent 
      zope.app.container.interfaces.IObjectAddedEvent"     
handler=".subscribers.blockPortletsUpponMyContentCreation" 
        /> 

e di fare questo:

from zope.component import getMultiAdapter, getUtility 
from plone.portlets.interfaces import IPortletManager 
from plone.portlets.interfaces import ILocalPortletAssignmentManager 
from plone.portlets.constants import USER_CATEGORY 
from plone.portlets.constants import GROUP_CATEGORY 
from plone.portlets.constants import CONTENT_TYPE_CATEGORY 
from plone.portlets.constants import CONTEXT_CATEGORY 

def blockPortletsUpponMyContentCreation(mycontent, event): 
    for manager_name in ('plone.leftcolumn','plone.rightcolumn'): 
     manager = getUtility(IPortletManager, name=manager_name) 
     assignable = getMultiAdapter((mycontent, manager,), ILocalPortletAssignmentManager) 
     for category in (GROUP_CATEGORY, CONTENT_TYPE_CATEGORY,CONTEXT_CATEGORY,USER_CATEGORY): 
      assignable.setBlacklistStatus(category, 1) 

Nota: questo codice si ispira alla plone.app.portlet manage view

Edit 19/08/2011: incluso correzioni come suggerito by @will nel mio codice non testato ... quindi ora è testato

+0

Grazie! Questo è esattamente ciò che volevo fare, blocca i portlet esistenti pur mantenendo la possibilità dell'utente di assegnarli in futuro. Ero così preso a cercare di fare qualcosa in portlets.xml che un sottoscrittore non mi aveva mai visto. – Will

+1

Per i posteri, ci sono un paio di modifiche che dovrebbero essere apportate al codice sopra, per farlo funzionare. In ZCML, l'attributo 'factory' dovrebbe essere' handler', i nomi dei manager devono essere abbinati ai rispettivi gestori 'IPortletManager' con' getUtility() '. – Will

+0

@Per favore, potresti contrassegnare questa risposta come la risposta alla tua domanda? – toutpt

1

Effettuare l'assegnazione al proprio tipo di portale su un sito tramite Sitesetup (pannello di controllo) -> Tipi -> "Gestisci portlet assegnati a questo tipo di contenuto".

Quindi esportare la configurazione tramite ZMI -> portal_setup -> Export-Tab -> selezionare "Portlet" -> fare clic su "esporta" in basso.

Estrarre i tipi/YourType.xml-file e copiare le parti rilevanti nei profili del pacchetto/default/types/YourType.xml.

+0

sembra che in questo modo sia possibile aggiungere solo portlet, non blocchi k il portlet dei genitori. Sei sicuro di questo? –

+0

Ah no, non è possibile bloccare in quel modo, mi riferivo solo al tuo secondo paragrafo. Non vuoi bloccare completamente i prtlet, ma puoi ancora assegnarne di nuovi, vero? – ida

Problemi correlati