首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >plone:portlet vs plone:portletRenderer (子类化问题)

plone:portlet vs plone:portletRenderer (子类化问题)
EN

Stack Overflow用户
提问于 2011-08-03 03:32:32
回答 1查看 298关注 0票数 2

当我们将网站从Plone 3升级到Plone 4时,我们遇到了一个奇怪的问题:

我们定义了许多自定义portlets。其中之一是"Jobs“Portlet,它是一个轻量级定制的News portlet。这是从News portlet派生的子类,如下所示:

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

这就是:

代码语言:javascript
复制
<plone:portlet
  name="falcon.JobsPortlet"
  interface=".portlets.IFalconJobsPortlet"
   ...
  renderer=".portlets.FalconJobsRenderer"
 />

其中来自INewsPortlet的IFalconJobsPortlet子类:

代码语言:javascript
复制
from plone.app.portlets.portlets.news import INewsPortlet

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

我们还(单独)希望替换标准INewsPortlet上的render类,以便提供自定义模板:

代码语言:javascript
复制
<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子句,因此

代码语言:javascript
复制
".portlets.FalconJobsRenderer" (correct)     is replaced with
".portlets.FalconNewsRenderer" (incorrect)

这种情况下的一个解决方案/变通方法很简单:我不再从INewsPortlet派生子类,而只是手动从原始超类复制模式:

代码语言:javascript
复制
class IFalconJobsPortlet(IPortletDataProvider):
  """Interface for Jobs portlet uses the same schema as News Portlet"""
 count = ...
 state = ...

我的问题,供将来参考:

有没有一种方法可以在使用子类portlets时安全地组合<plone:portlet><plone:portletRenderer>

EN

回答 1

Stack Overflow用户

发布于 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的子类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6917537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档