When stating which icon to use for a python product you do that like this in __init__.py icon="event.gif"
But what about subclasses which are object on their own? They don't use the initialize() method.
I have tried:
class SubClassObject(ObjectManager, etc): meta_type='Event' icon='event.gif'
where event.gif is a valid gif next to the .py file I write this in. That didn't work!
So, I have also tried:
icon="misc_/MyProduct/event.gif" and icon="misc_/MyProduct/event" and icon="/misc_/MyProduct/event.gif" and icon="/misc_/MyProduct/event"
Nothing has worked? Zope 2.4.0 What's the trick?
[ Brian's product development tip-o-the-day :) ] Sorry for the long inclusion above, but I thought it will be useful one day to have the context when someone searches the mailing list for the answer to this... The "normal" way that icons get associated with classes is somewhat opaque: (in an __init__.py): context.registerClass( instance_class = MyModule.MyClass, meta_type = 'My Object', permission = 'Add My Objects', constructors = MyModule.constructors, icon = 'www/MyClass.gif' ) The 'registerClass' helper automatically sets up your icon. It can do that because it gets and / or knows: o the class object o the relative path to the file you want to use for the icon ('www/MyClass.gif') o the package that is being registered So what it does is: o creates an ImageFile object (the ImageFile class is located in the App.ImageFile module) o adds the ImageFile instance to a special place where miscellanous static web-accessible resources for use by products are kept o adds an 'icon' attribute to the class being registered whose value is the url to the ImageFile instance This is the 'misc_' funny business you see in icon urls. The 'misc_' object is a child of the root Zope object. When a product is initialized, a generic container is created in misc_, named after the product being initialized. registerClass does a setattr on the generic container for the product, making the ImageFile instance available through traversal as /misc_/ProductName/filename. (Note that these things are set as class attributes rather than instance attributes, so they are not persistent and go away at shutdown, and are rebuilt at the next startup). So... to set up an icon for an object that is not registered using registerClass, we just need to change the __init__.py to create ImageFiles for the extra icons we need, add those ImageFile instances to the container for our product in misc_, and add appropriate 'icon' attributes to our classes whose values are url paths to the appropriate ImageFiles. (in __init__.py) def initialize(context): # standard registration for MyClass, which is a normal # through-the-web creatable object. Note that after # registering MyClass, we call our registerIcon helper # function to register icons for MyOtherClass1 and MyOtherClass2, # which are not directly registered using registerClass. context.registerClass( instance_class = MyModule.MyClass, meta_type = 'My Object', permission = 'Add My Objects', constructors = MyModule.constructors, icon = 'www/MyClass.gif' ) registerIcon('MyOtherClass1.gif') registerIcon('MyOtherClass2.gif') import OFS, App def registerIcon(filename): # A helper function that takes an image filename (assumed # to live in a 'www' subdirectory of this package). It # creates an ImageFile instance and adds it as an attribute # of misc_.MyPackage of the zope application object (note # that misc_.MyPackage has already been created by the product # initialization machinery by the time registerIcon is called). setattr(OFS.misc_.misc_.MyPackage, filename, App.ImageFile.ImageFile('www/%s' % filename, globals()) ) Now we just need to add 'icon' attributes to our 'Other' classes: (in MyModule.py) class MyOtherClass1: icon = 'misc_/MyProduct/MyOtherClass1.gif' ... class MyOtherClass2: icon = 'misc_/MyProduct/MyOtherClass2.gif' ... Hope this helps! Brian Lloyd brian@zope.com Software Engineer 540.361.1716 Zope Corporation http://www.zope.com