Как добавить стандартные портлеты (из plone.app.portlets) в свой собственный менеджер портлетов? - PullRequest
5 голосов
/ 16 августа 2011

Используя документацию на plone.org вместе с некоторыми на форуме, я смог получить собственный менеджер портлетов под моим контентом в Plone 4.0.8.На самом деле цель состоит в том, чтобы под контентом, расположенным как панель мониторинга, располагалось 4 пользовательских менеджера.

В любом случае, мой менеджер позволяет мне добавлять только статические портлеты и портлеты сбора.Посмотрев вокруг кода, я обнаружил, что, когда система заполняет раскрывающийся список «Добавить новый портлет», она проходит по всем портлетам.Затем он просматривает атрибуты for_ каждого портлета, чтобы проверить, предоставляются ли интерфейсы самим - моим администратором портлетов.

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

Как добавить интерфейс моего менеджера в список for_ каждого портлета?интерфейсов?

1 Ответ

6 голосов
/ 17 августа 2011

Ваш комментарий , вероятно, лучший способ сделать это.Суть в том, что сами портлеты регистрируются в интерфейсе диспетчера портлетов, среди прочих интерфейсов для контекстов, уровней и т. Д. Другой способ сделать это, например, добавить дополнительные регистрации в ваши профили / default / portlets.xmlфайл в интерфейс вашего менеджера портлетов для каждого из портлетов, которые вы хотите добавить:

<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>

Однако, ваш путь, вероятно, лучше, поскольку вы создаете столбчатый менеджер портлетов.Однако вы можете удалить IPortletManager из базовых классов, поскольку IColumn уже подклассирует его.

...