如何在问题选项卡面板中渲染速度模板?

时间:2015-05-24 23:09:25

标签: java velocity jira-plugin atlassian-plugin-sdk

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

1 个答案:

答案 0 :(得分: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&amp;您的webworkEncoding然后您可以继续初始化VelocityManager&amp; VelocityParamFactory这两个类允许您创建一个管理器,它允许您对模板进行编码或获取模板的主体,以及获取每个速度模板的默认参数。

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

初始化完成后,您应该创建一个Map的上下文值,这些值分配给VelocityParamFactory,以便您获得&amp;设置每个模板的参数。您可以在其中传递值,以便稍后在速度模板中使用。

Map context = vp.getDefaultVelocityParams(); 

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

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

如果您想要渲染速度模板,则可以使用getBody方法或getEncodedBody方法。两者基本上做同样的事情,但工作方式非常不同。我建议阅读如何使用每一个以及哪个用例对于其中任何一个都是正确的。

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

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

取决于&amp;你在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));

这是我对研究如何发挥作用的理解。它可能不是最好的方法,可能不是绝对正确的方法,但这种方法会起作用!如果有人添加任何添加内容以使其更清晰,更彻底,请编辑它或将其转换为维基。