2013-04-09 114 views
0

我一直在试验Jira的自定义发行说明功能,该功能需要编写自定义的.vm文件。这是我第一次与Velocity合作,非常感谢这个小问题:Jira自定义发行说明:Velocity if(..)语句和来自宏的返回值

我有一个简单的宏,检查是$issue有一个名为For Release Notes的自定义字段并获取它的值。基于这个值,我希望Velocity输出问题摘要,或者跳过它。

问题是,即使宏返回truefalse,我也无法获得if()语句来正确处理该值。

宏:

#macro(getForReleaseNotes $issue $customFieldManager) 
    #set ($customFields = $customFieldManager.getCustomFieldObjects($issue.project.getLong("id"), $issue.issueType.getString("id"))) 
    #set($retVal = "false") 
    #foreach($customField in $customFields) 
     #if($customField.name.equals("For Release Notes")) 
      #if($customField.getValue($issue)) #set($retVal = "true") 
      #end 
     #end 
    #end 
    $retVal 
#end 

HTML:

#foreach ($issueType in $issueTypes) 
    #if($issueType.issues.size() > 0) 
     <h2>$textUtils.htmlEncode($issueType.name)</h2> 
     <ul> 
     #foreach ($issue in $issueType.issues) 
      #set($tester = "#getForReleaseNotes($issue $customFieldManager)") 
      #if($tester == "true") 
       <li>[<a href='$requestContext.canonicalBaseUrl/browse/$issue.key'>$issue.key</a>] - $textUtils.htmlEncode($issue.summary)</li> 
      #else 
       <li> Value for macro: #getForReleaseNotes($issue $customFieldManager), $tester </li> 
      #end 
     #end 
    </ul> 
    #end 
#end 

我曾尝试if()内的数量的组合,从if($tester.equals("getForReleaseNotes(..))"),简单地if("getForReleaseNotes(..))

现在,该宏实际工作并返回$retVal = false(或它是$retVal = "false",这是否有所作为?),当问题没有此属性/属性设置为false。否则,宏将同样返回true。这个问题只是让if(..)声明正确评估,因为截至目前它说我传入它的所有内容是false,并且问题从未打印过。

任何有关这个问题的帮助将不胜感激。谢谢阅读。

回答

0

我发现了这个问题的解决方案,但我不相信它是最有效的,因为它需要循环两遍问题列表。

第一个循环检查是否存在给定问题类型的问题,并且这些问题中是否有任何问题标记为“对于发布说明”。

如果第一个循环确实发现标记为“发行说明”的问题,它将转到第二个循环。第二个循环然后提取标记为“发行说明”的该问题类型内的所有问题的详细信息。

注意:我添加了另一个名为“Release Note”的字段,因此用户可以更好地控制生成的发行说明中显示的内容。如果该字段未设置,则默认使用问题摘要。

#if($issueType.issues.size() > 0) 
     #set($flag = "") 
     #foreach ($issue in $issueType.issues) 
      #set ($customFields = $customFieldManager.getCustomFieldObjects($issue.project.getLong("id"), $issue.issueType.getString("id"))) 
      #foreach($customField in $customFields) 
       #if($customField.name.equals("For Release Notes")) 
        #if($customField.getValue($issue)) 

         #if($flag==$textUtils.htmlEncode($issueType.name)) 

         #else      
          <h2>$textUtils.htmlEncode($issueType.name)</h2> 
          #set($flag = $textUtils.htmlEncode($issueType.name)) 
         #end 

        #end 
       #end 
      #end 
     #end 

     ## Go through the list again, displaying all issues that are "for release notes." 
     <ul>  
     #foreach ($issue in $issueType.issues) 
      #set ($customFields = $customFieldManager.getCustomFieldObjects($issue.project.getLong("id"), $issue.issueType.getString("id"))) 
      #foreach($customField in $customFields) 
       #if($customField.name.equals("For Release Notes")) 
        #if($customField.getValue($issue)) 

         ## If the issue has the "Release Note" field set, use that, otherwise use the summary 
         #foreach($customField in $customFields) 
          #if($customField.name.equals("Release Note")) 
           #if($customField.getValue($issue)) 
            <li>[<a href='$requestContext.canonicalBaseUrl/browse/$issue.key'>$issue.key</a>] - $textUtils.htmlEncode($customField.getValue($issue))</li> 
           #else 
            <li>[<a href='$requestContext.canonicalBaseUrl/browse/$issue.key'>$issue.key</a>] - $textUtils.htmlEncode($issue.summary)</li> 
           #end 
          #end 
         #end 

        #end 
       #end 
      #end 
     #end 
     </ul>  
    #end 
0

http://velocity.apache.org/engine/devel/vtl-reference-guide.html具有的速度条件的一些例子,并且你发现,他们并不完全明显。

+0

是的,你说得对,感谢分享链接。对于接受类似项目的其他人,我还建议查看Jira问题API:https://docs.atlassian.com/jira/latest/com/atlassian/jira/issue/Issue.html – Mac 2013-07-26 11:54:03

0

创建以下宏,只需从您想要包含问题摘要的vm文件中的任何位置调用它即可。

#macro(myMacro) 
#set($customFieldObj = $customFieldManager.getCustomFieldObjectByName('For Release Notes')) 
#set($customFieldValue = $issue.getCustomFieldValue($customFieldObj)) 
## next line only makes sure the 2 variables are not null 
#if($customFieldObj && $customFieldValue) 
## now output the issue summary 
$issue.getSummary() 
#end 
#end 

按照API,getCustomFieldObjectByName将返回使用给定的名称的第一个自定义字段的对象,所以如果你有一个名为“有关发行说明”一个以上的自定义字段,你想尝试的方法getCustomFieldObject并传递该字段的长ID作为参数。