plone: ​​портлет против plone: ​​portletRenderer (проблема создания подклассов) - PullRequest
2 голосов
/ 02 августа 2011

Странность, с которой мы столкнулись при обновлении сайтов с Plone 3 до Plone 4:

Мы определяем ряд пользовательских портлетов.Одним из них является портлет «Работа», представляющий собой слегка настроенный новостной портлет.Это было разделено на подклассы из портлета Новости, как предложено:

http://plone.org/documentation/manual/developer-manual/portlets/appendix-practicals/subclassing-new-portlets.

То есть:

<plone:portlet
  name="falcon.JobsPortlet"
  interface=".portlets.IFalconJobsPortlet"
   ...
  renderer=".portlets.FalconJobsRenderer"
 />

где подклассы IFalconJobsPortlet из INewsPortlet:

from plone.app.portlets.portlets.news import INewsPortlet

class IFalconJobsPortlet(INewsPortlet):
 """Interface for Jobs portlet uses the same schema as News Portlet"""

Мы также (отдельно) хотим заменить класс рендеринга в стандартном INewsPortlet, чтобы предоставить собственный шаблон:

<plone:portletRenderer
   portlet="plone.app.portlets.portlets.news.INewsPortlet"
   class=".portlets.FalconNewsRenderer"
   layer=".interfaces.IThemeSpecific"
   />

Это отлично работает в Plone 3. Это могло быть просто слепымудачи, или это может быть случай, когда <plone:portletRenderer> раньше работал до <plone:portlet>, а теперь - после.

В Plone 4, falcon.JobsPortlet настроен правильно, но затем запускается <plone:portletRenderer> изаменяет условие рендеринга, так что

".portlets.FalconJobsRenderer" (correct)     is replaced with
".portlets.FalconNewsRenderer" (incorrect)

Решение / обходной путь в этом случае был прост: я прекратил создавать подклассы из INewsPortlet и просто скопировал схему вручную из исходного суперкласса:

class IFalconJobsPortlet(IPortletDataProvider):
  """Interface for Jobs portlet uses the same schema as News Portlet"""
 count = ...
 state = ...

Мой вопрос для дальнейшего использования:

Есть ли способ безопасно объединить <plone:portlet> и <plone:portletRenderer>, когда портлеты с подклассами находятся в игре?

1 Ответ

0 голосов
/ 10 августа 2011

Если вы не используете layer="..." при регистрации <plone:portlet name="falcon.JobsPortlet"...>, то это, вероятно, корень.ZCA, который этот ZCML использует для регистрации адаптеров, дает один приоритет поиска перед другим на основе специфичности интерфейса.Поэтому я предполагаю, что поскольку вы задаете слой в <plone:portletRenderer>, а не в <plone:portlet>, тогда средство визуализации в <plone:portletRenderer> соответствует интерфейсу портлета обоих, а слой более конкретен и поэтому выигрывает.

Поскольку только <plone:portletRenderer> поддерживает спецификацию слоя, я бы просто добавил <plone:portletRenderer> регистрацию для FalconJobsRenderer, которая зарегистрирована для того же слоя и которая обеспечит правильный приоритет.Таким образом, вы можете отменить свой обходной путь и подкласс INewsPortlet.Гораздо более уместно использовать подкласс INewsPortlet.

...