[Zope-dev] Acquisition by context first
Steve Alexander
steve@cat-box.net
Fri, 15 Sep 2000 12:40:37 +0100
Here's an external method that ought to work. Well, it works for me:
# acquire the object of name "attr" by context alone
def aquire_by_context(self, attr):
ob = self
while hasattr(ob, 'aq_base'):
aq_b=getattr(ob, 'aq_base', ob)
if hasattr(aq_b, attr):
attr_obj = getattr(aq_b, attr)
break;
ob = ob.aq_parent
else:
# not found
raise KeyError, attr
return self.restrictedTraverse(attr_obj.getPhysicalPath())
This should be secure, because I'm using restrictedTraverse.
Use in DTML like this:
<dtml-var standard_html_header>
<br>
<h2>Context</h2>
<dtml-var "acquire_by_context(this(), 'O')">
<br>
<dtml-var standard_html_footer>
Assuming that you called the external method "acquire_by_context".
Here, I'm assuming that you have objects like this:
some_folder
A
C
B
O contains the string "some_folder->B->O"
O contains the string "some_folder->O"
aq dtml method containing the dtml above
Typing into your browser the URL .../some_folder/A/aq will get you
some_folder->O
Typing into your browser the URL .../some_folder/B/A/aq will get you
some_folder->B->O
To verify this against normal acquisition, use this DTML:
<dtml-var standard_html_header>
<br>
<h2>Context</h2>
<dtml-var "a_context(this(), 'O')">
<br>
<h2>Normal</h2>
<dtml-var O>
<dtml-var standard_html_footer>
--
Steve Alexander
Software Engineer
Cat-Box limited
http://www.cat-box.net