2

我经常面临压倒一切的 viewlet 问题,而且我经常不知道为什么它会起作用。

我现在正在尝试覆盖使用浏览器层但不继承自 plone.app.layout.viewlets.common.BaseViewlet 的collective.googleanalytics 跟踪器视图。

为了实现这一点,我创建了一个从 c.googleanalytics 继承的浏览器层,注册它并验证一切顺利。

我仍然不明白为什么使用 c.googleanalytics viewlet 而不是我的。

代码在这里:https ://github.com/toutpt/collective.linguaanalytics

我希望能够知道我可以在哪里添加 PDB 来调试它。或者什么工具可以提供帮助。

编辑:

(Pdb) self.request.__provides__.__iro__
InterfaceClass plonetheme.sunburst.browser.interfaces.IThemeSpecific>, 
InterfaceClass plone.app.z3cform.interfaces.IPloneFormLayer>, 
InterfaceClass z3c.form.interfaces.IFormLayer>, 
InterfaceClass plone.app.discussion.interfaces.IDiscussionLayer>, 
InterfaceClass collective.linguaanalytics.interfaces.ILayer>, 
InterfaceClass collective.googleanalytics.interfaces.browserlayer.IAnalyticsLayer>, InterfaceClass plone.theme.interfaces.IDefaultPloneLayer>, 
InterfaceClass Products.CMFDefault.interfaces.ICMFDefaultSkin>, 
InterfaceClass zope.publisher.interfaces.browser.IDefaultBrowserLayer>, 
InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>, 
InterfaceClass zope.publisher.interfaces.http.IHTTPRequest>, 
InterfaceClass zope.publisher.interfaces.IRequest>, 
InterfaceClass zope.publisher.interfaces.IPublisherRequest>, 
InterfaceClass zope.publisher.interfaces.IPublicationRequest>, 
InterfaceClass zope.security.interfaces.IParticipation>, 
InterfaceClass zope.publisher.interfaces.IApplicationRequest>, 
InterfaceClass zope.interface.common.mapping.IEnumerableMapping>, 
InterfaceClass zope.interface.common.mapping.IReadMapping>,
InterfaceClass zope.interface.common.mapping.IItemMapping>, 
InterfaceClass zope.publisher.interfaces.ISkinnable>, 
InterfaceClass zope.annotation.interfaces.IAttributeAnnotatable>, 
InterfaceClass zope.annotation.interfaces.IAnnotatable>, 
InterfaceClass zope.interface.Interface>)

编辑:似乎它们不是围绕 plone.browserlayer 中的另一层覆盖层的测试。可能是一个错误?

4

2 回答 2

3

哈哈,愚蠢的错字。在 viewlets/configure.zcml 中,viewlet 是来自collective.googleanalytics 的“AnalyticsTrackingViewlet”。

在您的 viewlets.py 中,您覆盖了此类,但被覆盖类的真实名称是“AnalyticsViewlet”

因此,当加载 zcml 时,它会用 ... c.google.AnalyticsTrackingViewlet :D 覆盖 c.google.AnalyticsTrackingViewlet。

只需更改您的 zcml 即可使用 AnalyticsViewlet 并享受。

于 2012-04-24T09:31:34.320 回答
0

这看起来很hackish。为什么不单独离开上游层?

您应该通过 overrides.zcml 覆盖。一旦工作/没有/层限制,您可以将其绑定到干净的层接口。

替代策略,不要覆盖上游 viewlet,而是通过 GS 隐藏它并给自己的 viewlet 一个不同的名称。再次,在一个干净的层上。

于 2012-04-23T22:13:52.960 回答