Home Company Services Portfolio Contact us nav spacer

Schema extender for a specific browser layer

by hedley posted on Jun 22, 2009 11:25 PM last modified Jul 03, 2009 09:06 PM

archetypes.schemaextender is currently a bit light on documentation so I created this example of a schema extender that extends a schema for only a single browser layer.

Our class extender.py. Note the required layer attribute.

from zope.component import adapts
from zope.interface import implements

from archetypes.schemaextender.interfaces import \
    IBrowserLayerAwareExtender, IOrderableSchemaExtender    
from archetypes.schemaextender.field import ExtensionField
from Products.Archetypes.atapi import *
from Products.ATContentTypes.content.document import \
    ATDocument

from myproduct.themebrowser.interfaces import IThemeSpecific

class efStringField(ExtensionField, StringField):
    pass

class DocumentExtender(object):
    adapts(ATDocument)
    implements(IOrderableSchemaExtender, 
        IBrowserLayerAwareExtender)
    layer = IThemeSpecific

    fields = ( 
    efStringField(name='skinString',
            widget=StringField._properties['widget'](
                label="Skin String",
            ),
        ),
    )

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

    def getFields(self):
        return self.fields

    def getOrder(self, original):
            return original

ZCML snippet

<include package="archetypes.schemaextender" />  

<adapter 
  factory="myproduct.theme.extender.DocumentExtender" 
  for="Products.ATContentTypes.content.document.ATDocument" 
  provides="archetypes.schemaextender.interfaces.IOrderableSchemaExtender"    
  name="document-extender"/>

browserlayer.xml for GenericSetup profile

<?xml version="1.0"?>
<layers>
  <layer name="myproduct.theme"
         interface="myproduct.theme.browser.interfaces.IThemeSpecific" />
</layers>