2012-01-23 69 views
1

我用archetypes.schemaextender延長ATEvent的模式,以添加的ImageField。添加「標籤」的方法來ATEvent

工程。

現在,我想補充的「標籤」的方法對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

我相信這裏的問題是,你正試圖調用ATEvent對象的'tag',但是該方法是在ATEvent對象的適配器上定義的。您需要能夠調用IImageExtender(item).tag()

不幸的是,受限制的python阻止您直接在頁面模板中執行此操作,所以最好的辦法是爲您的擴展ATEvent創建一個BrowserView,它提供訪問適配器。