General Actions:
Log-in
Wiki:
L3D's Wiki
▼
:
Document Index
»
Space:
XWiki
▼
:
Document Index
»
Page:
LiveTableResultsMacros
Search
Page Actions:
Export
▼
:
Export as PDF
Export as RTF
Export as HTML
More actions
▼
:
Print preview
View Source
Welcome to your wiki
»
XWiki Space
»
Livetable Results Macros
Wiki source code of
Livetable Results Macros
Last modified by
Administrator
on 2011/03/02 17:34
Content
·
Comments
(0)
·
Attachments
(0)
·
History
·
Information
Hide line numbers
1: {{velocity output="false"}} 2: #** 3: * Macro to get the results of a livetable data call. 4: * This page is called from live grids via Ajax with the argument xpage=plain. It returns a 5: * set of results serialized in JSON. 6: *# 7: #macro(gridresult $className $collist) 8: #gridresultwithfilter($className $collist '' '' []) 9: #end 10: 11: 12: 13: #** 14: * Macro to get the results of a livetable data call. 15: * This page is called from live grids via Ajax with the argument xpage=plain. It returns a 16: * set of results serialized in JSON. 17: *# 18: #macro(gridresultwithfilter $className $collist $filterfrom $filterwhere $filterParams) 19: #if("$!{request.xpage}" == 'plain') 20: $response.setContentType('application/json') 21: #end 22: #set($offset = $util.parseInt($request.get('offset'))) 23: ## offset starts from 0 in velocity and 1 in javascript 24: #set($offset = $offset - 1) 25: #if($offset < 0) 26: #set($offset = 0) 27: #end 28: #set($limit = $util.parseInt($request.get('limit'))) 29: #set($tablelist = $util.arrayList) 30: 31: 32: ## 33: ## Compute the query to use for retrieving data 34: ## 35: ## 36: ## additional columns, should *not* contain parameters, all added column names must be filtered 37: #set($fromSql = '') 38: ## parametrized filter part of the query 39: #set($whereSql = '') 40: ## list of parameters to use with $whereSql 41: #set($whereParams = []) 42: #set($class = $xwiki.getDocument($className).getxWikiClass()) 43: 44: ## Exclude Blacklisted spaces ($blacklistedSpaces is set in xwikivars.vm) 45: ## 46: #if($blacklistedSpaces.size() > 0) 47: #set($whereSql = "${whereSql} and doc.space not in (") 48: #foreach ($blacklistedSpace in $blacklistedSpaces) 49: #if($velocityCount > 1)#set ($whereSql = "${whereSql},")#end 50: #set($whereSql = "${whereSql}?") 51: #set($discard = $whereParams.add("$!{blacklistedSpace}")) 52: #end 53: #set($whereSql = "${whereSql})") 54: #end 55: 56: ## Add the columns needed for the actual data 57: ## 58: #foreach($colname in $collist) 59: #livetable_addColumnToQuery($colname) 60: #end 61: 62: ## Tag filtering 63: ## 64: #if($request.tag) 65: #set($fromSql = "${fromSql} , BaseObject as tobject, DBStringListProperty as tagprop") 66: #set($whereSql = "${whereSql} and tobject.className='XWiki.TagClass' and tobject.name=doc.fullName and tobject.id=tagprop.id.id and tagprop.id.name='tags' and (") 67: #foreach($tag in $request.getParameterValues('tag')) 68: #set($tag = $util.decodeURI($tag)) 69: #if($velocityCount > 1) #set($whereSql = "${whereSql} and ") #end 70: #set($whereSql = "${whereSql} ? in elements(tagprop.list)") 71: #set($discard = $whereParams.add("${tag}")) 72: #end 73: #set($whereSql = "${whereSql})") 74: #end 75: 76: ## 77: ## Order 78: ## 79: #set($order = "$!request.sort") 80: #if($order != '') 81: #set($orderDirection = "$!{request.get('dir').toLowerCase()}") 82: #if("$!orderDirection" != '' && "$!orderDirection" != 'asc') 83: #set($orderDirection = 'desc') 84: #end 85: #if($order == 'description') 86: #set($tableAlias = 'dtable') 87: #else 88: #set($tableAlias = $order) 89: #end 90: ## only safe version should be used in SQL queries 91: #set($safe_tableAlias = "$!{tableAlias.replaceAll('[^a-zA-Z0-9_.]','')}") 92: ## 93: #if($order.startsWith('doc.')) 94: #set($orderSql = " order by ${safe_tableAlias.replace('_','.')} ${orderDirection}") 95: #elseif($tablelist.contains($tableAlias)) 96: #set($orderSql = " order by ${safe_tableAlias}.value ${orderDirection}") 97: #elseif($order == 'averagevote') 98: #livetable_getTableName($order) 99: #set($fromSql = "${fromSql}, BaseObject as objratings, ${tableName} ${safe_tableAlias}") 100: #set($whereSql = "${whereSql} and doc.fullName=objratings.name and objratings.className='XWiki.AverageRatingsClass' and objratings.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.name = ?") 101: #set($discard = $whereParams.add("${order}")) 102: #set($orderSql = " order by ${safe_tableAlias}.value ${orderDirection}") 103: #else 104: #set($multiselect = $class.get($order).getProperty('multiSelect').getValue()) 105: #if("$multiselect" != '1') 106: #livetable_getTableName($order) 107: #set($fromSql = "${fromSql}, ${tableName} ${safe_tableAlias}") 108: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.name = ?") 109: #set($discard = $whereParams.add("${order}")) 110: #set($orderSql = " order by ${safe_tableAlias}.value ${orderDirection}") 111: #end 112: #end 113: #end 114: 115: ## 116: ## Compute the final queries 117: ## 118: #set($sqlParams = []) 119: #set($tagsMatchingParams = []) 120: #set($allMatchingParams = []) 121: #if("$!className" != '') 122: ## Class query 123: #set($countSql = ", BaseObject as obj $!fromSql $!filterfrom where obj.name=doc.fullName and obj.className = ? and doc.fullName <> ? $!whereSql $!filterwhere") 124: #set($discard = $sqlParams.addAll(["${className}", "${className}Template"])) 125: #set($discard = $sqlParams.addAll($whereParams)) 126: ## 127: #set($tagsMatchingFiltersFrom = ", BaseObject as obj $!fromSql $!filterfrom") 128: #set($tagsMatchingFiltersWhere = "obj.name=doc.fullName and obj.className = ? and doc.fullName <> ? $!whereSql $!filterwhere") 129: #set($discard = $tagsMatchingParams.addAll(["${className}", "${className}Template"])) 130: #set($discard = $tagsMatchingParams.addAll($whereParams)) 131: ## 132: #set($allMatchingTagsFrom = ", BaseObject as obj $!filterfrom") 133: #set($allMatchingTagsWhere = "obj.name=doc.fullName and obj.className = ? and doc.fullName <> ? $!filterwhere") 134: #set($discard = $allMatchingParams.addAll(["${className}", "${className}Template"])) 135: ## 136: #if($filterParams) 137: #set($discard = $sqlParams.addAll($filterParams)) 138: #set($discard = $tagsMatchingParams.addAll($filterParams)) 139: #set($discard = $allMatchingParams.addAll($filterParams)) 140: #end 141: #else 142: ## Document query 143: #set($countSql = "$!fromSql $!filterfrom where 1=1 $!whereSql $!filterwhere") 144: #set($discard = $sqlParams.addAll($whereParams)) 145: ## 146: #set($tagsMatchingFiltersFrom = "$!fromSql $!filterfrom") 147: #set($tagsMatchingFiltersWhere = "1=1 $!whereSql $!filterwhere") 148: #set($discard = $tagsMatchingParams.addAll($whereParams)) 149: ## 150: #set($allMatchingTagsFrom = "$!filterfrom") 151: #set($allMatchingTagsWhere = "1=1 $!filterwhere") 152: ## 153: #if($filterParams) 154: #set($discard = $sqlParams.addAll($filterParams)) 155: #set($discard = $tagsMatchingParams.addAll($filterParams)) 156: #set($discard = $allMatchingParams.addAll($filterParams)) 157: #end 158: #end 159: 160: ## TagCould matching the current filters 161: #set($tagsMatchingFilters = $xwiki.tag.getTagCountForQuery($tagsMatchingFiltersFrom, $tagsMatchingFiltersWhere, $tagsMatchingParams)) 162: ## TagCloud matching all the documents used by the livetable 163: #set($allMatchingTags = $xwiki.tag.getTagCountForQuery($allMatchingTagsFrom, $allMatchingTagsWhere, $allMatchingParams)) 164: #set($sql = "$countSql $!{orderSql}") 165: #set($items = $xwiki.searchDocuments($sql, $limit, $offset, $sqlParams)) 166: #set($totalItems = $xwiki.countDocuments($countSql, $sqlParams)) 167: #set($returnedItems = $items.size()) 168: 169: 170: ## ============================================== 171: ## json starts 172: ## ============================================== 173: { 174: #if("$!request.sql" == '1') 175: "sql": "$escapetool.javascript($sql)", 176: "countsql": "$escapetool.javascript($countSql)", 177: "params": "$escapetool.javascript($sqlParams)" 178: #end 179: "totalrows": $totalItems, 180: "matchingtags": { 181: #foreach($tag in $tagsMatchingFilters.keySet()) 182: #if($velocityCount > 1) , #end 183: "$escapetool.javascript($tag)": {} 184: #end 185: }, 186: "tags" : [ 187: #foreach($tag in $allMatchingTags.keySet()) 188: #if($velocityCount > 1) , #end 189: {"tag": "$escapetool.javascript($tag)", "count": $allMatchingTags.get($tag)} 190: #end 191: ], 192: "returnedrows": #if($returnedItems < $limit) $returnedItems #else $limit #end, 193: "offset": $mathtool.add($offset, 1), 194: "reqNo": $util.parseInt($request.reqNo), 195: "rows": [ 196: #foreach($item in $items) 197: #set($viewable = $xwiki.hasAccessLevel('view', $context.user, "${context.database}:${item}")) 198: #if($velocityCount > 1) , #end 199: { 200: "doc_viewable" : $viewable, 201: #if(!$viewable) 202: "doc_fullname" : "$escapetool.javascript(${context.database}):$escapetool.javascript(${item})" 203: #else 204: #set($itemDoc = $xwiki.getDocument($item)) 205: #set($fullname = "${itemDoc.wiki}:${itemDoc.space}.${itemDoc.name}") 206: #set($discard = $itemDoc.use($className)) 207: #set($itemUrl = $xwiki.getURL($item)) 208: #set($spaceUrl = $xwiki.getURL("${itemDoc.wiki}:${itemDoc.space}.WebHome")) 209: #if($xwiki.isVirtualMode()) 210: #set($wiki = $itemDoc.wiki) 211: #set($wikiUrl = $xwiki.getURL("${itemDoc.wiki}:Main.WebHome")) 212: #end 213: #set($editUrl = $itemDoc.getURL($itemDoc.defaultEditMode)) 214: #set($copyUrl = $xwiki.getURL('XWiki.CopyDocument', 'view', "sourcedoc=${escapetool.url($fullname)}")) 215: #set($deleteUrl = $itemDoc.getURL('delete')) 216: #set($renameUrl = $itemDoc.getURL('view', 'xpage=rename&step=1')) 217: #set($rightsUrl = $itemDoc.getURL('edit', 'editor=rights')) 218: "doc_name" : "$escapetool.javascript($itemDoc.name)", 219: "doc_fullname" : "$escapetool.javascript($fullname)", 220: "doc_space" : "$escapetool.javascript(${itemDoc.space})", 221: "doc_url" : "$escapetool.javascript(${itemUrl})", 222: "doc_space_url" : "$escapetool.javascript(${spaceUrl})", 223: #if($xwiki.isVirtualMode()) 224: "doc_wiki" : "$escapetool.javascript($wiki)", 225: "doc_wiki_url" : "$escapetool.javascript($wikiUrl)", 226: #end 227: "doc_hasadmin" : $xwiki.hasAdminRights(), 228: "doc_edit_url" : "$escapetool.javascript($editUrl)", 229: "doc_copy_url" : "$escapetool.javascript($copyUrl)", 230: "doc_delete_url" : "$escapetool.javascript($deleteUrl)", 231: "doc_rename_url" : "$escapetool.javascript($renameUrl)", 232: "doc_rights_url" : "$escapetool.javascript($rightsUrl)", 233: "doc_author_url" : "$escapetool.javascript($xwiki.getURL($itemDoc.author))", 234: "doc_date" : "$escapetool.javascript(${xwiki.formatDate($itemDoc.date)})", 235: "doc_title" : "$escapetool.javascript($xwiki.getXMLEncoded(${itemDoc.getDisplayTitle()}))", 236: "doc_author" : "$escapetool.javascript(${xwiki.getLocalUserName($itemDoc.author, false)})", 237: "doc_creationDate" : "$escapetool.javascript(${xwiki.formatDate($itemDoc.creationDate)})", 238: "doc_creator" : "$escapetool.javascript(${xwiki.getLocalUserName($itemDoc.creator, false)})" 239: #foreach($colname in $collist) 240: #if($colname.startsWith('doc.')) 241: #elseif($colname == '_action') , 242: #set($text = $msg.get("${request.transprefix}actiontext")) 243: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${text})" 244: #elseif($colname == '_attachments') , 245: #livetable_getAttachmentsList($itemDoc) 246: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${attachlist})" 247: #elseif($colname == '_avatar') , 248: #livetable_getAvatar($itemDoc) 249: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${avatar})" 250: #elseif($colname == '_images') , 251: #livetable_getImagesList($itemDoc) 252: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${imagesList})" 253: #else , 254: #set($propClassName = "$!{request.get(${colname.concat('_class')})}") 255: #if($propClassName != '') 256: #set($propClass = $xwiki.getDocument($propClassName).getxWikiClass()) 257: #set($discard = $itemDoc.use($propClassName)) 258: #else 259: #set($propClass = $class) 260: #end 261: ## Retrieve the property type as it might be usefull 262: #set($propType = '') 263: #if($listtool.contains($propClass.getPropertyNames(), $colname)) 264: #set($propType = "$!{propClass.get($colname).type}") 265: #end 266: #set($fieldValue = "$!itemDoc.getValue($colname)") 267: #set($fieldDisplayValue = "$!itemDoc.display($colname, 'view')") 268: #if($fieldDisplayValue == '') 269: #set($fieldDisplayValue = $msg.get("${request.transprefix}emptyvalue")) 270: #end 271: #set($fieldUrl = '') 272: ## only retrieve an URL for a DBListClass item 273: #if($propType == 'DBListClass') 274: #set($fieldUrl = $xwiki.getDocument($fieldValue).getURL()) 275: #if($fieldUrl == $xwiki.getURL('Main.WebHome')) 276: #set($fieldUrl = '') 277: #end 278: #end 279: "$escapetool.javascript(${colname})" : "$escapetool.javascript($fieldDisplayValue.replaceFirst($regextool.quote('{{html clean="false" wiki="false"}}'), '').replaceAll("$regextool.quote('{{/html}}')$", ''))", 280: "$escapetool.javascript(${colname})_value" : "$escapetool.javascript(${fieldValue})", 281: "$escapetool.javascript(${colname})_url" : "$escapetool.javascript(${fieldUrl})" 282: ## reset to the default class 283: #set($discard = $itemDoc.use($className)) 284: #end 285: #end 286: #end 287: } 288: #end 289: ]} 290: ## ============================================== 291: ## json ended 292: ## ============================================== 293: #end 294: 295: 296: #** 297: * Get the name of the Property that should be used for a given livetable column. 298: * NOTE the resulting $tableName is safe to use inside SQL queries 299: *# 300: #macro(livetable_getTableName $colname) 301: #set($propClassName = "$!request.get(${colname.concat('_class')})") 302: #if($propClassName != '') 303: #set($propClass = $xwiki.getDocument($propClassName).getxWikiClass()) 304: #else 305: #set($propClass = $class) 306: #end 307: #set($propType = '') 308: #if($listtool.contains($propClass.getPropertyNames(), $colname)) 309: #set($propType = "$!{propClass.get($colname).type}") 310: #end 311: #if($propType == 'NumberClass') 312: #set($numberType = $propClass.get($colname).getProperty('numberType').getValue()) 313: #if($numberType == 'integer') 314: #set($tableName = 'IntegerProperty') 315: #elseif($numberType == 'float') 316: #set($tableName = 'FloatProperty') 317: #elseif($numberType == 'double') 318: #set($tableName = 'DoubleProperty') 319: #else 320: #set($tableName = 'LongProperty') 321: #end 322: #elseif($propType == 'BooleanClass') 323: #set($tableName = 'IntegerProperty') 324: #elseif($propType == 'DateClass') 325: #set($tableName = 'DateProperty') 326: #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 327: #set($tableName = 'LargeStringProperty') 328: #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass') 329: #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 330: #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 331: #if($multiSelect == 1) 332: #if($relationalStorage == 1) 333: #set($tableName = 'DBStringListProperty') 334: #else 335: #set($tableName = 'StringListProperty') 336: #end 337: #else 338: #set($tableName = 'StringProperty') 339: #end 340: #else 341: #set($tableName = 'StringProperty') 342: #end 343: #end 344: 345: #** 346: * Old alias of the #livetable_getTableName macro. 347: * @deprecated since 2.2.3, use {@link #livetable_getTableName} 348: *# 349: #macro(grid_gettablename $colname) 350: #livetable_getTableName($colname) 351: #end 352: 353: 354: 355: #** 356: * List attachments for a document, putting the result as HTML markup in the $attachlist variable. 357: *# 358: #macro(livetable_getAttachmentsList $itemDoc) 359: #set($attachlist = '') 360: #foreach($attachment in $itemDoc.attachmentList) 361: #set($attachmentUrl = $itemDoc.getAttachmentURL($attachment.filename)) 362: #set($attachlist = "${attachlist}<a href='${attachmentUrl}'>$attachment.filename</a><br/>") 363: #end 364: #end 365: 366: #** 367: * Old alias of the #livetable_getAttachmentsList macro. 368: * @deprecated since 2.2.3, use {@link #livetable_getAttachmentsList} 369: *# 370: #macro(grid_attachlist $itemDoc) 371: #livetable_getAttachmentsList($itemDoc) 372: #end 373: 374: 375: 376: #** 377: * List image attachments for a document, putting the result as HTML markup in the $imagesList variable. 378: *# 379: #macro(livetable_getImagesList $itemDoc) 380: #set($imagesList = '') 381: #foreach ($attachment in $itemDoc.attachmentList) 382: #if($attachment.isImage()) 383: #set($attachmentUrl = $itemDoc.getAttachmentURL($attachment.filename)) 384: #set($imagesList = "${imagesList}<img src='${attachmentUrl}' alt='${attachment.filename}' width='50'/><br/>") 385: #end 386: #end 387: #end 388: 389: #** 390: * Old alias of the #livetable_getImagesList macro. 391: * @deprecated since 2.2.3, use {@link #livetable_getImagesList} 392: *# 393: #macro(grid_photolist $itemDoc) 394: #livetable_getImagesList($itemDoc) 395: #end 396: 397: 398: #** 399: * Generate the HTML code for a user avatar, with a fixed 50px width. 400: *# 401: #macro(livetable_getAvatar $itemDoc) 402: #set ($avatar = "#mediumUserAvatar($itemDoc.fullName)") 403: #set ($avatar = $avatar.trim()) 404: #end 405: 406: #** 407: * Old alias of the #livetable_getAvatar macro. 408: * @deprecated since 2.2.3, use {@link #livetable_getAvatar} 409: *# 410: #macro(grid_avatar $itemDoc) 411: #livetable_getAvatar($itemDoc) 412: #end 413: 414: 415: 416: #** 417: * Macro to extend the query to select the properties for the livetable columns. 418: * NOTE $colname is filtered (all characters but [a-zA-Z0-9_.] are removed) before use 419: *# 420: #macro(livetable_addColumnToQuery $colname) 421: #set($filterValue = "$!{request.get($colname)}") 422: #if($colname == 'description') 423: #set($tableAlias = 'dtable') 424: #else 425: #set($tableAlias = $colname) 426: #end 427: ## only safe versions should be used in SQL queries 428: #set($safe_colname = "$!{colname.replaceAll('[^a-zA-Z0-9_.]','')}") 429: #set($safe_tableAlias = "$!{tableAlias.replaceAll('[^a-zA-Z0-9_.]','')}") 430: ## 431: #set($propType = '') 432: #set($propClassName = "$!request.get(${colname.concat('_class')})") 433: #if($propClassName != '') 434: #set($propClass = $xwiki.getDocument($propClassName).getxWikiClass()) 435: #else 436: #set($propClass = $class) 437: #end 438: #if($propClass && $listtool.contains($propClass.getPropertyNames(), $colname)) 439: #set($propType = "$!{propClass.get($colname).type}") 440: #end 441: ## 442: ## Filter values 443: #if("$!filterValue" != '') 444: #set($discard = $tablelist.add($tableAlias)) 445: #if($colname.startsWith('doc.')) 446: #set($whereSql = "${whereSql} and upper(str(${safe_colname.replace('_','.')})) like upper(?)") 447: #set($discard = $whereParams.add("%${filterValue}%")) 448: #elseif($propType == 'NumberClass' || $propType == 'BooleanClass') 449: #livetable_getTableName($colname) 450: #set($fromSql = "${fromSql}, ${tableName} ${safe_tableAlias}") 451: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and ${safe_tableAlias}.value = ?") 452: #set($discard = $whereParams.addAll(["${colname}", $util.parseInt(${filterValue})])) 453: #elseif($propType == 'DateClass') 454: #set($fromSql = "${fromSql}, DateProperty ${safe_tableAlias}") 455: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(str(${safe_tableAlias}.value)) like upper(?)") 456: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 457: #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 458: #set($fromSql = "${fromSql}, LargeStringProperty ${safe_tableAlias}") 459: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(${safe_tableAlias}.value) like upper(?)") 460: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 461: #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass') 462: #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 463: #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 464: #if($multiSelect == 1) 465: #if($relationalStorage == 1) 466: #set($fromSql = "${fromSql}, DBStringListProperty ${safe_tableAlias}") 467: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and ? in elements(${safe_tableAlias}.list)") 468: #set($discard = $whereParams.addAll(["${colname}", "${filterValue}"])) 469: #else 470: #set($fromSql = "${fromSql}, StringListProperty ${safe_tableAlias}") 471: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(${safe_tableAlias}.textValue) like upper(?)") 472: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 473: #end 474: #else 475: #set($fromSql = "${fromSql}, StringProperty ${safe_tableAlias}") 476: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and ${safe_tableAlias}.value = ?") 477: #set($discard = $whereParams.addAll(["${colname}", "${filterValue}"])) 478: #end 479: #else 480: #set($fromSql = "${fromSql}, StringProperty ${safe_tableAlias}") 481: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(${safe_tableAlias}.value) like upper(?)") 482: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 483: #end 484: #end 485: #end 486: 487: #** 488: * Old alias of the #livetable_addColumnToQuery macro. 489: * @deprecated since 2.2.3, use {@link #livetable_addColumnToQuery} 490: *# 491: #macro(grid_addcolumn $colname) 492: #livetable_addColumnToQuery($colname) 493: #end 494: 495: {{/velocity}}
Quick Links
L3D Calendar
Wiki Dashboard
Document Index
Blog
Sandbox