我一直在尝试使用Jira的自定义发行说明功能,该功能需要编写自定义.vm文件。这是我第一次与Velocity合作,非常感谢这个小问题:
我有一个简单的宏,检查是$issue
有一个名为For Release Notes
的自定义字段并获取其值。基于此值,我希望Velocity输出问题摘要,或跳过它。
问题是即使宏返回true
或false
,我也无法获得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"
并且这会产生不同吗?)当问题没有此属性/属性设置为{{1 }}。否则,宏将同样返回false
。问题只是让true
语句正确评估,因为现在它说我传入的所有内容都是if(..)
,问题永远不会被打印出来。
对此问题的任何帮助将不胜感激。谢谢你的阅读。
答案 0 :(得分:0)
我找到了解决这个问题的方法,虽然我认为它不是最有效的,因为它需要循环遍历问题列表两次。
第一个循环检查是否存在给定问题类型的问题,以及是否有任何问题标记为“For Release Notes”。
如果第一个循环确实发现标记为“发行说明”的问题,则会移至第二个循环。然后,第二个循环将提取该问题类型中标记为“发行说明”的所有问题的详细信息。
注意:我添加了另一个名为“发行说明”的字段,因此用户可以更好地控制生成的发行说明中显示的内容。如果未设置该字段,则默认使用问题摘要。
#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
答案 1 :(得分:0)
http://velocity.apache.org/engine/devel/vtl-reference-guide.html在Velocity中有一些条件示例,正如您所发现的那样,它们并不完全明显。
答案 2 :(得分: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将返回带有给定名称的第一个自定义字段对象,因此,如果您有多个名为&#39; For Release Notes&#39;的自定义字段,您想尝试方法getCustomFieldObject并将字段的Long id作为参数传递。