2011-08-16 2 views
5

Utilizzando il documentation su plone.org e alcuni nel forum, sono riuscito a ottenere un gestore di portlet personalizzato sotto il mio contenuto in Plone 4.0.8. L'obiettivo, in realtà, è avere 4 gestori personalizzati sotto il contenuto disposti come il dashboard.Come aggiungere portlet stock (da plone.app.portlets) al mio gestore portlet personalizzato?

In ogni caso, il mio gestore mi consente solo di aggiungere portlet statici e di raccolta. Dopo aver cercato nel codice, ho scoperto che quando il sistema va a popolare il menu a discesa "Aggiungi nuovo portlet", scorre su tutti i portlet. Quindi, esegue il ciclo di controllo degli attributi 'for_' di ogni portlet per verificare se le interfacce sono fornite da self-my portlet manager.

def getAddablePortletTypes(self): 
    addable = [] 
    for p in getUtilitiesFor(IPortletType): 
     # BBB - first condition, because starting with Plone 3.1                                 
     #every p[1].for_ should be a list                                       
     if not isinstance(p[1].for_, list): 
      logger.warning("Deprecation Warning ..." % p[1].addview) 
      if p[1].for_ is None or p[1].for_.providedBy(self): 
       addable.append(p[1]) 
     elif [i for i in p[1].for_ if i.providedBy(self)]: 
      addable.append(p[1]) 
    return addable 

Come si aggiunge l'interfaccia del mio gestore all'elenco di interfacce 'for_' di ogni portlet?

+2

ho cambiato l'interfaccia di mio manager da classe 'IBottomPortletManager (IPortletManager)' a classe 'IBottomPortletManager (IPortletManager, iColumn)' iColumn è definito in plone.app.portlets, così quei portlet è già registrato per manager che forniscono IColumn. Ora, questo è il modo ideale per farlo? – Travv15

risposta

6

Il tuo comment è probabilmente il modo migliore per farlo. Il punto cruciale è che i portlet stessi sono registrati su un'interfaccia di portlet manager, tra le altre interfacce per contesti, layer, ecc. Un altro modo per farlo, ad esempio, sarebbe aggiungere registrazioni aggiuntive nei tuoi profili/default/portlets.xml file sul interfaccia di gestione del portlet per ciascuno dei portlet che si desidera cumulabili:

<portlet 
    addview="portlets.News" 
    title="News" 
    description="A portlet which can render a listing of recent news" 
    i18n:attributes="title; 
        description" 
    > 
    <for interface="your.package.IYourPortletManager" /> 
</portlet> 

il tuo modo è probabilmente la cosa migliore, però, dal momento che sembra che tu sono la creazione di un gestore di portlet colonnare. È possibile rimuovere IPortletManager dalle classi base, tuttavia, poiché IColumn lo ha già sottoposto a sottoclassi.

+0

Per curiosità, come aggiungerei ulteriori registrazioni all'interfaccia del mio manager? Supponiamo che io stia usando solo IPortletManager come base, ma voglio anche portlet News. Come posso aggiungere la mia interfaccia manager alle registrazioni del portlet News? Ho guardato in giro su plone.app.portlets cercando di capire come questi portlet registrano le interfacce senza fortuna ancora. – Travv15

+0

Ho aggiornato la mia risposta con un esempio. –