添加"标记" ATEvent的方法

时间:2012-01-23 16:29:12

标签: plone adapter

我使用archetypes.schemaextender扩展ATEvent的模式以添加ImageField。

有效。

现在,我想将“tag”方法添加到ATEvent中,以便使用“新”缩放图像的方式。

所以我这样做: 在文件extender.py中:

from Products.CMFCore.permissions import View
from AccessControl import ClassSecurityInfo
from zope.interface import Interface

class IImageExtender(Interface):
    """  """
    def tag():
        """  """

class ImageExtender(object):
    """ """
    implements(IImageExtender)
    security = ClassSecurityInfo()

    def __init__(self, context):
        self.context = context

    security.declareProtected(View, 'tag')
    def tag(self, **kwargs):
        """Generate image tag using the api of the ImageField
        """
        return self.getField('image').tag(self, **kwargs)

在configure.zcml之后:

<adapter for="Products.ATContentTypes.interface.IATEvent"
         provides=".extender.IImageExtender"
     factory=".extender.ImageExtender" />

但它不起作用。 我得到了这些错误:

Module zope.tales.pythonexpr, line 59, in __call__
- __traceback_info__: ( path('nocall:item_object/tag')(scale=size, css_class='tileImage'))
Module <string>, line 1, in <module>
Module zope.tales.pythonexpr, line 77, in __call__
Module zope.tales.expressions, line 217, in __call__
Module zope.tales.expressions, line 194, in _eval
Module zope.tales.expressions, line 217, in __call__
Module zope.tales.expressions, line 194, in _eval
Module zope.tales.expressions, line 124, in _eval
Module zope.pagetemplate.engine, line 66, in __call__
Module zope.traversing.adapters, line 136, in traversePathElement
- __traceback_info__: (<ATEvent at /Plone/manifestations/visites-conferences/conf>, 'tag')
Module zope.traversing.adapters, line 50, in traverse
- __traceback_info__: (<ATEvent at /Plone/manifestations/visites-conferences/conf>, 'tag', [])
LocationError: (<ATEvent at /Plone/manifestations/visites-conferences/conf>, 'tag')

任何线索? 感谢。

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是你试图在ATEvent上调用'tag' 对象,但该方法是在ATEvent对象的适配器上定义的。你需要能够调用IImageExtender(item).tag()

不幸的是,受限制的python阻止你直接在页面模板中执行此操作,因此最好的办法是为扩展的ATEvent创建一个BrowserView,以提供对适配器的访问。