(Peter, this is the wrong list for questions concerning how to *use*
Zope. Please write to zope3-users in the future.)
Peter Füreder wrote:
We are trying to implement a dynamic tree with zope.app.tree.
We want to fetch a list of objects from a database and display them [as
a link for example].
When this object is selected, we want to fetch the children an display them.
We haven't been able to find any example save the browser/cookie.py of
the zope menu which seems to use a static tree implementation.
It also relies on the fact that the displayed objects are persistent in
The example implementation is indeed geared towards the ZODB,
zope.app.tree is completely storage agnostic, though. In fact, it was
originally developed for an SQL-based storage.
If we had to prefetch all the potentially displayed objects for the 5
levels we wish to traverse, it could lead to truely many objects.
You don't have to. zope.app.tree will only fetch the sub-objects of
*expanded* nodes. If nodes aren't expanded, it won't even look at them.
We've tried to implement adaptors for the IChildObjects interface but we
are not sure how to tie them into the system.
Using ZCML, like any other component:
<adapter factory="path.to.adapter.TheAdapter" />
But maybe that's the wrong approach anyway.
It is the right approach.
Basically, you'll have to do two things:
* Implement the IUniqueId adapter for any object that may end up in the
* Implement the IChildObjects adapter for any object that may have
* Pick some root object and create the root node:
root_node = Node(root_obj, expanded_nodes, filter)
where expanded_nodes is a list of unique ids of nodes that should be
expanded by default and filter is an optional filter object.
You probably also want to expand the root node by default:
Then you can construct the tree in a ZPT by iterating over the root's
child nodes. See the INode interface for the whole API.
http://worldcookery.com -- Professional Zope documentation and training
Zope3-dev mailing list