[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/