2011-09-15 14 views
5

Zajmuję się tworzeniem typu zawartości dla Plone 4 i chciałbym zablokować wszystkie portlety użytkownika, grupy i kontekstu, które mogą dziedziczyć po obiekcie nadrzędnym. Jestem całkowicie zagubiony przez dokumentację w tym momencie-w portlets.xml, <blacklist/> tylko wydaje się adresować specyficzne dla ścieżki blokowanie. <assignment/> wygląda na to, co chcę, ale wydaje się zbyt szczegółowy - nie chcę zarządzać przypisaniem wszystkich możliwych portletów w moim typie treści.Przypisanie portletu specyficznego dla typu Plone Content

Istnieją wskazówki, że znalazłem, że dostosowywanie Menedżer portletów ILeftColumn i IRightColumn specyficzne dla typu zawartości, ale nie mogę znaleźć żadnych dobrych przykładów. Czy ktoś ma jakieś wskazówki lub sugestie? Czuję, że brakuje mi czegoś martwego.

Odpowiedz

6

aby zapobiec akwizycji portletów i zachować możliwość dodawania portlert można dodać detektor zdarzeń do tworzenia treści, który automatycznie blokuje akwizycję.

Jak to:

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

i niż to zrobić:

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) 

Uwaga: Ten kod jest inspirowana przez plone.app.portlet manage view

Edit 19/08/2011: wliczone poprawki jak sugeruje przez @ w moim nieprzetestowanym kodzie ... więc teraz jest testowany

+0

Dziękujemy! Dokładnie to chciałem zrobić, blokuje istniejące portlety, zachowując przy tym możliwość przypisywania ich w przyszłości. Byłem tak pochłonięty próbując zrobić coś w portlets.xml, że subskrybent nie przyszedł mi do głowy. – Will

+1

Dla potomności istnieje kilka modyfikacji, które należy wprowadzić w powyższym kodzie, aby działało. W ZCML atrybut 'factory' powinien być' handler', nazwy menedżerów muszą być dopasowane do odpowiednich menedżerów 'IPortletManager' za pomocą' getUtility() '. – Will

+0

@ Czy mógłbyś zaznaczyć tę odpowiedź jako odpowiedź na swoje pytanie? – toutpt

1

Wykonaj przypisanie do typu portalu na żywo na stronie za pomocą Zestawu witryn (panel sterowania) -> Typy -> "Zarządzaj portletami przypisanymi do tego typu zawartości".

Następnie wyeksportuj konfigurację za pomocą ZMI -> portal_setup -> Export-Tab -> wybierz "Portlety" -> kliknij "eksportuj" na dole.

Wyodrębnij typy/YourType.xml-file i skopiuj odpowiednie części w profilach pakietu/default/types/YourType.xml.

+0

wydaje się, że można w ten sposób dodawać tylko portlety, a nie blok k portletu rodziców. Jesteś tego pewien? –

+0

Ah nie, nie można blokować w ten sposób, miałem na myśli tylko twój drugi akapit. Nie chcesz całkowicie blokować nagłówków, ale nadal możesz przypisywać nowe, prawda? – ida

Powiązane problemy