You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Will Glass-Husain (JIRA)" <de...@velocity.apache.org> on 2008/07/14 01:19:31 UTC

[jira] Commented: (VELOCITY-600) #foreach & velocityCount

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

Will Glass-Husain commented on VELOCITY-600:
--------------------------------------------

Cool patch.  Note: we need to update the user guide docs (in velocity/docs project) before closing this.

> #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, 1.6
>
>         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: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org