Jerry.Spicklemire@IFLYATA.COM wrote:
Jeff Hoffman suggested the following code, that's quite a bit cleaner than what I came up with, and it also works quite well.
<dtml-call "REQUEST.set('z_t', _.string.split(_.str(ZopeTime()))[0])"> <dtml-call "REQUEST.set('u_all', 0)"> <dtml-call "REQUEST.set('u_logged', 0)"> <dtml-call "REQUEST.set('u_today', 0)"> <dtml-call "REQUEST.set('u_not', 0)">
<dtml-var u_all> <dtml-var u_logged> <dtml-var u_today><br>
<dtml-in count_users_logged> <dtml-call "REQUEST.set('u_all', u_all + 1)"> <dtml-if logged_on> <dtml-call "REQUEST.set('u_logged', u_logged + 1)"> <dtml-if "_['z_t']==_.string.split(_.str(_.DateTime(logged_on)))[0]"> <dtml-call "REQUEST.set('u_today', u_today + 1)"> </dtml-if> <dtml-else> <dtml-call "REQUEST.set('u_not', u_not + 1)"> </dtml-if> </dtml-in>
I'm a bit mystified that the only detectable difference between this version and *many* that I tried without success looks to be the spaces between objects and keywords in expressions, along with the complete absence of <dtml-let>.
e.g <dtml-call "REQUEST.set('u_logged', u_logged + 1)">
vs. <dtml-call "REQUEST.set('u_logged',u_logged+1)">
I've looked at lot's of code samples that have no spaces, and have seen enough error messages to think very hard about random spaces in expressions. This is a good example of how code lore (superstition) gets proliferated, but it's hard to argue with working examples.
Thanks again, to Jeff, Jim, Pavlos, et. al.
As the giant says to the Sicilian, "I don't think that word means what you think it means," or in this case, that tag. The <dtml-let> tag is really just syntactic sugar for <dtml-with "_.namespace( ..." )> -- it constructs a new, *readonly* namespace, populated with the values you supply in the tag's attributes, and pushes that namespace on top of the DTML namespace stack. This new namespace softly and silently vanishes away at the </dtml-in>, leaving no trace that it ever existed. You should also be aware that this let namespace interacts oddly with calls to other DTML methods -- in fact, I haven't quite figured out how to make them play nice together. Phil Eby, who contributed the let tag, has an extension, <dtml-set>, which allows for replacing values in the let namespace -- this extension has not been accepted into the Zope core, however, as it was held to facilitate "DTML abusee". So, <dtml-call "REQUEST.set( 'varname', newValue )"> is your best bet for having values last through the end of your method (or <dtml-call "REQUEST.other.update( sourceDictionary )"> for the truly dedicated). -- ========================================================= Tres Seaver tseaver@palladion.com 713-523-6582 Palladion Software http://www.palladion.com