[Zope-dev] ZSQL methods lookup vars in REQUEST only (why?)

Casey Duncan c.duncan@nlada.org
Thu, 11 Oct 2001 09:12:45 -0400


On Thursday 11 October 2001 07:29 am, you wrote:
> I've been asked too many times now by developers what is wrong when they
> call ZSQL Methods without passing parameters because their parameters
> are in the namespace.  This seems to make sense to all new Zopers (and
> some older ones like myself) because all other DTML lookups are in the
> entire namespace.

You can do this now by passing the namespace as an argument to the ZSQL 
method:

<dtml-call expr="ZSQLMethod(_)">

Which works because ZSQL methods expect their first positionak argument to be 
a mapping object. If it is omitted, it uses REQUEST.

Granted this is not the prettiest, but DTML isn't known for it asthetics 8^)
>
> Anyway, I propose that ZSQLMethods change and do variable lookups in the
> entire namespace, not just the REQUEST object.  It seems to be a simple
> enough change (at least it looks it) and I can submit the patches, but
> the harder thing is to get people to agree that it is a change for the
> better.

Yes this would be a simple change. And it would break nearly every existing 
Zope application that uses ZSQL methods. Think of how many people use "id" as 
a field name in their tables...

> The only argument that I have heard against it is that variables will be
> found mysteriously through the stack and that this is harder to
> understand.  However, that just makes it inconsistent with all other
> DTML and therefore mysterious in its own way.

Actually this behavior has a parallel. ZCatalogs work the same way. By 
default they only check the REQUEST object for search arguments.

That's not to say I like it. It makes necessary one of the most lothesome 
DTML statements: <dtml-call expr="REQUEST.set('foo',bar)">

> Consistency is much better for learning and for remembering, and DTML in
> ZSQL should work the same as DTML in DTML Methods, etc.  Please consider
> this and abuse me as appropriate ;)
>
> Regards,
> Tim

I agree with you in principle, but I think that calling stuff from DTML will 
never be made intuitive. I do think much of the time (although certainly not 
all) ZSQL arguments are coming from REQUEST. So, assuming this is patched, it 
would necessitate things like:

<dtml-with name="REQUEST"><dtml-call name="ZSQLMethod"></dtml-with>

or

<dtml-call expr="ZSQLMethod(REQUEST)">

for the majority of cases to make sure things come from REQUEST. This I think 
just trades one work-around for another...

Actually I think calling DTML from DTML sucks rocks <dtml-call 
expr="DTMLMethod(_.None,_)"> anyone?

/---------------------------------------------------\
  Casey Duncan, Sr. Web Developer
  National Legal Aid and Defender Association
  c.duncan@nlada.org
\---------------------------------------------------/