[Zope] Products vs. ZClasses- Design Question
Jeff Hoffman
jeff.hoffman@goingv.com
Sun, 18 Jun 2000 22:35:11 -0400 (EDT)
On Fri, 16 Jun 2000, Charlie Derr wrote:
> Jeff wrote:
>
> ~ As explained above, this advantage is shared by Python Products also. You
> ~ do *not* want to write application logic with DTML. At a minimum, use
> ~ Python Methods. Otherwise, use Python.
> ~
>
> Let me apologize in advance because i think this is going to turn out to be
> a really stupid question. I'm never gonna know the answer if i don't ask it
> though. :-\
>
> I've seen this mentioned a lot (advice not to write application logic in
> DTML). If one wants to use pure python (and not Products and not external
> methods) to create complex actions/relationships, then where does one place
> this code? Obviously i can litter my DTML with python expressions, but this
> seems to be what is being recommended against strongly. Is there a way to
> use python "correctly" without writing a product and without encapsulating
> it in an external method?
You have two choices:
1) Use PythonMethods, found at:
http://www.zope.org/Members/4am/PythonMethod
These work like DTML Methods, only you write them in Python. They are
relatively safe, also.
2) Create a base class in Python, register it with Zope as a ZClass
Base, and specify it as a parent class to your ZClass.
i.e.:
FILE: TestBase.py
-----------------
class TestBase:
"""My ZClass Base class."""
def __init__(self):
self.foo = 'Foo'
def getFoo(self):
return self.foo
def setFoo(self, value):
self.foo = value
def initialize(context):
context.registerBaseClass(TestBase)
FILE: __init__.py
-----------------
import TestBase
def initialize(context):
TestBase.initialize(context)
Put these two files in your lib/python/Products/TestBase directory.
Then, restart your Zope.
Now, add a new product called Test. Inside it, create a ZClass called
'Test' with a meta-type of 'Test'. Specify TestBase as the base
class.
Inside the Test ZClass, create a DTML Method called index_html. Give
it the following contents:
<dtml-var standard_html_header>
<P>
Initial foo: <dtml-var getFoo>
</P>
<P>
<dtml-call expr="setFoo('Hello, world.')
New foo: <dtml-var getFoo>
</P>
<dtml-var standard_html_footer>
Create an instance of the Test ZClass, and view its index_html.
Voila.
Hope this helps,
> tesmia,
> ~c
--Jeff
---
Jeff K. Hoffman 704.849.0731 x108
Chief Technology Officer mailto:jeff.hoffman@goingv.com
Going Virtual, L.L.C. http://www.goingv.com/