Jira自定义发布说明:Velocity if(.)宏的语句和返回值



我一直在尝试Jira的自定义发行说明特性,这需要编写一个自定义的.vm文件。这是我第一次使用Velocity,如果你能帮我解决这个小问题,我将不胜感激:

我有一个简单的宏,检查$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,并且问题从未被打印。

在这个问题上任何帮助都将是非常感激的。谢谢阅读

我已经找到了这个问题的解决方案,尽管我不认为它是最有效的,因为它需要循环遍历问题列表两次。

第一个循环检查是否存在给定问题类型的问题,以及是否有任何这些问题被标记为"For Release Notes"。

如果第一个循环确实找到了一个标有"For Release Notes"的问题,它将移动到第二个循环。然后,第二个循环提取该问题类型中标记为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

http://velocity.apache.org/engine/devel/vtl-reference-guide.html有一些Velocity中的条件示例,正如您所发现的,它们并不完全明显。

创建以下宏,并在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将返回带有给定名称的第一个自定义字段对象,所以如果你有多个名为"For Release Notes"的自定义字段,你想尝试getCustomFieldObject方法并将该字段的长id作为参数传递。

最新更新