Brad Allen wrote:

At 11:48 AM +0100 12/1/05, Johan Carlsson wrote:

To access an object in the ZODB you need to have a context
(that is a pointer to a object stored in ZODB, it almost alway is but
in some situations it's not! I've learned that the hard way).

If your in a browser class you will have the context of the object
traversed as an instance attribute (self.context).

Ok, this helps, although I'm not completely clear on how context
objects are generated.

If you really what too know you should read "The life of a Request".

Or you can just trust me ;-)

From a newbie perspective, the context
object is an elusive beast.  It's not really explained anywhere
that I could find. The Zope 3 Developer's Guide. There's a little
section called "The context Variable" in the ZCML chapter, but
that doesn't explain where the context comes from or what it is.

I've seen how the context object is used in TAL, but have always
understood it to be the local URL context.

Yes that's what it is most of the time, only when you have
view classes (IView) that call each other, for instance
when you use special kind of fields.

Here's the interfaces that define a view:

class IContextDependent(Interface):
    """Components implementing this interface must have a
    context component.

    Usually the context must be one of the arguments of the
    constructor. Adapters and views are a primary example of
    context-dependent components.

    context = Attribute(
        """The context of the object

        This is the object being adapted, viewed, extended, etc.

class IPresentation(Interface):
    """Presentation components provide interfaces to external actors

    The are created for requests, which encapsulate external actors,
    connections, etc.

    request = Attribute(
        """The request

        The request is a surrogate for the user. It also provides the
        presentation type and skin. It is of type

So as you see it's not only view that have the context, but adapters too, well infact view are adapters now day :-)

There were some examples of using self.context in the MessageBoard
tutorial. For instance, below is an excerpt from page 114.
The self.context is used in a mysterious way here. Nothing in
the class definition binds it. It has no base class. I guess I should
expect a child class, or a factory maybe to add the self.context
when the class get instantiated. However, I had trouble finding that
anywhere in the SVN copy of the MessageBoard tutorial (step 13).

Well, it gets bind when adapted and in this example it occurs
when the object is traversed and it's view is looked up.

I think it gets registered with a view class in ZCML
which turns it in to a browser view

I can agree with you that it's kind of mysterious and implicit,
in fact I think it's a consequence of the aspect-origentation.
(What ever happend to "explicit is better than implicit" ;-)

In some other example MessageBoard classes, context is used
as an init parameter. The doctest examples indicate that
context can be a simple container object, not necessarily something
in ZODB. I guess this makes sense.

Exactly, from above: "context - The context of the object
This is the object being adapted, viewed, extended, etc."

As it always have been with Zope, the source code is the best way
to understand how it works. Unfortunatelly is the Z3 source
extremely co-located, but still it's very useful to learn to find
ones way in it. After over 6 months hard studying I'm starting
to find my way round the source :-)

Here's some tips:

- ZCML is as much part of the code as anything else, so try to
learn how to find the code behind the ZCML statement.
Specially high level things like ContainerView, AddViews, and
EditView etc.

Ah, can think of any thing else at the moment. I have to give you a rain-check on that :-)



Johan Carlsson          Tel: + 46 8 31 24 94
Colliberty              Mob: + 46 70 558 25 24
Torsgatan 72            Email: [EMAIL PROTECTED]
Zope3-users mailing list

Reply via email to