0

我一直在尝试使用 Jira 的自定义发行说明功能,这需要编写自定义 .vm 文件。这是我第一次与 Velocity 合作,非常感谢您解决这个小问题:

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

问题是,即使宏返回trueor 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(), from if( $tester.equals("getForReleaseNotes(..))" ), to中尝试了许多组合if( "getForReleaseNotes(..) )

现在,当问题没有此属性/属性设置$retVal = false为. 否则,宏同样会返回。问题只是让声明正确评估,因为到目前为止,它说我传递给它的所有内容都是,并且问题永远不会被打印出来。$retVal = "false"falsetrueif(..)false

对此问题的任何帮助将不胜感激。谢谢阅读。

4

3 回答 3

0

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

第一个循环检查是否存在给定问题类型的问题,以及是否有任何问题被标记为“用于发行说明”。

如果第一个循环确实找到了标记为 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
于 2013-07-25T14:33:03.057 回答
0

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

于 2013-07-25T20:41:37.890 回答
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 将返回具有给定名称的第一个自定义字段对象,因此如果您有多个名为“For Release Notes”的自定义字段,您想尝试方法 getCustomFieldObject 并将字段的 Long id 作为范围。

于 2014-03-24T19:20:11.690 回答