======================
Image Field hinzufügen
======================
Als Änderungsanforderung kam die Darstellung eines Fotos für Registration.
Definieren des Interfaces
=========================
Das Interface wird in ``registration/interfaces.py`` erweitert::
from zope.interface import Interface
from Products.ATContentTypes.interface.image import IImageContent
...
class IRegistration(Interface, IImageContent):
...
Schemadefinition
================
Das Schema wird in ``content/registration.py`` definiert::
RegistrationSchema = folder.ATFolderSchema.copy() + atapi.Schema((
...
atapi.ImageField('image',
primary=True,
languageIndependent=True,
storage = AnnotationStorage(migrate=True),
swallowResizeExceptions = zconf.swallowImageResizeExceptions.enable,
pil_quality = zconf.pil_config.quality,
pil_resize_algo = zconf.pil_config.resize_algo,
max_size = zconf.ATImage.max_image_dimension,
sizes= {'large' : (768, 768),
'preview' : (400, 400),
'mini' : (200, 200),
'thumb' : (128, 128),
'tile' : (64, 64),
'icon' : (32, 32),
'listing' : (16, 16),
},
validators = (('checkImageMaxSize', V_REQUIRED)),
widget = ImageWidget(
description = 'Image for this registration',
label= _(u'label_image', default=u'Image'),
show_content_type = False,)),
), marshall=PrimaryFieldMarshaller()
)
...
RegistrationSchema['image'].storage = atapi.AnnotationStorage()
Anschließend wird das neue Feld implementiert::
class Registration(folder.ATFolder):
"""Contains multiple registrants
"""
implements(IRegistration)
...
**Anmerkung:** Wenn das Feld nicht ``image`` heisst, sollten zusätzlich neue *getter*- und *setter*-Methoden zur Verfügung gestellt werden. Hierzu können Sie sich z.B. in *ATContentTypes* ``getImage`` und ``setImage`` anschauen.
Adapter für ``IImageContent`` schreiben
=======================================
Der Adapter wird implementiert in ``content/registration.py``::
from zope.interface import implements
...
from zope.publisher.interfaces import IPublishTraverse
from ZPublisher.BaseRequest import DefaultPublishTraverse
...
@adapter(IRegistration)
class ImageTraverser(DefaultPublishTraverse):
implements(IPublishTraverse)
def __init__(self, context, request):
self.context = context
self.request = request
def publishTraverse(self, request, name):
if name.startswith('image'):
field = self.context.getField('image')
image = None
if name == 'image':
image = field.getScale(self.context)
else:
scalename = name[len('image_'):]
if scalename in field.getAvailableSizes(self.context):
image = field.getScale(self.context, scale=scalename)
if image is not None and not isinstance(image, basestring):
# image might be None or '' for empty images
return image
else:
return super(ImageTraverser, self).publishTraverse(request, name)
Anschließend wird der Adapter konfiguriert in der Datei ``content/configure.zcml``::