[Zope] Help save my sanity (DTML-in string comparison)

Martijn Pieters mj@digicool.com
Tue, 19 Dec 2000 22:23:43 +0100


On Tue, Dec 19, 2000 at 09:57:31PM +0100, Dieter Maurer wrote:
> Darin Lee writes:
>  > ... comparisons involving "id" do not work ...
> "id" is particularly difficult in DTML.
> 
> For some objects, "id" is an attribute (a string),
> for others, it is a method.
> 
> Due to Zope's acquisition magic, it is difficult
> to compare method's to one another:
> the "same" method compare different, if accessed on different
> access paths.
> 
> Thus, you want to work with strings only.
> The problem is: DTML does not let you test for types.
> 
> You can do something like this:
> 
>     <dtml-with your_object>
>       <dtml-let id_name=id> <!-- now: "id_name" contains a string -->
>         <dtml-call "REQUEST.set('id_name',id_name)>
>       </dtml-let>
>     </dtml-with>

Or you could use "_['id']" in place of "id". Which does exactly the same
as the let tag does in the above statement, ie a lookup in the namespace
and then calling it if it is a method. Example:

  <dtml-with your_object>
    <dtml-call "REQUEST.set('id_name', _['id'])">
  </dtml-with>

This kind of hoopjumping is exactly why in Zope 2.3 you now can use the
method 'getId()', which will hide the confusion for you. From Zope 2.3
onwards, *always* use getId():

  <dtml-with your_object>
    <dtml-call "REQUEST.set('id_name', getId())">
  </dtml-with>

or:

  <dtml-call "REQUEST.set('id_name', your_object.getId())">

-- 
Martijn Pieters
| Software Engineer  mailto:mj@digicool.com
| Digital Creations  http://www.digicool.com/
| Creators of Zope   http://www.zope.org/
---------------------------------------------