Странность, с которой мы столкнулись при обновлении сайтов с 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>
, когда портлеты с подклассами находятся в игре?