当我们将网站从Plone 3升级到Plone 4时,我们遇到了一个奇怪的问题:
我们定义了许多自定义portlets。其中之一是"Jobs“Portlet,它是一个轻量级定制的News portlet。这是从News portlet派生的子类,如下所示:
http://plone.org/documentation/manual/developer-manual/portlets/appendix-practicals/subclassing-new-portlets。
这就是:
<plone:portlet
name="falcon.JobsPortlet"
interface=".portlets.IFalconJobsPortlet"
...
renderer=".portlets.FalconJobsRenderer"
/>其中来自INewsPortlet的IFalconJobsPortlet子类:
from plone.app.portlets.portlets.news import INewsPortlet
class IFalconJobsPortlet(INewsPortlet):
"""Interface for Jobs portlet uses the same schema as News Portlet"""我们还(单独)希望替换标准INewsPortlet上的render类,以便提供自定义模板:
<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>生效并替换了renderer子句,因此
".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 = ...我的问题,供将来参考:
有没有一种方法可以在使用子类portlets时安全地组合<plone:portlet>和<plone:portletRenderer>?
发布于 2011-08-11 02:33:39
如果您在<plone:portlet name="falcon.JobsPortlet"...>注册中没有使用layer="...",那么这可能是根目录。ZCML用来注册适配器的ZCA,根据接口的具体情况给予一个查询优先于另一个。因此,我猜既然您在<plone:portletRenderer>中而不是在<plone:portlet>中提供了一个层,那么<plone:portletRenderer>中的渲染器就会匹配两者的portlet接口,并且该层更加具体,因此它会胜出。
因为只有<plone:portletRenderer>支持层规范,所以我只需要为注册到同一层的FalconJobsRenderer添加一个<plone:portletRenderer>注册,这将确保正确的优先级。这样你就可以恢复你的变通方法并子类化INewsPortlet。它更适合作为INewsPortlet的子类。
https://stackoverflow.com/questions/6917537
复制相似问题