22

I am trying to figure out how to return a value from a velocity macro call and assign it to a varaible

my macro function looks something like this. its once in common shared macros files

#macro(getBookListLink, $readingTrackerResult)
   $readingTrackerResult.getBookListLink()
#end

I am need to assign the result of this macro to a variable in another velocity template file

I tried something like this

#set($book_list_link = #getBookListLink( $readingTrackerResult ))

but did not work. I tried with #,$ and with nothing in front of function getBookListLink. but nothing worked. Can not i return from a macro? something wrong with my macro?

But, As such if i call #getBookListLink( $readingTrackerResult ) separately in html file. it works and i can print the result to UI. But not able to assign to a variable.

  • I have a problem with extra spaces when I do this call. Sadly, even using the trick with comments (`##`), in the end of line, not worked. – Dherik Aug 03 '15 at 16:47

6 Answers6

32

Macros are not functions; they are for rendering output. However, if you don't mind losing the type and getting the result as text...

#set( $book_list_link = "#getBookListLink( $readingTrackerResult )" )
fireshadow52
  • 6,298
  • 2
  • 30
  • 46
Nathan Bubna
  • 6,823
  • 2
  • 35
  • 36
  • 3
    In case, if the function expects a string argument, then we need to use as follows: `#set( $book_list_link = "#getBookListLink('string_argument')" )` – Paramesh Korrakuti Sep 21 '16 at 13:07
7

To get rid of spaces and blank lines use multi-line comments (#* comment *#):

#macro( myMacro $param )#*
  *#the_return_value#*
*##end
3

Instead of living with the string limitations for 'return values', preferably an externally defined result variable can be passed 'by reference', e.g.:

#macro(getBookListLink $inTrackerResult $outBookListLink)
    #if ($outBookListLink)
        #set ($outBookListLink = $inTrackerResult.getBookListLink())
    #end
#end

#set ($myLink = "")
#getBookListLink($myTrackerResult $myLink)
myBookListLink = "$myLink"<br/>
Steffen
  • 31
  • 1
  • Weird. This doesn't work for me. On the other hand if I do `#set($discard = $outBookListLink.put("returnKey", myReturnObject))` and then access it from outside, it works. – KulaGGin Dec 08 '22 at 17:39
1

Just another example to illustrate the principle :

Macro definition :

#macro ( getValue $flag )
#if ( $flag )
#set($value = "TRUE" )
#else
#set($value = "FALSE" )
#end
${value}## (ends with a comment to avoid "END-OF-LINE" in the resulting string)
#end

Call :

#set($myval = "#getValue( true )" )
lgu
  • 2,342
  • 21
  • 29
0

A macro parameter can be a list of objects. The called macro can extract each object from the list, manipulate it, and then the caller will see the changes.

#macro(call $something)
  #set($swallowOutput = $something)
#end

#macro(doSomething $out)
  #set($list=$out.get(0))
  #call($list.add("hallo-1")
  #call($list.add("hallo-2")
#end

#macro(doMoreComplexStuff)
  #set($myList=[])
  #doSomething([$myList])
  MyList now has $myList.size()) elements: $myList
#end
Axel Heider
  • 557
  • 4
  • 14
-1

Or just write everything onto the same line:

#macro( myMacro $param ) the_return_value #end
Yasin Patel
  • 5,624
  • 8
  • 31
  • 53