如何在问题选项卡面板中呈现速度模板?

How do I render a velocity template inside a issue tab panel?

我按照这个极其简单的教程 https://bitbucket.org/bhushan154/jira-issue-tab-panel-tutorial/wiki/Home 添加了一个新的问题选项卡面板。它展示了如何使用 stringBuilder 向页面添加简单内容。理想情况下,我想使用速度模板,因为它更容易使用并适当地分离逻辑。我有一个模板文件,其中包含:

<div class="mod-header">
    <h3>$i18n.getText('service-now-tab-panel.label')</h3>
</div>

我试过摆弄这个试图让它适当地显示数据,它没有做任何事情,也没有将内容呈现到问题详细信息页面上。这是控制器,它现在是准系统,因为我需要通过这个障碍。

package com.verys.jira.plugins.panels;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.atlassian.jira.plugin.issuetabpanel.AbstractIssueTabPanel;
import com.atlassian.jira.plugin.issuetabpanel.IssueTabPanel;
import com.atlassian.jira.issue.tabpanels.GenericMessageAction;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.crowd.embedded.api.User;
import java.util.Collections;
import java.util.List;

public class ServiceNowTabPanel extends AbstractIssueTabPanel implements IssueTabPanel
{
    private static final Logger log = LoggerFactory.getLogger(ServiceNowTabPanel.class);

    public List getActions(Issue issue, User remoteUser)
    {
        return Collections.singletonList(new GenericMessageAction("" + issue.getReporter().getDisplayName() + ""));
    }


    public boolean showPanel(Issue issue, User remoteUser)
    {

        return true;
    }
}

在问题选项卡面板上呈现速度模板的文档非常稀少,几乎不存在。如果有人能好心地指出我正确的方向,那就太好了。 这里还有属性文件

<issue-tabpanel key="service-now-tab-panel" name="Service Now Tab Panel" i18n-name-key="service-now-tab-panel.name" class="com.verys.jira.plugins.panels.ServiceNowTabPanel">
  <description key="service-now-tab-panel.description">The Service Now Tab Panel Plugin</description>
  <label key="service-now-tab-panel.label">Plugin Test</label>
  <order>10</order>
  <resource type="velocity" name="view" location="templates/tabpanels/service-now-tab-panel.vm"/>
  <supports-ajax-load>true</supports-ajax-load>
</issue-tabpanel>

为了渲染速度模板,您需要导入 5 个 类。

import com.atlassian.jira.config.properties.APKeys;
import com.atlassian.jira.config.properties.ApplicationProperties;
import com.atlassian.jira.util.VelocityParamFactory;
import com.atlassian.velocity.VelocityManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.config.properties.APKeys;

在您的函数内部,您需要初始化 ComponentAccessor 并获取应用程序属性

ApplicationProperties ap = ComponentAccessor.getApplicationProperties();

获得应用程序属性后"ap",您可以获得 Velocity 管理器所依赖的应用程序密钥。

String baseUrl = ap.getString(APKeys.JIRA_BASEURL);
String webworkEncoding = ap.getString(APKeys.JIRA_WEBWORK_ENCODING);

一旦你有了你的 baseUrl 和你的 webworkEncoding 你就可以继续初始化 VelocityManagerVelocityParamFactory 这两个 类 允许你一个创建管理器,它允许您对模板进行编码或获取模板的主体以及获取每个速度模板的默认参数。

VelocityManager vm = ComponentAccessor.getVelocityManager();
VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();

初始化这些后,您应该创建一个 Map 上下文值,这些上下文值分配给 VelocityParamFactory,允许您获取和设置每个模板的参数。您可以传入值以供稍后在速度模板中使用。

Map context = vp.getDefaultVelocityParams(); 

通过使用您之前设置的地图 context,您可以开始使用 put 方法为上下文变量赋值,稍后在速度模板中使用。

context.put("testVariable", ["Value can be a string or an array or a collection"]);

一旦你假设你想要渲染速度模板,你可以使用 getBody 方法或 getEncodedBody 方法。两者本质上做同样的事情,但工作方式却截然不同。我建议阅读如何使用每一个以及哪个用例对于 or 是正确的。

String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);

您需要设置 templatePathtemplateFilebaseUrlwebWorkEncoding,最后是 context,其中包含您输入的任何参数在上下文中,然后将在速度模板中作为字符串返回到变量 renderedText

根据您在 Jira 中的操作方式和操作,有几种不同的方法可以将其传递给您的视图。我会把它留给你去弄清楚,但是我创建 IssueTabPanel 的目的是像下面这样渲染它:

return Collections.singletonList(new GenericMessageAction( renderedText ));

所以 ti 应该看起来像这样:

ApplicationProperties ap = ComponentAccessor.getApplicationProperties();
String baseUrl = ap.getString(APKeys.JIRA_BASEURL);
String webworkEncoding = ap.getString(APKeys.JIRA_WEBWORK_ENCODING);

VelocityManager vm = ComponentAccessor.getVelocityManager();
VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();

Map context = vp.getDefaultVelocityParams();
context.put("test", "test");

String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);

return Collections.singletonList(new GenericMessageAction(renderedText));

这是我从研究中了解到这是如何工作的。这可能不是最好的方法,也可能不是绝对正确的方法,但这种方法会奏效!如果有人要添加任何内容以使其更清楚、更彻底,请对其进行编辑或将其变成 wiki。