[Zope] seq-items and nested dtml-ins

Tres Seaver tseaver@palladion.com
Wed, 24 May 2000 21:51:25 -0400


Aaron Payne <aaron@aaronpayne.com>
>
> How do you differentiate between the seq-items of nested dtml-ins?
> 
> I tried the following code:
> 
> <dtml-in "instances.objectValues(['Coupon ZClass'])">
> 
> <dtml-in SearchCategory>
>    <dtml-if "_['sequence-item']=='Auto' ">
>     <dtml-call "resultsList.append(_['sequence-item'])">
>    </dtml-if>
> </dtml-in end SearchCategory>
> 
> </dtml-in end instances>
> 
> Where:
> instances is a folder containing the coupon instances
> Coupon ZClass is the meta type of the zclass
> SearchCategory is a list from a form
> resultsList is a list containing instances of Coupon ZClass matching the
> search criteria
> Auto is a property of Coupon ZClass
> 
> When I try to run a search an error page pops up saying "strings aren't
> allowed as input in the in tag."
>
> The property Category of the zclass is the type lines.  "Auto' is one of
> the values in Category.
> In <dtml-if "_['sequence-item']=='Auto' "> I am comparing the current
> element of SearchCategory to one of the values in Category.

Your code to deal with SearchCategory looks OK to my.  Try a couple of
things:

 * Try dumping the REQUEST variable (e.g., '<dtml-var REQUEST>' in your
   form handler) and make sure that the SearchCategory is actally a
   list.

 * Make sure you leverage the ZPublisher marshalling machinery to force
   SearchCategory to be converted to a list, even if the user selects
   only one item, e.g.::

     <select name="SearchCategory:list" multiple>
                                 ^^^^^
   on your form.

> In <dtml-call resultsList...> I want to append the instance and not
> SearchCategory list.

For the moment, you need to alias the "outer" sequence item, because
the "inner" one hides it (by that name). So, in your case::

 <dtml-in "instances.objectValues(['Coupon ZClass'])">

 <dtml-let coupon=sequence-item> <!-- aliasing -->

 <dtml-in SearchCategory>
    <dtml-if "_['sequence-item']=='Auto' ">
     <dtml-call "resultsList.append(coupon)">
                                    ^^^^^^
    </dtml-if>
 </dtml-in end SearchCategory>
 </dtml-let>
 </dtml-in end instances>

Real Soon Now, you will be able to declare the alias for the sequence
variable within the <dtml-in> tag itself, which would solve your
problem nicely.  For the details, see:

  http://www.zope.org/Members/4am/DTMLWiki/NamedDTMLInLoop

Hope this helps!

Tres.
-- 
===========================================================
Tres Seaver                            tseaver@digicool.com
Digital Creations    "Zope Dealers"    http://www.zope.org