[Zope-dev] 'Subclassing' another product
Steve Spicklemire
steve@spvi.com
Wed, 20 Dec 2000 00:44:23 -0500 (EST)
Hi Morten,
There are two ways to subclass products. You can use straightforward
Python subclassing:
e.g.,In your custom Product.. here is an example from Zwiff:
> import Products.PythonMethod.Guarded
>
> from Globals import HTMLFile, MessageDialog
> from App import Common
>
> manage_addZwiffForm = HTMLFile('addForm',globals())
>
> def manage_addZwiff(self, id, title, params, body, REQUEST=None):
> """Add A Zwiff to a folder .... just like PythonMethod..
> """
> it = Zwiff(id, title, params, body)
> self._setObject(id, it)
> return self.manage_main(self, REQUEST)
>
> def handleMovieOutput(movie, RESPONSE):
>
> fname = tempfile.mktemp()
>
> movie.save(fname)
>
> f = open(fname)
> s = f.read()
> f.close()
>
> RESPONSE.setHeader('Content-type', 'application/x-shockwave-flash')
>
> os.remove(fname)
>
> return s
>
> class Zwiff (Products.PythonMethod.PythonMethod.PythonMethod ):
>
> meta_type = 'Zwiff'
>
> def makeFunction(self, compile=0):
> from Products.PythonMethod.Guarded import GuardedBlock, safefuncs, theGuard
> if compile:
> self._checkCBlock(GuardedBlock)
> if self.errors:
> raise "Python Method Error", string.join(self.errors, '\n')
> return self._newfun(compile, {'$guard': theGuard},
> __builtins__=mysafebin, _=safefuncs)
>
>
So the class Zwiff is a subclass of PythonMethod. Look at Zwiff for the full
source: http://www.zope.org/Members/sspickle/Zwiff
Or you can create a ZClass that subclasses from a 'base class'. To do
this you've got to register the base class with the ZClass machinery
(e.g., here is the code for ZCVSMixin that does this.... ZCVSMixin
is a base class... CVSFolder is a full blown product that happens
to be a subclass of ZCVSMixin... )
>
>
> import ZCVSMixin
> import CVSFolder
>
> __doc__ = ZCVSMixin.__doc__
> __version__ = ZCVSMixin.__version__
>
> def initialize(context):
> context.registerClass(
> CVSFolder.CVSFolder,
> constructors=(CVSFolder.manage_addCVSFolderForm,
> CVSFolder.manage_addCVSFolder),
> icon='fish.gif',
> )
> context.registerBaseClass(ZCVSMixin.ZCVSMixin)
>
does that help?
take care,
-steve