1

我按照这个非常简单的教程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>
4

1 回答 1

2

为了渲染速度模板,您需要导入 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你就可以开始初始化VelocityManager&VelocityParamFactory这两个类允许你创建一个管理器,它允许你对模板进行编码或获取模板的主体,以及获取每个速度模板的默认参数。

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);

您需要设置templatePath, templateFile, baseUrl, webWorkEncoding, 最后设置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));

这是我从研究中对它是如何工作的理解。这可能不是最好的方法,也可能不是绝对正确的方法,但这种方法会奏效!如果有人对此有任何补充以使其更加清晰和彻底,请对其进行编辑或将其转换为维基。

于 2015-05-25T00:51:56.147 回答