Добавить метод «тег» в ATEvent - PullRequest
1 голос
/ 23 января 2012

Я использую 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 Ответ

1 голос
/ 24 января 2012

Я считаю, что проблема в том, что вы пытаетесь вызвать 'tag' на ATEvent Объект, но метод определен на адаптере для объекта ATEvent. Вы должны иметь возможность вызывать IImageExtender (item) .tag ()

К сожалению, ограниченный python не позволяет вам делать это непосредственно в шаблоне страницы, поэтому лучше всего будет создать BrowserView для вашего расширенного ATEvent, который предоставляет доступ к адаптеру.

...