[ 
https://issues.apache.org/jira/browse/VELOCITY-600?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12603879#action_12603879
 ] 

Christopher Schultz commented on VELOCITY-600:
----------------------------------------------

While we're on the topic, I've never known how to access the count for an outer 
loop. Something like:

#foreach($foo in $foos)
   #foreach($bar in $bars)
       Looking at \$bars[$velocityCount] in \$foos[$outerVelocityCount]
   #end
#end

AFAIK, there's no way to get the "outer" count inside the loop unless you 
explicitly set a variable. Would this be useful at all?

I'm inclined to agree with Nathan that a tool is the answer because this 
capability is not entirely necessary and adds overhead (albeit negligible). 
Tools are configurable at runtime and therefore are only available if your 
application actually needs them. Just my opinion FWIW.

> #foreach & velocityCount
> ------------------------
>
>                 Key: VELOCITY-600
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-600
>             Project: Velocity
>          Issue Type: Improvement
>          Components: Engine
>            Reporter: Adrian Tarau
>            Priority: Minor
>             Fix For: 1.5.1
>
>         Attachments: VELOCITY-600.patch
>
>
> velocityCount = Used in the #foreach() directive, defines the string to be 
> used as the context key for the loop count. A template would access the loop 
> count as $velocityCount.
> Knowing current version of the loop counter is very  useful, but something is 
> missing. Very often, when you generate some content base on a 
> model(JavaScript code based on some UI model) you have the need to know if 
> this is the last time when the #foreach block will be executed or not. 
> Example
> You have a collection of objects Property(bean with key, value fields) and 
> you want to generate a JavaScript object with them. The result should be like 
> this :
> {id : 1 , name = "John", ...}
> you can generate this with
> {
> #foreach($property in $properties)
>    $property.key : "$property.value" #if($velocityCount != 
> $properties.size()) , #end
> #end
> }
> You can store $properties.size() of course outside the loop.
> The template will be less verbose if I will have something like that. 
> #if($velocityHasNext) , #end.
> Instead of saving only the counter, a new variable called velocityHasNext 
> whould be populated with the result of iterator.hasNext(). This is a minor 
> modification of current #foreach directive
> while (!maxNbrLoopsExceeded && i.hasNext())
>         {
>             // TODO: JDK 1.4+ -> valueOf()
>             context.localPut(counterName , new Integer(counter));
>             context.localPut(hasNextName , i.hasNext()); <--- here is the 
> change
>             Object value = i.next();
>             context.localPut(elementKey, value);
>             /*
>              * If the value is null, use the special null holder context
>              */
>             if( value == null )
>             {
>                 if( nullHolderContext == null )
>                 {
>                     // lazy instantiation
>                     nullHolderContext = new NullHolderContext(elementKey, 
> context);
>                 }
>                 node.jjtGetChild(3).render(nullHolderContext, writer);
>             }
>             else
>             {
>                 node.jjtGetChild(3).render(context, writer);
>             }
>             counter++;
>             // Determine whether we're allowed to continue looping.
>             // ASSUMPTION: counterInitialValue is not negative!
>             maxNbrLoopsExceeded = (counter - counterInitialValue) >= 
> maxNbrLoops;
>         }
> also init should contain
> public void init(RuntimeServices rs, InternalContextAdapter context, Node 
> node)
>         throws TemplateInitException
>     {
>         super.init(rs, context, node);
>         counterName = rsvc.getString(RuntimeConstants.COUNTER_NAME);
>         hasNextName = rsvc.getString(RuntimeConstants.HAS_NEXT_NAME);
>         counterInitialValue = 
> rsvc.getInt(RuntimeConstants.COUNTER_INITIAL_VALUE);
>        ....
>     }
> This should help creating clear templates(and avoid some mistakes, sometime - 
> like using the wrong collection to test :) ).
> Thanks.
>  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to