====================== 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``:: Erstellen eines Views ===================== #. Zunächst wird der *View* registriert in ``browser/configure.zcml``:: #. Anschließend wird der *View* implementiert wobei zunächst die Datei ``browser/imagesupport.py`` angelegt wird mit folgendem Inhalt:: from zope.interface import implements from Products.CMFCore.utils import getToolByName from Products.Five.browser import BrowserView import urllib class ImageView(BrowserView): def __init__(self, context, request): self.context = context self.request = request def tag(self, **kwargs): """ tag """ return self.context.getField('image').tag(self.context , **kwargs) def getImageSize(self, scale=None): """ image size """ field = self.context.getField('image') return field.getSize(self.context,scale=scale) def hasImage(self): """ image size """ field = self.context.getField('image') return field.get_size(self.context) #. Anschließend wird noch der ``FullscreenView`` in ``browser/registration.py`` angegeben:: ... class FullscreenView(BrowserView): """ """ __call__ = ViewPageTemplateFile('fullscreen_view.pt') #. Nun kopieren wir uns das PageTemplate ``parts/plone/CMFPlone/skins/plone_content/image_view_fullscreen.pt`` in ``src/vs.registration/vs/registration/browser/`` und ändern es folgendermaßen ab:: ... #. Schließlich ergänzen wir auch noch ``browser/registration.pt``:: ...

Click to view full-size image…