2011-09-15 26 views
5

Tôi đang phát triển loại nội dung cho Plone 4 và tôi muốn chặn tất cả các portlet của người dùng, nhóm và ngữ cảnh mà nó có thể kế thừa từ đối tượng mẹ của nó. Tôi hoàn toàn bị nhầm lẫn bởi tài liệu hướng dẫn tại thời điểm này – trong portlets.xml, <blacklist/> dường như chỉ giải quyết việc chặn đường dẫn cụ thể. <assignment/> có vẻ như những gì tôi muốn, nhưng có vẻ quá cụ thể - tôi không muốn quản lý việc gán cho tất cả các portlet có thể có trên loại nội dung của tôi.Bài tập Portlet cụ thể theo từng loại nội dung

Có những gợi ý mà tôi thấy rằng tùy biến trình quản lý portlet ILeftColumn và IRightColumn cụ thể cho loại nội dung, nhưng tôi không thể tìm thấy bất kỳ ví dụ hay nào. Có ai có bất kỳ gợi ý hay gợi ý nào không? Tôi cảm thấy như tôi đang thiếu một cái gì đó chết đơn giản.

Trả lời

6

để ngăn chặn việc thu thập portlet và duy trì khả năng thêm portlert, bạn có thể thêm trình xử lý sự kiện vào việc tạo nội dung tự động chặn truy cập.

Như thế này:

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

và hơn làm điều này:

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) 

Lưu ý: mã này được lấy cảm hứng từ plone.app.portlet manage view

Sửa 19/08/2011: bao gồm các bản sửa lỗi như đề xuất bởi @will trong mã chưa được kiểm tra của tôi ... vì vậy bây giờ được kiểm tra

+0

Cảm ơn bạn! Đây là chính xác những gì tôi muốn làm, nó chặn các portlet hiện có trong khi giữ lại khả năng của người dùng để gán chúng trong tương lai. Tôi đã rất cố gắng để làm một cái gì đó trong portlets.xml rằng một thuê bao đã không xảy ra với tôi. – Will

+1

Đối với hậu thế, có một vài sửa đổi cần được thực hiện đối với mã trên, để làm cho nó hoạt động. Trong ZCML, thuộc tính 'factory' phải là' handler', các tên trình quản lý cần phải được đối sánh với các trình quản lý 'IPortletManager' tương ứng của chúng với' getUtility() '. – Will

+0

@Will vui lòng đánh dấu câu trả lời này là câu trả lời cho câu hỏi của bạn? – toutpt

1

Thực hiện việc gán cho portaltype của bạn trực tiếp trên một trang web thông qua Sitesetup (controlpanel) -> Types -> "Quản lý các portlet được gán cho kiểu nội dung này".

Sau đó xuất cấu hình qua ZMI -> portal_setup -> Export-Tab -> chọn 'Portlets' -> bấm 'export' ở phía dưới.

Trích xuất các loại/tệp YourType.xml và sao chép các phần có liên quan trong tiểu sử của gói/mặc định/loại/YourType.xml của bạn.

+0

có vẻ như cách này bạn chỉ có thể thêm các portlet, không phải khối k portlet cha mẹ. Bạn có chắc chắn theo cách đó không? –

+0

Ah không, nó không thể chặn theo cách đó, tôi chỉ đề cập đến đoạn thứ hai của bạn. Bạn không muốn chặn prtlets hoàn toàn, nhưng vẫn có thể gán prtlets mới, phải không? – ida

Các vấn đề liên quan