On Tue, Jun 7, 2011 at 5:30 AM, Scott Gentry <[email protected]> wrote: > Thanks Nathan, that did the trick.
:) > We do have the context tool installed, so while I can pull the values out of > the context easily, I don't know if it makes sense in this instance. > Wouldn't I need to introspect the class of preferences (and mark all of my > fields as public) or place each value of the preferences onto the context to > pull them that way? ?? sorry, i had a rough night and can't really figure out what you mean here. > Perhaps I'm still missing something? I don't know. If it already works, what else do you need? > On Jun 6, 2011 2:58 PM, "Nathan Bubna" <[email protected]> wrote: >> Remember, Velocity is a template engine for rendering strings, it's >> not a scripting language. So things get ugly when you are >> scripting-ish stuff. #evaluate does not "return" any values, it >> renders the string sent for evaluation. You can use it to do what you >> want by embedding a #set into the string you are having #evaluate >> render. Also, remember that double quoted strings are interpolated >> (#set($d="$") is a syntax error) and single quoted ones (#set($d='$') >> is ok) are not. >> >> #for ($panel in $Panels) >> #set($selectName = ${panel.CamelCase}+'SortColumn' ) ## The names here are >> correct >> #set($dynamicProperty = '$preferences.'+$selectName) >> <tr> >> <td>$panel</td> >> <td> >> <select name=”$selectName”> >> #for($option in $OrderByColumn) >> #evaluate( '#set( $preferred = '+$dynamicProperty+' )' ) >> <option value=”$option” #if($option == $preferred) >> selected=”selected” #end>$option</option> >> #end >> </td> >> </tr> >> #end >> >> However, it would probably be cleaner to put the context into itself: >> context.put("context", context) >> Then you can do it like this: >> >> #for ($panel in $Panels) >> #set($selectName = ${panel.CamelCase}+'SortColumn' ) ## The names here are >> correct >> #set($dynamicProperty = '$preferences.'+$selectName) >> <tr> >> <td>$panel</td> >> <td> >> <select name=”$selectName”> >> #for($option in $OrderByColumn) >> <option value=”$option” #if($option == >> $context.get($dynamicProperty)) selected=”selected” >> #end>$option</option> >> #end >> </td> >> </tr> >> #end >> >> Which should perform better than using #evaluate. >> >> >> On Mon, Jun 6, 2011 at 11:35 AM, Scott Gentry <[email protected]> wrote: >>> Is it possible to dynamically access properties by using #evaluate? I >>> apologize in advance for the length, but most of this is just example > code >>> to fully illustrate my issue. >>> >>> I have a preferences class which looks like this: >>> >>> public class DefaultUserPreferences implements Preferences { >>> //Getters and setters left off for “brevity…” >>> private Panel defaultPanel; >>> private OrderByColumn mostActiveSortOrder; >>> private OrderByColumn recentlyModifiedAccountsSortColumn; >>> } >>> >>> Each of these types are simply a custom enum. >>> >>> public enum OrderByColumn { >>> NAME, >>> LAST_ACTIVITY, >>> GROUP >>> } >>> >>> public enum Panel { >>> MOST_ACTIVE, >>> RECENTLY_MODIFIED; >>> >>> public String getCamelCase() { >>> String[] words = StringUtils.split(this.name(), “_”); >>> String rval = StringUtils.EMPTY; >>> if (words != null && words.length >= 1) { >>> rval = StringUtils.lowerCase(words[0]); >>> for(int i = 1; I < words.length; i++) { >>> rval += StringUtils.capitalize(words[i].toLowerCase()); >>> } >>> } >>> return rval; >>> } >>> } >>> >>> Below is a snippet of how I’d like to display the preferences to the > users, >>> but I can’t seem to get the getter to be called (I get the following if I >>> evaluate it to get text: >>> > test.core.model.entities.DefaultUserPreferences@596fde80.mostActiveSortOrder >>> ) >>> >>> #for ($panel in $Panels) >>> #set($selectName = ${panel.CamelCase}SortColumn) ## The names here are >>> correct >>> #set($dynamicProperty = $preferences.$selectName) >>> <tr> >>> <td>$panel</td> >>> <td> >>> <select name=”$selectName”> >>> #for($option in $OrderByColumn) >>> <option value=”$option” #if($option == >>> #evaluate($dynamicProperty) selected=”selected” #end>$option</option> >>> #end >>> </td> >>> </tr> >>> #end >>> >>> However my getter never seems to be called on the preferences. I’ve > added >>> each of the pieces to the Context, and am not having any issues iterating >>> over the Panels, I just can’t seem to get the syntax down to dynamically >>> call the getters on properties. Is this possible in 1.7? >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
